java - JFrame 中只显示一个组件

标签 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()));
        }
    }
}

最佳答案

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); 除了frame本身,把这些去掉。将组件添加到顶级容器时,该组件会自动变为可见,并且该容器本身也变为可见。

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

关于java - JFrame 中只显示一个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881444/

相关文章:

java - 使用 Arquillian 进行黑盒测试

java - 如何在 JFrame 加载时隐藏 JPanel?

java - JComboBoxes - 使用 setModel 访问对象(在 Swing 中)

java - 计时器类通过 JFrame 移动 JLabel!为什么 JLabel 文本不能可变?

java - J8583: ISO8583 MessageFactory 没有消息类型 "ffffff50"的解析指南

java - 限制javapackager添加的模块

java - 数据插入和可用之间存在滞后

java - 为什么这个 shutdownhook 不起作用?

java - 如何在 swing java jframe 中制作 15000 个 jbutton 的数组,并使用按钮对每一行设置操作?

java - 如何将控制台输出打印到 JTextArea?