Java JFrame中只显示一个组件

Java JFrame中只显示一个组件,java,swing,jframe,jpanel,layout-manager,Java,Swing,Jframe,Jpanel,Layout Manager,作为对加密项目的改进,我决定制作一个小GUI。然而,当我运行程序时,屏幕上只显示顶部元素,它似乎掩盖了其他元素,尽管我无法检查。有人知道为什么吗 除了e()和d()之外,下面是我的全部代码,因为它们只是对字符串进行加密,与GUI无关。我还想找到一种方法,在不编辑加密的情况下尽可能地加快速度,使其尽可能好 @SuppressWarnings("serial") public class EncDecExample extends JFrame implements ActionListener {

作为对加密项目的改进,我决定制作一个小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中,则它最终将位于
中心。中心只能显示一个零部件

为了立竿见影,我建议:

f.add(top, BorderLayout.PAGE_START);
f.add(mid);
f.add(bot, BorderLayout.PAGE_END);
其他要点。
  • 取出
    f.setSize(500500)setVisible(true)
  • 为了更好地结束GUI,请更改
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    f.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
  • in.setVisible(true)除了框架本身,取出这些。将组件添加到顶级容器并使该容器本身可见时,该组件将自动变为可见
  • 更改
    公共类EncDecExample将JFrame扩展为
    公共类EncDecExample

    此代码保留对帧的引用,这是正确的方法

  • 作为旁白。你的问题是什么?你可能会感兴趣。@Pshemo我在问我的问题之前看了它,它似乎不起作用。不过谢谢。:)啊,谢谢。我想知道我是否需要扩展JFrame,因为我在发布问题之前看到的一个教程中看到了它,但它没有意义。顺便说一句,回答得很好。出于好奇,我是否可以使用其他布局,这样我就不必添加
    BorderLayout.layout
    bit?是的,有各种布局。当然
    FlowLayout
    GridLayout
    具有正确的构造函数。但我对“所以我不必”这句话有点怀疑。它最终会产生一个可怕的GUI。我明白你为什么会如此敏感。。。它只是有助于提高代码的可读性(这是一个词吗?),这样我就可以对该语言有更多的了解。@NickHartley它只是有助于提高代码的可读性,而不是选择不合适的布局和提供糟糕的用户体验
    FlowLayout
    GridLayout
    是非常糟糕的布局管理器,在极少数情况下有用
    BorderLayout
    GridBagLayout
    要好得多。