当用户单击主面板时,我希望使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
是我创建的类名,在添加到 JFrame
之前,我将其扩展为 JPanel
。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()
mouseClicked
时调用requestFocusInWindow
。 - MadProgrammer