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 に答える