首页  >  文章  >  Java  >  为什么使用 BorderLayout 在 JFrame 中隐藏 GUI 组件?

为什么使用 BorderLayout 在 JFrame 中隐藏 GUI 组件?

Patricia Arquette
Patricia Arquette原创
2024-11-07 16:59:03261浏览

Why are GUI components obscured in a JFrame using BorderLayout?

GUI 组件在 JFrame 中被遮挡

正如一位用户所观察到的,GUI 代码中的问题导致所有组件无法正确显示。具体来说,顶部面板遮挡了其他面板。

原因:

此问题是由于 JFrame 中使用的 BorderLayout 布局而出现的。默认情况下,添加的没有特定约束的组件会自动放置在 CENTER 位置,这样只允许一个组件可见。

解决方案:

修复此布局问题,更改代码如下:

f.add(top, BorderLayout.PAGE_START); // Add top panel to PAGE_START position
f.add(mid); // Add mid panel with default BorderLayout.CENTER constraint
f.add(bot, BorderLayout.PAGE_END); // Add bot panel to PAGE_END position

额外优化:

  1. 移除 f.setSize(500, 500);并在 setVisible(true) 之前调用 pack() 以获得更好的适配窗口。
  2. 使用 f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);正确处理 GUI 窗口。
  3. 删除 in.setVisible(true);和 out.setVisible(true);因为组件在添加到 JFrame 时会自动可见。
  4. 将公共类 EncDecExample 扩展为 JFrame 公共类 EncDecExample,以实现更好的代码组织。

完整优化代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;

public class EncDecExample 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) {
        f.setSize(500, 500);
        f.setResizable(false);
        out.setEditable(false);
        out.setText("Hello");
        top.add(in);
        mid.add(enc);
        mid.add(dec);
        bot.add(out);
        f.add(top, BorderLayout.PAGE_START);
        f.add(mid);
        f.add(bot, BorderLayout.PAGE_END);
        f.pack();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == enc && !in.getText().equalsIgnoreCase("")) {
            out.setText(e(in.getText(), 5));
        } else if (e.getSource() == dec && !in.getText().equalsIgnoreCase("")) {
            out.setText(d(in.getText()));
        }
    }
}

以上是为什么使用 BorderLayout 在 JFrame 中隐藏 GUI 组件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn