JFrame中只显示一个组件

时间:2012-12-14 15:19:09

标签: java swing jframe jpanel layout-manager

作为对我的加密项目的改进,我决定制作一个小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()));
        }
    }
}

1 个答案:

答案 0 :(得分:10)

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

立即生效,我建议:

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

其他要点。

  1. 取出f.setSize(500, 500);并在pack()
  2. 之前立即致电setVisible(true)
  3. 要更好地结束GUI,请将f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);更改为f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  4. in.setVisible(true);除了框架本身外,请将它们拿出来。当组件添加到顶级容器并且该容器本身可见时,该组件将自动变为可见。
  5. public class EncDecExample extends JFrame更改为public class EncDecExample
    此代码保留对框架的引用,这是正确的方法。< / LI>