ユーザーがメインパネルをクリックしているときに、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()