2012-02-14 115 views
2

我需要在此前言,因为我们不允许在课堂上使用IDE。我显然错过了一些重要的东西。我正在编写一个程序,该程序应允许用户单击单选按钮,然后将“灯光”更改为该颜色。我以为我正确地连接了听众,但显然我忘了一些事情。有人可以帮我弄这个吗?我错过了什么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)); 
     jrbYellow.addActionListener(new YellowListener(canvas)); 
     jrbGreen.addActionListener(new GreenListener(canvas)); 
    } 
} 

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(); 
    } 

    public void setYellow(){ 
     yellow = true; 
     repaint(); 
    } 

    public void setGreen(){ 
     green = 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.drawRect(x - 5,y - 90, 40, 120); 
     g.setColor(Color.RED); 
     g.drawOval(x,y - 80, 4 * radius, 4 * radius); 
     g.setColor(Color.YELLOW); 
     g.drawOval(x,y - 40, 4 * radius, 4 * radius); 
     g.setColor(Color.GREEN); 
     g.drawOval(x,y, 4 * radius, 4 * radius); 


     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 canvas; 

    RedListener(Lab4Panel canvas) { 
    this.canvas = canvas; 
    } 

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

class YellowListener implements ActionListener{ 
    private Lab4Panel canvas; 

    YellowListener(Lab4Panel canvas) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas.setYellow(); 
    } 
} 

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

    GreenListener(Lab4Panel canvas) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas.setGreen(); 
    } 
} 
+2

为什么在paintComponent方法中重复调用repaint()? – 2012-02-14 02:50:36

+0

我想要它覆盖原来的轮廓颜色 – Robert 2012-02-14 02:51:08

+0

我希望它绘制红色的黄色和绿色的圆圈,然后基于用户点击我想要它填充圆圈 – Robert 2012-02-14 02:52:04

回答

3

更改代码如下:

class Lab4RadioButtonPanel extends JPanel { 
    Lab4Panel canvas = new Lab4Panel(); 
    //Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel(); 

    public Lab4RadioButtonPanel() { 

class Lab4RadioButtonPanel extends JPanel { 
    Lab4Panel canvas; 
    //Lab4RadioButtonPanel canvas2 = new Lab4RadioButtonPanel(); 

    public Lab4RadioButtonPanel(Lab4Panel canvas) { 
     this.canvas = canvas; 

,改变代码如下:

Lab4Panel p = new Lab4Panel(); 
Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(); 

到:

Lab4Panel p = new Lab4Panel(); 
Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(p); 

我得到像下图的结果,我想你会得到什么错你的计划: enter image description here

的缺陷是显而易见的:你显示主要功能是建立在面板,但面板你按Lab4RadioButtonPanel类中的单选按钮修改,它们不指向相同的对象,这是问题所在。

+0

好的,谢谢你的支持帮助 – Robert 2012-02-14 04:24:12

+0

我的代码出现以下错误。错误:类Lab4RadioButtonPanel中的构造函数Lab4RadioButtonPanel不能应用于给定的类型; \t \t \t Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(p); – Robert 2012-02-14 23:36:30

+0

不要介意我是白痴 – Robert 2012-02-14 23:49:52

1

paintComponent打电话给你的repaint()年代后不会被调用。有两个Lab4Panels。您设置听众的人不是您正在绘制的人。

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

class Lab4Frame extends JFrame 
{ 
    Lab4Frame() 
    { 
     this.setLayout(new BorderLayout()); 
     setTitle("Lab 4 - Application #1"); 
     Lab4Panel p = new Lab4Panel(); 
     Lab4RadioButtonPanel p2 = new Lab4RadioButtonPanel(p); 

     add(p, BorderLayout.CENTER); 
     add(p2, BorderLayout.SOUTH); 
    } 

    ... 
} 

class Lab4RadioButtonPanel extends JPanel 
{ 
    Lab4Panel canvas; 

    public Lab4RadioButtonPanel(Lab4Panel p) 
    { 
     canvas = p; 
     this.setLayout(new FlowLayout()); 
     ... 
    } 
}