Java GUI设置窗口实现及WindowListener冗余代码优化问询
Java GUI设置窗口实现与代码优化
一、实现设置窗口的两种方案
1. 用独立类封装(优先推荐)
把设置窗口做成单独的SettingsWindow类(继承JDialog或JFrame),这种方式能让代码结构更清晰,主窗口和设置窗口的逻辑完全分开,后续修改设置界面时不用动主类代码,维护起来更轻松。
比如你的主按钮点击逻辑可以改成:
settingsB.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showSettingsDialogue(); } });
SettingsWindow类里专门处理滑块、文本框这些控件的布局和逻辑,示例代码如下:
public class SettingsWindow extends JDialog { public SettingsWindow(Frame parent) { super(parent, "设置", true); // 模态对话框,用户必须处理完设置窗口才能回到主窗口 // 添加音量滑块 JSlider volumeSlider = new JSlider(0, 100, 50); add(volumeSlider, BorderLayout.NORTH); // 添加用户名输入框 JTextField nameField = new JTextField("请输入用户名"); add(nameField, BorderLayout.CENTER); // 设置窗口大小与居中显示 setSize(350, 250); setLocationRelativeTo(parent); } }
2. 直接在ActionListener里写(仅适用于极简界面)
如果设置窗口只有一两个控件,也可以直接在匿名内部类里写,但会把主类代码堆得很臃肿,后续修改或扩展时非常麻烦,只适合极简单的场景。
二、解决WindowListener空方法冗余的问题
不用直接实现WindowListener接口,改用WindowAdapter适配器类——它已经帮你实现了所有WindowListener的空方法,你只需要重写实际需要的那一个方法就行,省去一堆空实现的冗余代码。
修改你的showSettingsDialogue()方法:
private void showSettingsDialogue() { if(settingsOpen) { return; } settingsOpen = true; settingWindow = new SettingsWindow(); settingWindow.addWindowListener(new WindowAdapter() { // 只重写需要的windowClosed方法,其他方法无需理会 @Override public void windowClosed(WindowEvent e) { settingsOpen = false; } }); settingWindow.setVisible(true); }
另外提个更省心的优化点:如果用模态JDialog(构造时传入true),根本不需要维护settingsOpen标志——模态对话框会阻塞主线程,用户关闭它之前没法再点击主窗口的设置按钮,代码能简化成这样:
private void showSettingsDialogue() { SettingsWindow settingWindow = new SettingsWindow(this); settingWindow.setVisible(true); // 窗口关闭后才会执行到这里,可在这里读取设置值并保存到配置 }
内容的提问来源于stack exchange,提问作者Jens Meier
相关产品推荐
相关产品推荐

