Java如何从主菜单类点击按钮打开另一个类的JFrame窗口
解决主菜单按钮打开另一个JFrame窗口的问题
嘿,我来帮你搞定这个问题!其实你离成功只差几步——现在你的按钮ActionListener里的try块是空的,只要在里面添加创建并显示AvailableRooms窗口的代码就行啦。下面给你几种实现方式,从快速到优化的都有:
1. 快速实现:直接在按钮事件里创建窗口
你可以直接在actionPerformed方法的try块中实例化AvailableRooms,然后把它的frame设置为可见:
btnopenRaum.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { // 创建AvailableRooms实例,它会自动调用initialize()初始化窗口 AvailableRooms roomWindow = new AvailableRooms(); // 让窗口显示出来 roomWindow.frame.setVisible(true); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"failed"); // 这里建议打印异常栈,方便排查到底哪里出错了 e1.printStackTrace(); } } });
2. 更规范的写法:给AvailableRooms添加公共显示方法
不过上面的写法直接访问了AvailableRooms的私有成员frame,不符合面向对象的封装原则。我们可以给AvailableRooms类加一个公共方法来控制窗口显示:
首先修改AvailableRooms类,新增这个方法:
public class AvailableRooms extends GUI { private JFrame frame; private JTable table; // ... 你的其他代码(main、构造方法、initialize)保持不变 ... // 新增公共方法,用于外部调用显示窗口 public void showWindow() { frame.setVisible(true); } }
然后在主菜单的按钮事件里调用这个方法:
btnopenRaum.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { AvailableRooms roomWindow = new AvailableRooms(); roomWindow.showWindow(); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"failed"); e1.printStackTrace(); } } });
3. 线程安全的推荐写法
Swing是单线程UI框架,所有UI操作都应该在**事件调度线程(EDT)**中执行,避免出现UI卡顿或异常。就像AvailableRooms的main方法那样,我们可以把创建窗口的代码放到EventQueue.invokeLater里:
btnopenRaum.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { EventQueue.invokeLater(new Runnable() { public void run() { AvailableRooms roomWindow = new AvailableRooms(); roomWindow.showWindow(); } }); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"failed"); e1.printStackTrace(); } } });
4. 优化:复用同一个窗口实例
如果你不想用户每次点击按钮都打开一个新的窗口,可以把AvailableRooms的实例作为主菜单类的成员变量,第一次点击时创建,之后点击只显示并激活窗口:
首先在主菜单类里声明成员变量:
// 主菜单类的成员变量 private AvailableRooms roomWindow;
然后修改按钮的ActionListener:
btnopenRaum.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { EventQueue.invokeLater(new Runnable() { public void run() { // 如果窗口还没创建,就实例化 if (roomWindow == null) { roomWindow = new AvailableRooms(); } // 显示窗口并带到前台 roomWindow.showWindow(); roomWindow.frame.toFront(); } }); } catch(Exception e1) { JOptionPane.showMessageDialog(null,"failed"); e1.printStackTrace(); } } });
这样用户多次点击按钮只会显示同一个窗口,不会重复创建,体验更好。
内容的提问来源于stack exchange,提问作者Lia
相关产品推荐
相关产品推荐

