0

我有一个框架,我将面板加载到其中。它工作正常,但加载时没有焦点。按标签没有帮助。我必须使用鼠标按下文本字段。我试过了: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);
    }
};
4

2 回答 2

2

requestFocusInWindow()仅当组件在容器上可见/显示时或在pack()已调用并且所有组件都已添加到容器中时才应调用,否则它将无法工作。

另外请务必在Event Dispatch Thread上创建 Swing 组件。如果您还没有阅读过 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();
            }
        });
    }
}

我建议阅读如何使用焦点子系统

于 2013-03-05T12:32:35.623 回答
1

通常最好在创建字段时指出您希望获得焦点的字段,而不是在框架变得可见时通过添加请求焦点来分隔代码。

看看Dialog Focus,它有一个同样适用于这种情况的解决方案。使用这种方法,您的代码将如下所示:

JTextField f2 = new JTextField(10);
f2.addAncestorListener( new RequestFocusListener() );
于 2013-03-05T16:39:58.393 回答