![](/img/trans.png)
[英]How do I add an ActionListener to an instance of my class that extends JButton?
[英]How to add an anonymous instance off a class as an ActionListener
我在一個需要我制作帶有2個內部類的JFrame的實驗室中工作。 帶有JPanel的控件有一個文本區域和一個jbutton。 另一個實現動作偵聽器。 如何將第二個類的匿名實例添加到已經在內部類中的JButton中。 這里是簡要了解的內容。
這是我到目前為止編寫的代碼。 我可以使Frame出現,但是JPanel不會出現,JButtons或JTextArea也不會出現。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
@SuppressWarnings("serial")
public class FormFrame extends JFrame
{
public static void main(String[] args)
{
JFrame frame = new FormFrame();
frame.setLocationRelativeTo(null);
}
public FormFrame()
{
Container contentPane = getContentPane();
RegisterPanel p = new RegisterPanel();
p.button.addActionListener(new SubmitResponder());
//
// Here is where im lost...
//
contentPane.add(p);
setSize(300, 200);
setVisible(true);
}
class RegisterPanel extends JPanel
{
JPanel panel = new JPanel();
JTextField text = new JTextField();
JButton button = new JButton("Submit");
}
class SubmitResponder implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource()== RegisterPanel.button) //Asks me to make button static here
{
//Shows "No enclosing instance of the type FormFrame.RegisterPanel is accessible in scope"
RegisterPanel.this.text.setText("Submit Complete");
}
}
}
}
任何幫助,將不勝感激
您可以將RegisterPanel
實例傳遞給操作偵聽器:
class SubmitResponder implements ActionListener {
private final RegisterPanel rp;
public SubmitResponder(RegisterPanel rp) {
this.rp = rp;
}
@Override
public void actionPerformed(ActionEvent e) {
rp.text.setText("Submit Complete");
}
}
無需檢查源代碼。 AL僅收聽1個源。
RegisterPanel p = new RegisterPanel();
p.button.addActionListener(new SubmitResponder(p));
p.button.addActionListener(new SubmitResponder());
實際上, SubmitResponder
已經是一個匿名實例,因為它沒有名稱。
您與“無封閉實例”有關的錯誤無關。 由於SubmitResponder
不是RegisterPanel
的內部類(它是同級兄弟),它不屬於RegisterPanel
的實例,因此不能在邏輯上引用RegisterPanel.this
。 它怎么知道是哪個實例? 取決於父FormFrame
決定創建多少個,可能有很多甚至是零。 碰巧只有一個,但這不是重點。 另一方面,如果您說的是FormFrame.this
,那么無論代碼做什么,毫無疑問這意味着什么,除非RegisterPanel
不再是內部類或它成為靜態類。 那有意義嗎?
若要執行您想要的操作, SubmitResponder
需要通過FormFrame
的方法與RegisterPanel
進行FormFrame
。 順便說FormFrame.this.doSomething()
除非SubmitResponder
也有一個名為doSomething
的方法,否則您實際上不需要說FormFrame.this.doSomething()
。
這些說明告訴您RegisterPanel
應該是FormFrame
類中的一個字段,您尚未完成。 像這樣:
public class FormFrame extends JFrame
{
RegisterPanel panel;
...
public FormFrame()
{
panel = new RegisterPanel();
...
}
...
class SubmitResponder implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == panel.button)
{
panel.text.setText(...);
}
}
}
}
現在,您可以從SubmitResponder
類內部訪問panel
。
附帶說明一下,這些指令以一種模棱兩可和錯誤的方式使用了一些術語:
static
修飾符。 考慮到任務的背景,我懷疑這是正確的。 它可能應該說“實例字段”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.