2012-02-14 31 views
-1

我得到一个错误:构造函数类RedListener中的RedListener不能应用于给定的类型; jrbRed.addActionListener(new RedListener(canvas,canvas2));我的actionListener调用有什么问题

我收到每个听众一个。该程序应该是一个红绿灯,当我点击一个点亮“点亮”的单选按钮时。如果没有,那么点击它只是应该在颜色被概括

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



public class Lab4Frame extends JFrame { 
    //public boolean red, yellow, green; 
    Lab4Frame(){ 
     this.setLayout(new BorderLayout()); 
     setTitle("Lab 4 - Application #1"); 
     Lab4Panel p = new Lab4Panel(); 
     Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(); 
     add(p, BorderLayout.CENTER); 
     add(p2, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args){ 

      Lab4Frame frame = new Lab4Frame(); 
      frame.setTitle("Lab4 Application # 1"); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(600, 600); 
      frame.setVisible(true); 
    } 

} 

class Lab4RadioButtonPanel extends JPanel { 
     Lab4Panel canvas = new Lab4Panel(); 
     Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel(); 
    public Lab4RadioButtonPanel() { 
     boolean red, green, yellow; 



     this.setLayout(new FlowLayout()); 
     JRadioButton jrbRed = new JRadioButton("Red", true); 
     JRadioButton jrbYellow = new JRadioButton("Yellow"); 
     JRadioButton jrbGreen = new JRadioButton("Green"); 

     this.setBorder(BorderFactory.createLineBorder(Color.black)); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(jrbRed); 
     group.add(jrbYellow); 
     group.add(jrbGreen); 

     this.add(jrbRed); 
     this.add(jrbYellow); 
     this.add(jrbGreen); 

     jrbRed.addActionListener(new RedListener(canvas, canvas2)); 
     jrbYellow.addActionListener(new YellowListener(canvas, canvas2)); 
     jrbGreen.addActionListener(new GreenListener(canvas, canvas2)); 

    } 
} 










class Lab4Panel extends JPanel{ 


    public Lab4Panel(){} 



    boolean red, green, yellow; 
    int radius = 5; 
    int x = -1; 
    int y = -1; 

    public void setRed(){ 
     red = true; 
     repaint(); 
    } 

    protected void paintComponent(Graphics g){ 
     if (x<0 || y<0) { 
      x = getWidth()/2 - radius; 
      y = getHeight()/2 - radius; 
     } 
     super.paintComponent(g); 
     g.drawRect(x - 10,y - 90, 40, 120); 
     g.drawOval(x,y - 80, 4 * radius, 4 * radius); 
     g.drawOval(x,y - 40, 4 * radius, 4 * radius); 
     g.drawOval(x,y, 4 * radius, 4 * radius); 
     g.drawRect(x - 5,y - 90, 40, 120); 

     if(red){ 
      g.setColor(Color.RED); 
      g.fillOval(x,y - 80, 4 * radius, 4 * radius); 
      repaint(); 
     } 

     else if (yellow){ 
      g.setColor(Color.YELLOW); 
      g.fillOval(x,y - 40, 4 * radius, 4 * radius); 
      repaint(); 
     } 

     if(green){ 
      g.setColor(Color.GREEN); 
      g.fillOval(x,y, 4 * radius, 4 * radius); 
      repaint(); 
     } 

    } 


} 


class RedListener implements ActionListener{ 
    private Lab4RadioButtonPanel canvas; 
    private Lab4Panel canvas2; 

    RedListener(Lab4RadioButtonPanel canvas, Lab4Panel canvas2) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas2.setRed(); 
    } 
} 

class YellowListener implements ActionListener{ 
    private Lab4RadioButtonPanel canvas; 
    private Lab4Panel canvas2; 

    YellowListener(Lab4RadioButtonPanel canvas, Lab4Panel canvas2) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas2.setRed(); 
    } 
} 

class GreenListener implements ActionListener{ 
    private Lab4RadioButtonPanel canvas; 
    private Lab4Panel canvas2; 

    GreenListener(Lab4RadioButtonPanel canvas, Lab4Panel canvas2) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas2.setRed(); 
    } 
} 

回答

3

你有这样的:

Lab4Panel canvas = new Lab4Panel(); 
Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel(); 

这:

jrbRed.addActionListener(new RedListener(canvas, canvas2)); 

,但你的构造是这样的:

RedListener(Lab4RadioButtonPanel canvas, Lab4Panel canvas2) 

您可能想要:

jrbRed.addActionListener(new RedListener(canvas2, canvas)); 

即,您颠倒了参数的顺序。

2

比较构造函数的参数

RedListener(Lab4RadioButtonPanel canvas, Lab4Panel canvas2) {...} 

给您传递它

Lab4Panel canvas = new Lab4Panel(); 
Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel(); 
... 
jrbRed.addActionListener(new RedListener(canvas, canvas2)); 

是绝对没有理由你不应该已经能够调试这个问题的争论。

+0

谢谢你的帮助,但我仍然是一个学生学习这个东西的学生。我一直在寻找20分钟的textpad编译器试图找出我做错了什么。 – Robert 2012-02-14 02:29:52

+0

@ user512915,熟悉更复杂的专业IDE(例如Eclipse,NetBeans等)。这些编译器将这些20分钟的无意义调试减少到几个纳秒。 ;] – mre 2012-02-14 02:31:27

+0

我们不允许在课堂上使用IDE。我忘了把它放在顶部抱歉。 – Robert 2012-02-14 02:42:47