点击面板时失去JTextField的焦点

4

当用户单击主面板时,我希望使JTextField失去焦点。

setFocusable(true) 对我无效。

即使我在单击主面板时,JTextField 仍然保持焦点并且您可以输入文本。

注意:我的JFrame已设置为可获得焦点(true)。


2
尝试向面板添加鼠标监听器,并在调用mouseClicked时调用requestFocusInWindow - MadProgrammer
4个回答

5

我认为,既然你想要在单击主面板时获得焦点,你应该实现一个简单的MouseListener来为你完成这项工作。同样,由于面板(主面板)被添加到JFrame或者说被设置为内容窗格,那么setFocusable(true);应该被调用的地方就是那里。下面的代码应该解决这个问题:

       mainPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseReleased(e);
                Focus.this.grabFocus();
            }
        });

请注意,Focus 是我创建的类名,在添加到 JFrame 之前,我将其扩展为 JPanel

这个可以工作,谢谢。现在我的KeyListener在我输入一些键时没有触发,有什么解决方法吗? - Niklas
你在说哪些键? - tmwanik
键盘上的按键,例如aklsdfjelwötqew1234167876978raf。 - Niklas
我认为这是一个内部错误,是由我的源代码引起的,而不是Jlibs的问题。无论如何,还是谢谢。 - Niklas
1
细节注意事项:a)无论您是否想在 mouseClicked 中获得焦点(与更常见的 mousePressed 不同),要调用的超级方法不是 not released b)适配器已经记录为空实现,因此根本不需要调用 super c)不需要显式引用任何外部类,mouseEvent 携带其源。 - kleopatra
1
根据文档(http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#grabFocus()),此方法旨在供焦点实现使用。客户端代码不应使用此方法;而应使用`requestFocusInWindow()`。 - David Kroukamp

3
注意:我的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();
            }
        });
    }
}

1
细节问题:a)调用requestFocus方法之一,而不是两者都调用b)在mousePressed中不需要invokeLater(我们在edt上,并且可能没有其他事件等待我们等待)c)不需要设置FlowLayout,因为我们都知道它是默认值 :-) - kleopatra

2

虽然上述不同的方法对我来说都不起作用,这意味着焦点仍然在JButton上,但我发现e.getSource()可以设置组件焦点

YourContainerPanel.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        JComponent clicked = (JComponent)e.getSource();
        clicked.requestFocusInWindow();
    }
});

请不要只发布代码答案,还要解释您的代码。 - Raidri

0

试试这个

this.getParent().requestFocus()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接