我有三个按钮的代码。我想在按钮点击后添加标签和文本字段。所以对于'按钮',我想添加'标签'和'文本字段。
对于'button2',我想添加'label2'和'textfield2'。等等。
我已经拥有此代码,但它无效。我也不明白如何创建三个不同的ActionListener。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Interface implements ActionListener{
private JLabel label;
private JLabel label2;
private JLabel label3;
private JTextField textfield;
private JTextField textfield2;
private JTextField textfield3;
private JButton button;
private JButton button2;
private JButton button3;
private JPanel panel;
public static void main(String[] args){
new Interface();
}
public Interface()
{
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(10,10,600,600);
panel.setLayout(null);
label = new JLabel("Button 1");
label.setBounds(5,5,600,20);
label2 = new JLabel("Button 2");
label2.setBounds(5,5,600,20);
label3 = new JLabel("Button 3");
label3.setBounds(5,5,600,20);
textfield = new JTextField();
textfield.setBounds(5,30,100,20);
JButton button = new JButton("cirkel");
button.setBounds(130,30,100,20);
button.addActionListener(this);
JButton button2 = new JButton("driehoek");
button2.setBounds(250,30,100,20);
button2.addActionListener(this);
JButton button3 = new JButton("vierhoek");
button3.setBounds(370,30,100,20);
button3.addActionListener(this);
panel.add(button);
panel.add(button2);
panel.add(button3);
frame.add(panel);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent arg0)
{
panel.add(label);
panel.add(textfield);
panel.validate();
panel.repaint();
String text = textfield.getText();
// Van de String 'text' een double maken
double diameter = Double.parseDouble(text);
cirkel C1 = new cirkel();
C1.setDiam(diameter);
label.setText("De diameter = " + C1.getDiam() + " cm \n\n");
label.setText("De straal = " + C1.getRadius() + " cm");
label.setText("De oppervlakte van de cirkel = " + C1.berekenOpp() + " cm2");
}
}
答案 0 :(得分:3)
您有几个选择:
为每个按钮创建一个ActionListener
,这可以使用外部,内部或匿名类来完成,这意味着您为每个按钮提供一个独立的工作单元,该单元仅与该按钮相关。
出于同样的原因,您也可以利用Action
API。有关详细信息,请参阅How to Use Actions
检查ActionEvent#getSource
属性并将其与按钮实例进行比较,但是您的按钮是在本地定义的
使用按钮的actionCommand
属性,将每个按钮设置为唯一的"命令"您可以使用ActionEvent#getActionCommand
与触发ActionListener
的时间进行比较
无论您使用哪种选择,请仔细查看 How to Write an Action Listeners和How to Use Buttons, Check Boxes, and Radio Buttons了解详情
现在,在有机会运行代码的情况下,NullPointerException
因为panel
null
在ActionListener
的上下文中有// Declared here
private JPanel panel;
public Interface() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setLayout(null);
// And here...
JPanel panel = new JPanel();
。这是因为你正在隐藏变量(声明它两次)
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Interface {
private JLabel label;
private JLabel label2;
private JLabel label3;
private JTextField textfield;
private JTextField textfield2;
private JTextField textfield3;
private JButton button;
private JButton button2;
private JButton button3;
private JPanel panel;
public static void main(String[] args) {
new Interface();
}
public Interface() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
JPanel buttonPane = new JPanel();
label = new JLabel("Button 1");
label2 = new JLabel("Button 2");
label3 = new JLabel("Button 3");
textfield = new JTextField(5);
JButton button = new JButton("cirkel");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.removeAll();
panel.add(label);
panel.add(textfield);
panel.revalidate();
panel.repaint();
String text = textfield.getText();
// Van de String 'text' een double maken
double diameter = Double.parseDouble(text);
// cirkel C1 = new cirkel();
// C1.setDiam(diameter);
label.setText("De diameter = " + 1 + " cm \n\n");
label.setText("De straal = " + 2 + " cm");
label.setText("De oppervlakte van de cirkel = " + 3 + " cm2");
}
});
JButton button2 = new JButton("driehoek");
button2.addActionListener(new ActionListener() {
@Override
public void actionPerdormed(ActionEvent e) {
panel.removeAll();
panel.add(label);
panel.add(textfield);
panel.revalidate();
panel.repaint();
// driehoek
}
});
JButton button3 = new JButton("vierhoek");
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.removeAll();
panel.add(label);
panel.add(textfield);
panel.revalidate();
panel.repaint();
// vierhoek
}
});
buttonPane.add(button);
buttonPane.add(button2);
buttonPane.add(button3);
panel = new JPanel();
frame.add(buttonPane, BorderLayout.NORTH);
frame.add(panel);
frame.setVisible(true);
}
}
因此,您可以为每个按钮使用匿名类......
NumberFormatException
您遇到的下一个问题是String
,因为您
您尝试将空白double
转换为system.time(foreach (i=1:5, .combine='c') %do% {Sys.sleep(2);i})
user system elapsed
0.053 0.011 10.012
,因为文字字段中没有任何内容......
答案 1 :(得分:1)
如果要创建三个不同的ActionListener,可以创建三个内部类,并为每个类实现一个ActionListener。并将该类的实例放在addActionListener()
。
public class Example {
ActionListen listen = new ActionListen();
button.addActionListener(listen);
private class ActionListen implements ActionListener {
public void actionPerformed(ActionEvent e) {
//code here to change...
}
}
}