在加载面板时关注组件

时间:2013-03-05 12:09:08

标签: java swing focus jpanel

我有一个框架,我将面板加载到。它工作正常,但加载时没有任何焦点。按下选项卡没有帮助。我必须使用鼠标按文本字段。 我尝试过:jtextfield1.requestFocus();jtextfiel1.requestFocusInWindow();但它不起作用。

我做错了什么?

JPanel中的构造函数:

public OpretOpdater(BrugerHandler brugerHandler, ReklamationHandler reklamationsHandler) {
    initComponents();
    jTextFieldOrdnr.requestFocusInWindow();
    this.brugerHandler = brugerHandler;
    this.rekH = reklamationsHandler;
    startUp();
}

将面板放在GUI中的框架中:

public static void opret(ReklamationHandler reklamationHandler) {
    rHandler = reklamationHandler;
    SwingUtilities.invokeLater(opret);
}

static Runnable opret = new Runnable() {
    @Override
    public void run() {
        JFrame f = jframe;
        f.getContentPane().removeAll();
        JPanel opret = new OpretOpdater(bHandler, rHandler);
        f.getContentPane().add(opret);
        f.pack();
        f.setLocationRelativeTo(null);
    }
};

2 个答案:

答案 0 :(得分:2)

只有在容器上显示/显示组件或调用requestFocusInWindow()并且所有组件都添加到容器中或者它无法正常工作时,才应调用pack()

另请务必在Event Dispatch Thread上创建Swing组件。如果您还没有阅读过Concurrency in Swing

我之所以提到上述原因,不是在EDT上创建和操作Swing组件会导致代码中的随机伪像。即焦点没有给予等等。

创建以下代码是为了说明在组件可见之前调用requestFocusInWindow的方式不起作用,但在其可见的工作符合预期后调用它。

另请注意,删除SwingUtilities阻止将导致requestFocusInWindow无法按预期工作(即我们可能会得到关注或不依赖于我们的运气:P):

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JTextField f1 = new JTextField(10);

        JTextField f2 = new JTextField(10);

        //f2.requestFocusInWindow(); //wont work (if uncomment this remember to comment the one after setVisible or you wont see the reults)

        JButton b = new JButton("Button");

        JPanel p = new JPanel();

        p.add(f1);//by default first added component will have focus
        p.add(f2);
        p.add(b);

        frame.add(p);

        //f2.requestFocusInWindow();//wont work
        frame.pack();//Realize the components.
        //f2.requestFocusInWindow();//will work
        frame.setVisible(true);

        f2.requestFocusInWindow();//will work
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {//if we remove this block it wont work also (no matter when we call requestFocusInWindow)
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

我建议阅读How to Use the Focus Subsystem

答案 1 :(得分:1)

通常,在创建字段时指定要对焦的字段并且在框架变为可见时通过添加请求焦点来分隔代码时,这很好。

看看Dialog Focus哪个解决方案在这种情况下也适用。使用这种方法,您的代码将如下所示:

JTextField f2 = new JTextField(10);
f2.addAncestorListener( new RequestFocusListener() );