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);
其他要点。
- 取出
f.setSize(500, 500);
并在setVisible(true)
之前调用pack()
setVisible(true)
- 要更好地结束GUI,请更改
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
到f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-
in.setVisible(true);
除了框架本身,取出这些。 当组件添加到顶级容器并且该容器本身可见时,该组件自动变为可见。 - 更改
public class EncDecExample extends JFrame
至
public class EncDecExample
此代码保留对框架的引用,这是正确的方法。
setBorder(null);
只需为你使用的jpanel设置空边框,并使用你喜欢的任何布局。