簡體   English   中英

通過循環添加ActionListener

[英]Adding ActionListener with a loop

package javaapplication2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;



public class Calc extends JFrame implements ActionListener {

private JButton b1, b2, b3, b4,b5,b6,b7,b8,b9,b0;
JButton[] label = {b1, b2, b3, b4, b5,b6,b7,b8,b9,b0};
String[] numKeys = {"1","2","3","4","5","6","7","8","9","0"};
JPanel numPad;
JPanel opPad;
JTextField displayPanel;

 public Calc() {
 super("Calculator");
 setSize(250,200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);    
    setVisible(true);

    displayPanel = new JTextField(20);
    numPad = new JPanel();
    numPad.setLayout(new GridLayout(4, 3));  
    opPad = new JPanel();
    opPad.setLayout(new GridLayout(4, 1));
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(numPad,BorderLayout.LINE_START);
    getContentPane().add(displayPanel, BorderLayout.PAGE_START);

    for (int i = 0; i <label.length;i++) {
        label[i] = new JButton(numKeys[i]);
        numPad.add(label[i]);
        label[i].addActionListener(this);


    }


    b2.addActionListener(this);

 }
 public void actionPerformed(ActionEvent a) {
    if (a.getSource() == b1)                     
            displayPanel.setText("1");
}


    public static void main(String args[]) {
Calc c = new Calc();






}
}

嗨,我嘗試添加編號的Jbutton並在單個循環內添加動作偵聽器,以嘗試制作一個計算器。這些按鈕已創建並添加到面板中,但是當應顯示1時按“ 1”無效在文本字段上

private JButton b1, b2, b3, b4,b5,b6,b7,b8,b9,b0;
JButton[] label = {b1, b2, b3, b4, b5,b6,b7,b8,b9,b0};

b1-b0默認為null 在此代碼中:

for (int i = 0; i <label.length;i++) {
    label[i] = new JButton(numKeys[i]);
    numPad.add(label[i]);
    label[i].addActionListener(this);
}

您可以將按鈕分配給label數組,而不分配給變量b1-b0。 因此,您實際上是在這里檢查== null

if (a.getSource() == b1)

解決方案:刪除那些b1-b0變量(無論如何,您都得到了數組)並進行如下檢查:

if (a.getSource() == label[0])

首先,將按鈕初始化為null,然后使用這些null引用填充標簽數組。

在循環期間,您將創建新對象並將其替換為標簽數組。 原始引用仍指向null。

在動作事件中,您將source =新按鈕與指向空的舊引用進行比較。 這是錯

只需在將按鈕添加到標簽數組之前對其進行初始化,並且不要在循環中創建新按鈕。 固定!

我建議在for循環中使用actioncommand ,然后在動作偵聽器中檢查相同的內容label[i].setActionCommand(numKeys[i]); 然后在動作監聽器中, if (a.getActionCommand().equals("1"))

看看這個SO問題Java Button Action Command ,它解釋了ActionCommand的用法

希望這可以幫助 !!!

我認為將按鈕存儲在數組中不是一個好主意,但是如果您仍然想要,最好使用Arrais.asList()

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Arrays;
    import java.util.Collection;
    import javax.swing.*;

    class Calc extends JFrame {
      Collection<JButton> buttons = Arrays.asList(
        new JButton("1"),
        new JButton("2"),
        new JButton("3"),
        new JButton("4"),
        new JButton("5"),
        new JButton("6"),
        new JButton("7"),
        new JButton("8"),
        new JButton("9"),
        new JButton("0"));
      JPanel numPad;
      JPanel opPad;
      JTextField displayPanel;

      public Calc() {
        super("Calculator");
        setSize(250, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);    

        displayPanel = new JTextField(20);
        numPad = new JPanel();
        numPad.setLayout(new GridLayout(4, 3));
        opPad = new JPanel();
        opPad.setLayout(new GridLayout(4, 1));
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(numPad, BorderLayout.LINE_START);
        getContentPane().add(displayPanel, BorderLayout.PAGE_START);    

        for (final JButton button : buttons) {
          button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
              displayPanel.setText(displayPanel.getText() + button.getText());
            }
          });
          numPad.add(button);
        }
      }

  public static void main(String args[]) {
    Calc c = new Calc();
  }
}

編寫通用動作,這樣您就不必使用嵌套的if語句:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class CalculatorPanel extends JPanel
{
    private JTextField display;

    public CalculatorPanel()
    {
        Action numberAction = new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                display.replaceSelection(e.getActionCommand());
            }
        };

        setLayout( new BorderLayout() );

        display = new JTextField();
        display.setEditable( false );
        display.setHorizontalAlignment(JTextField.RIGHT);
        add(display, BorderLayout.NORTH);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout( new GridLayout(0, 5) );
        add(buttonPanel, BorderLayout.CENTER);

        for (int i = 0; i < 10; i++)
        {
            String text = String.valueOf(i);
            JButton button = new JButton( text );
            button.addActionListener( numberAction );
            button.setBorder( new LineBorder(Color.BLACK) );
            button.setPreferredSize( new Dimension(50, 50) );
            buttonPanel.add( button );

            InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
            inputMap.put(KeyStroke.getKeyStroke(text), text);
            inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text);
            button.getActionMap().put(text, numberAction);
        }
    }

    private static void createAndShowUI()
    {
//      UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );

        JFrame frame = new JFrame("Calculator Panel");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( new CalculatorPanel() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

此示例還使用了Key Bindings ,因此您可以在鍵盤上按“ 1”或單擊“ 1”按鈕。

暫無
暫無

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

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