【问题标题】:Nothing is displayed when I add a JTextField添加 JTextField 时不显示任何内容
【发布时间】:2011-12-17 23:27:30
【问题描述】:

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

主类:

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!"));
        }
    }

【问题讨论】:

  • 不是我最好的语言,但我认为你的构造函数是私有的?
  • 构造函数在 Java 中总是公开的(你不需要自己手动指定)。无论如何,这不是问题,多年来我一直在制作构造函数,没有任何私有/公共添加。
  • @Hidde:构造函数在 Java 中并不总是公开的。它们的可见性规则与方法的可见性规则相同。如果你没有可见性修饰符,构造函数是包保护的,而不是公共的。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 这很奇怪,有时您的代码会按照您的预期给出正确的输出,但有时代码中没有任何变化。因此,您的 UI 外观和感觉似乎与它有关。

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


【解决方案1】:

始终在事件调度线程中使用 Swing 组件。 main方法的整个代码应该被包裹到

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

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

【讨论】:

  • 拜托,请多多指教。
  • @ProphesyAwaits:我在答案中添加了两个有用的链接
  • 谢谢,这是我忘记的部分。
【解决方案2】:
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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2020-11-10
    • 2012-04-12
    • 2019-11-11
    • 2017-09-25
    相关资源
    最近更新 更多