簡體   English   中英

動作監聽器似乎沒有開火

[英]Action listener does not seem to be firing

我是Java編程語言的新手,我嘗試編寫一個簡單的代碼

public class TextPanel extends JPanel {

    private JTextArea textArea;

    public TextPanel() {
        textArea = new JTextArea();

        setLayout(new BorderLayout());
        setVisible(true);

        add(new JScrollPane(textArea), BorderLayout.CENTER);
    }

    public String getTextAreaText() {
        String text = textArea.getText();

        return text;
    }
}

並且我向星形按鈕( startBtn )添加了一個動作監聽器,但是當我運行該程序時,即使將System.out.println(textPanel.getTextAreaText())放入actionPerformed()方法(在下面的代碼中),控制台中也沒有顯示任何內容。

public class Toolbar extends JPanel {

    private JButton startBtn;
    private JButton stopBtn;
    private TextPanel textPanel;

    public Toolbar() {
        startBtn = new JButton("Start");
        stopBtn = new JButton("Stop");
        textPanel = new TextPanel();

        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(startBtn);
        add(stopBtn);

        startBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println(textPanel.getTextAreaText());
            }
        });
    }
}

我需要幫助來解決此問題。

  1. Java程序需要一個公共的靜態main方法才能運行。 您的代碼沒有此功能,因此您的程序沒有起點
  2. Swing GUI要求將組件放置在頂級窗口(例如JFrame)中,並顯示此窗口以使組件可見。 您的代碼沒有這個。
  3. 您將要閱讀Java和Swing教程,因為所有這些都在其中很好地解釋了,並附有示例代碼。

有關體面的資源,請查看Java和Swing標簽的信息部分:

因此,考慮添加一個主要方法來創建您的JFrame並將組件添加到JFrame中,例如:

private static void createAndShowGui() {
  JFrame frame = new JFrame("My JFrame");
  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

  // add your components to your JFrame here

  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
}

// the main method which Java uses as the starting point for your program
public static void main(String[] args) {

  // let's call our Swing GUI in a thread-safe manner
  SwingUtilities.invokeLater(new Runnable() {
     public void run() {
        createAndShowGui();
     }
  });
}

編輯
您的代碼還顯示了可能的變量陰影。 您在工具欄類中創建了一個TextPanel對象,但是沒有添加此TextPanel。 這表明您可能在其他地方顯示了一個TextPanel對象(我們只能猜測,因為看起來您沒有顯示足夠的代碼讓我們確定)。 如果是這樣,那么按開始按鈕將從未顯示的工具欄的JTextArea中獲取文本。 而是考慮將TextPanel引用傳遞到工具欄,如下所示:

class Toolbar extends JPanel {

   private JButton startBtn;
   private JButton stopBtn;
   private TextPanel textPanel;

   public Toolbar() {
      startBtn = new JButton("Start");
      stopBtn = new JButton("Stop");
      // textPanel = new TextPanel();  // *** note change

      setLayout(new FlowLayout(FlowLayout.LEFT));
      add(startBtn);
      add(stopBtn);

      startBtn.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent evt) {
            if (textPanel != null) {
               System.out.println(textPanel.getTextAreaText());
            }
         }
      });
   }

   //   **** note this method ****  
   public void setTextPanel(TextPanel textPanel) {
      this.textPanel = textPanel;
   }
}

然后在創建對象時,傳遞您的引用:

private static void createAndShowGui() {

  Toolbar toolBar = new Toolbar();
  TextPanel textPanel = new TextPanel();

  toolBar.setTextPanel(textPanel);  // ****** passing in my reference *******

  JFrame frame = new JFrame("Add New Lines");
  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  frame.getContentPane().add(textPanel);
  frame.getContentPane().add(toolBar, BorderLayout.PAGE_START);
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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