我真的不明白这个运行时错误:
java.lang.ClassCastException:javax.swing.Timer无法强制转换为 javax.swing.JButton中。
这是我的代码:
timer = new Timer(DELAY, new ButtonListener());
private JButton[] buttons = new JButton[3];
buttons[0] = new JButton("Circle");
buttons[1] = new JButton("Start");
buttons[2] = new JButton("Stop");
for(JButton button : buttons){
button.addActionListener(new ButtonListener());
controlPanel.add(button);
}
public void actionPerformed(ActionEvent e){
JButton button = (JButton) e.getSource();
if(button.getText().equals("Start")){
timer.start();
}else
if(button.getText().equals("Stop")){
timer.stop();
}else
if(button.getText().equals("Circle")){
shapes[count] = new Circle();
drawPanel.repaint();
count++;
}
}
答案 0 :(得分:4)
JButton button = (JButton) e.getSource();
方法中下一行actionPerformed()
中的问题。因为您将ButtonListener
添加到JButton
和Timer
。您可以为它们使用不同的侦听器,或者您可以在e.getSource();
actionPerformed()
的类型
答案 1 :(得分:1)
Swing Timers也可以触发动作事件。您只需要在代码中进行类检查:
public void actionPerformed(ActionEvent e){
if (e.getSource() instanceof (JButton)) {
JButton button = (JButton) e.getSource();
if(button.getText().equals("Start")){
timer.start();
}else
if(button.getText().equals("Stop")){
timer.stop();
}else
if(button.getText().equals("Circle")){
shapes[count] = new Circle();
drawPanel.repaint();
count++;
}
}else (e.getSource() instanceof (Timer)) {
//deal with timer
}
}
答案 2 :(得分:0)
在您的actionPerformed方法中检查e.getSource()
是JButton
的实例,其他方面是否处理
public void actionPerformed(ActionEvent e){
if(e.getSource() instanceof JButton){
// your button action logic
}
}
不要对JButtons
和JTimer
使用相同的侦听器类。为您的计时器创建一个单独的监听器。