添加JTextField时没有显示任何内容

时间:2011-12-17 23:27:30

标签: java swing user-interface jtextfield event-dispatch-thread

如果我将代码从第一个示例更改为第二个示例,则不会显示任何内容(请参阅屏幕截图:

主要课程:

public class Main extends JTabbedPane {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        JFrame.setDefaultLookAndFeelDecorated(true);

        JFrame f = new JFrame("Math");
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        int x = dim.getWidth() > 800 ? (int) (dim.getWidth() / 2 - 400) : 0;
        int y = dim.getWidth() > 800 ? (int) (dim.getHeight() / 2 - 300) : 0;
        f.setBounds(x, y, 800, 600);
        f.setResizable(false);
        f.setContentPane(new Main());
    }

    Main() {
        super();
        addTab("Pythagoras", new Pythagoras());
    }
}

Pythagoras(截图1):

public class Pythagoras extends JPanel{

    Pythagoras() {
        super();
        setLayout(new FlowLayout());
        JTextField j = new JTextField("Hi :)");
        add(j);
    }
}

Pythagoras(截图2):

public class Pythagoras extends JPanel{

    Pythagoras() {
        super();
        setLayout(new FlowLayout());
    }
}

Pythagoras(截图3):

public class Pythagoras extends JPanel{

        Pythagoras() {
            super();
            setLayout(new FlowLayout());
    add( new JLabel("This works!"));
        }
    }

Screenshot 1 Screenshot 2 Screenshot 3

2 个答案:

答案 0 :(得分:2)

始终在事件派发线程中使用Swing组件。主要方法的整个代码应该包含在

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        // original code here
    }
});

此更改使我的测试中的所有内容都显示为预期。

阅读http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.htmlhttp://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

另外,请注意,只接受String作为参数的JTextField构造函数会创建一个文本字段,其中0为列数。

答案 1 :(得分:0)

JFrame f = new JFrame("Math");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int x = dim.getWidth() > 800 ? (int) (dim.getWidth() / 2 - 400) : 0;
int y = dim.getWidth() > 800 ? (int) (dim.getHeight() / 2 - 300) : 0;
f.setContentPane(new Main());
f.setBounds(x, y, 800, 600);
f.setResizable(false);
f.setVisible(true);