簡體   English   中英

如何從類中添加匿名實例作為ActionListener

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM