当用户单击主面板时,我想失去对 JTextField 的关注。
setFocusable(true)
对我不起作用。
如果我单击主面板,JTextField 仍然是焦点,您可以输入内容。
注意:我的 JFrame 设置为可聚焦(true)。
当用户单击主面板时,我想失去对 JTextField 的关注。
setFocusable(true)
对我不起作用。
如果我单击主面板,JTextField 仍然是焦点,您可以输入内容。
注意:我的 JFrame 设置为可聚焦(true)。
我认为既然你想把注意力集中在点击主面板上,你应该MouseListener
为你实现一个简单的工作。再次,因为面板(主面板)被添加到JFrame
或者更确切地说它被设置为内容面板,这就是setFocusable(true);
应该调用的地方。下面的代码应该解决问题:
mainPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseReleased(e);
Focus.this.grabFocus();
}
});
请注意,这Focus
是我的班级名称,JPanel
在将其添加到JFrame
.
注意:我的 JFrame 设置为可聚焦(true)。
例如
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class JPanelAndFocus {
private JFrame frm = new JFrame("JPanel_And_Focus");
private JPanel panel = new JPanel();
private JTextField one = new JTextField(10);
private JTextField two = new JTextField(10);
private JTextField three = new JTextField(10);
public JPanelAndFocus() {
//panel.setLayout(new FlowLayout());
panel.add(one);
panel.add(two);
panel.add(three);
panel.setFocusable(true);
panel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
//delayed should be important for events from DocumentListener / InputMask
@Override
public void run() {
//panel.requestFocus();
panel.requestFocusInWindow();
}
});
}
});
panel.setPreferredSize(new Dimension(400, 100));
frm.add(panel);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setLocation(400, 300);
frm.pack();
frm.setVisible(true);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//one.requestFocus();
one.requestFocusInWindow();
}
});
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JPanelAndFocus jpaf = new JPanelAndFocus();
}
});
}
}
虽然上面引用的不同方法对我不起作用,这意味着焦点仍然在 JButton 上,但我发现 e.getSource() 可以正确设置组件焦点
YourContainerPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JComponent clicked = (JComponent)e.getSource();
clicked.requestFocusInWindow();
}
});
试试这个
this.getParent().requestFocus()