3

当用户单击主面板时,我想失去对 JTextField 的关注。

setFocusable(true)对我不起作用。

如果我单击主面板,JTextField 仍然是焦点,您可以输入内容。

注意:我的 JFrame 设置为可聚焦(true)。

4

4 回答 4

5

我认为既然你想把注意力集中在点击主面板上,你应该MouseListener为你实现一个简单的工作。再次,因为面板(主面板)被添加到JFrame或者更确切地说它被设置为内容面板,这就是setFocusable(true);应该调用的地方。下面的代码应该解决问题:

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

请注意,这Focus是我的班级名称,JPanel在将其添加到JFrame.

于 2013-03-11T10:46:59.783 回答
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();
            }
        });
    }
}
于 2013-03-11T10:49:55.943 回答
2

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

YourContainerPanel.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        JComponent clicked = (JComponent)e.getSource();
        clicked.requestFocusInWindow();
    }
});
于 2014-09-22T07:22:42.090 回答
0

试试这个

this.getParent().requestFocus()
于 2013-10-05T12:24:21.540 回答