【问题标题】:Only one component shows up in JFrameJFrame 中只显示一个组件
【发布时间】:2012-12-02 14:49:32
【问题描述】:

作为对我的加密项目的改进,我决定制作一个小 GUI。但是,当我运行程序时,屏幕上只显示了顶部元素,并且它似乎掩盖了其他元素,尽管我无法检查。有谁知道为什么?

除了e()d() 之外,下面是我的全部代码,因为它们只是加密字符串并且与GUI 无关。我还想要一种在不编辑加密的情况下尽可能加快速度的方法,只是为了让它尽可能好。

@SuppressWarnings("serial")
public class EncDecExample extends JFrame implements ActionListener {
    final static JPanel top = new JPanel();
    final static JPanel mid = new JPanel();
    final static JPanel bot = new JPanel();
    final static JTextField in = new JTextField(10);
    final static JTextField out = new JTextField(10);
    final static JButton enc = new JButton("Encrypt");
    final static JButton dec = new JButton("Decrypt");
    final static JFrame f = new JFrame("Encryption/decryption");

    public static void main(String[] args) {
//        EncDec.exampleImplement();

        f.setSize(500, 500);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        out.setEditable(false);
        out.setText("Hello");
        in.setVisible(true);
        out.setVisible(true);
        enc.setVisible(true);
        dec.setVisible(true);
        top.add(in);
        mid.add(enc);
        mid.add(dec);
        bot.add(out);
        f.add(top);
        f.add(mid);
        f.add(bot);
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == enc && !in.getText().equalsIgnoreCase("")) {
            out.setText(EncDec.e(in.getText(), 5));
        }
        else if(e.getSource() == dec && !in.getText().equalsIgnoreCase("")) {
            out.setText(EncDec.d(in.getText()));
        }
    }
}

【问题讨论】:

  • This tutorial 您可能会感兴趣。
  • @Pshemo 我在问我的问题之前看过它,它似乎不起作用。不过谢谢。 :)

标签: java swing jframe jpanel layout-manager


【解决方案1】:

JFrame 的内容窗格有一个BorderLayout。如果您将组件放置在没有约束的 BL 中,它最终会出现在 CENTER 中。中心只能显示一个组件。

为了立竿见影,我建议:

f.add(top, BorderLayout.PAGE_START);
f.add(mid);
f.add(bot, BorderLayout.PAGE_END);

其他要点。

  1. 取出f.setSize(500, 500); 并在setVisible(true) 之前立即致电pack()
  2. 为了更好地结束 GUI,请将 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 更改为 f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  3. in.setVisible(true); 除了框架本身,把这些都拿出来。当组件被添加到顶级容器并且该容器本身变为可见时,组件会自动变为可见。

  4. public class EncDecExample extends JFrame 更改为
    public class EncDecExample
    此代码保留对框架的引用,这是正确的方法。

【讨论】:

  • 啊,谢谢。我想知道是否需要扩展 JFrame,因为我在发布问题之前看到的教程中看到了它,但这没有意义。顺便说一句,答案很好。
  • 出于好奇,有没有我可以使用的其他布局,所以我不必添加BorderLayout.LAYOUT 位?
  • 是的,有多种布局。当然FlowLayoutGridLayout 使用正确的构造函数。但我有点怀疑这种“所以我不必”的东西。它最终会产生一个可怕的 GUI。
  • 我明白你为什么会怀疑......它只是有助于提高代码的可读性(这是一个词吗?),所以我可以了解更多关于语言的信息。
  • @NickHartley 它只是有助于提高代码的可读性,没有理由选择不合适的布局并提供糟糕的用户体验。 FlowLayoutGridLayout 恕我直言,是非常糟糕的 LayoutManager,在极少数情况下很有用。 BorderLayoutGridBagLayout 好多了。
猜你喜欢
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多