![](/img/trans.png)
[英]Adding JLabels to JFrame using ActionListener and for loop
[英]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.