Java异常:java.lang.ClassCastException:javax.swing.Timer无法强制转换为javax.swing.JButton

时间:2014-09-09 14:40:48

标签: java swing classcastexception

我真的不明白这个运行时错误:

  

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++;
 }
}

3 个答案:

答案 0 :(得分:4)

JButton button = (JButton) e.getSource();方法中下一行actionPerformed()中的问题。因为您将ButtonListener添加到JButtonTimer。您可以为它们使用不同的侦听器,或者您可以在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
     }
}

不要对JButtonsJTimer使用相同的侦听器类。为您的计时器创建一个单独的监听器。