Fra*_*sKR 5 java macos user-interface swing actionlistener
我有一个名为FrontGUI的主框架,并添加了一个侧面板.这个侧面板是一个名为FrontGUILinker的类,它扩展了JPanel,并在其上有一个按钮.当我运行程序时,按钮不会执行任何操作 - 似乎似乎没有调用ActionListener.我有其他几个具有类似设置的组件,按钮都可以使用它们 - 唯一的区别是我们可以看到它们是JFrame的扩展,它们不是FrontGUI的直接字段,而是代替下面代码中提到的maingui .这个maingui包含每个帧的Controller类,包括FrontGUIController,但FrontGUILinkerController是FrontGUIController中的一个字段.以下是我班级的概述,希望只是遗漏了无关的事情.主要的JFrame类:
public class FrontGUI extends JFrame {
public FrontGUILinker linkerPanel;
public JButton btnShowhideLinker;
public FrontGUI() {
linkerPanel = new FrontGUILinker();
contentPane.add(linkerPanel, BorderLayout.EAST);
btnShowhideLinker = new JButton("Show/Hide Linker");
contentPane.add(btnShowhideLinker);
}
}
Run Code Online (Sandbox Code Playgroud)
这是它的"控制器"类.侧面板可以显示或不显示,这是这个动作监听器所做的,这似乎工作得很好.
public class FrontGUIController {
public MAINGUI maingui;
private FrontGUI frame;
public FrontGUILinkerController linkerController;
public FrontGUIController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUI();
linkerController = new FrontGUILinkerController(maingui);
//Button: Show/Hide linkerPanel
frame.btnShowhideLinker.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.linkerPanel.setVisible(!frame.linkerPanel.isVisible());
}});
}
}
Run Code Online (Sandbox Code Playgroud)
这是FrontGUILinker类:
public class FrontGUILinker extends JPanel {
public btnCreateLink;
public FrontGUILinker() {
btnCreateLink = new JButton("Create Link");
add(btnCreateLink);
}
}
Run Code Online (Sandbox Code Playgroud)
这是该类的控制器:
public class FrontGUILinkerController {
public MAINGUI maingui;
private FrontGUILinker frame;
public FrontGUILinkerController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUILinker();
// Add listener to Create Link button
frame.btnCreateLink.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Create Link button has been clicked");
}});
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么这不起作用?
您创建 FrontGUILinker 实例两次,一次显示,一次添加 ActionListener。不要那样做。创建此对象一次并为两者使用相同的引用。为了证明我是对的,只需查看上面问题中的代码,然后搜索您调用的位置new FrontGUILinker(),您就会发现您在这里执行了两次:
public FrontGUI() {
linkerPanel = new FrontGUILinker();
Run Code Online (Sandbox Code Playgroud)
再次在这里:
public FrontGUILinkerController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUILinker();
Run Code Online (Sandbox Code Playgroud)
每个实例都与另一个实例完全不同,因此向一个实例添加 ActionListener 不会对另一个实例(显示的实例)产生影响。要解决此问题,请将有效引用传递到需要的地方。
IE,
public class FrontGUILinkerController {
public MAINGUI maingui;
private FrontGUILinker frame;
// **** note change
public FrontGUILinkerController(MAINGUI parent, FrontGUILiner frame) {
maingui = parent;
this.frame = frame; // **** added
// frame = new FrontGUILinker(); // **** commented out
// Add listener to Create Link button
frame.btnCreateLink.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Create Link button has been clicked");
}});
}
}
Run Code Online (Sandbox Code Playgroud)
和
public FrontGUIController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUI();
linkerController = new FrontGUILinkerController(maingui, frame); // **** changed
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |