JFrame中只显示一个组件

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

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() setVisible(true)
  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
    此代码保留对框架的引用,这是正确的方法。
 setBorder(null); 

只需为你使用的jpanel设置空边框,并使用你喜欢的任何布局。