[英]How to draw a roundedRectangle with text inside a class extending JPanel
[英]Button ActionListener not called inside class extending JPanel
我有一個名為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);
}
}
這是它的“控制器”類。 側面板可以顯示或不顯示,這是這個動作監聽器所做的,這似乎工作得很好。
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());
}});
}
}
這是FrontGUILinker類:
public class FrontGUILinker extends JPanel {
public btnCreateLink;
public FrontGUILinker() {
btnCreateLink = new JButton("Create Link");
add(btnCreateLink);
}
}
這是該類的控制器:
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");
}});
}
}
任何人都知道為什么這不起作用?
您正在創建兩次 FrontGUILinker實例,一個是您正在顯示的,另一個是您要添加一個ActionListener。 不要那樣做。 創建此對象一次,並對兩者使用相同的引用。 要證明我是對的,只需查看上面問題中的代碼,然后搜索你調用new FrontGUILinker()
,你就會看到你做了兩次,這里:
public FrontGUI() {
linkerPanel = new FrontGUILinker();
再來一次:
public FrontGUILinkerController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUILinker();
每個實例都與另一個實例完全不同,因此向一個實例添加一個ActionListener對另一個實例(顯示的實例)沒有任何影響。 要解決此問題,請將有效引用傳遞到需要的位置。
即
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");
}});
}
}
和
public FrontGUIController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUI();
linkerController = new FrontGUILinkerController(maingui, frame); // **** changed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.