1

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

主类:

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());
    }
}

毕达哥拉斯(截图 1):

public class Pythagoras extends JPanel{

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

毕达哥拉斯(截图 2):

public class Pythagoras extends JPanel{

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

毕达哥拉斯(截图 3):

public class Pythagoras extends JPanel{

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

截图 1截图 2截图 3

4

2 回答 2

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 #线程

此外,请注意,仅将 String 作为参数的 JTextField 构造函数会创建一个以 0 作为列数的文本字段。

于 2011-12-18T00:22:24.573 回答
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);
于 2011-12-18T09:29:38.430 回答