2016-03-03 134 views
3

我得到3 JPanelJFrame內。兩個爲JButton,另一個爲繪圖畫布。 我爲每個JButton生成一個隨機顏色,在JPanel的中間畫一個橢圓,並在每個點擊JButton的我改變橢圓的顏色。 問題是顏色沒有改變。橢圓不會改變顏色時點擊一個JButton - Java Swing

CirclePanel.java:

public class CirclePanel extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 

    private Color color; 

    public Color getColor() 
    { 
     return this.color; 
    } 

    public void setColor(Color color) 
    { 
     this.color = color; 
     repaint(); 
    } 

    public CirclePanel() 
    { 

    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     final int OVAL_WIDTH = this.getWidth()/2; 
     final int OVAL_HEIGHT = this.getHeight()/2; 
     final int xPosition = OVAL_WIDTH/2; 
     final int yPosition = OVAL_HEIGHT/2; 

     g.setColor(this.color); 
     g.fillOval(xPosition,yPosition,OVAL_WIDTH,OVAL_WIDTH); 
    } 
} 

RightPanel.java和LeftPanel.java:

public class RightPanel extends JPanel implements ActionListener 
{ 
    private static final long serialVersionUID = 1L; 

    private static final int BUTTONS = 6; 

    private CirclePanel circlePanel; 

    public RightPanel(CirclePanel circlePanel) 
    { 
     this.circlePanel = circlePanel; 

     this.setLayout(new GridLayout(BUTTONS,0)); 

     // Adding buttons to the layout 
     for (int i = 0;i < RightPanel.BUTTONS;i++) 
     { 
      JButton button = new JButton(); 
      button.setBackground(generateColor()); 
      button.addActionListener(this); 
      this.add(button); 
     } 

     this.setVisible(true); 
    } 

    public Color generateColor() 
    { 
     Random random = new Random(); 
     // 255 - maximum value. 0 - minimum value 
     int randomNumber1 = random.nextInt((255 - 0) + 1) + 0; 
     int randomNumber2 = random.nextInt((255 - 0) + 1) + 0; 
     int randomNumber3 = random.nextInt((255 - 0) + 1) + 0; 
     Color color = new Color(randomNumber1,randomNumber2,randomNumber3); 
     return color; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     Color color = ((JButton)e.getSource()).getBackground(); 
     this.circlePanel.setColor(color); 
    } 
} 

public class LeftPanel extends JPanel implements ActionListener 
{ 
    private static final long serialVersionUID = 1L; 

    private static final int BUTTONS = 6; 

    private CirclePanel circlePanel; 

    public LeftPanel(CirclePanel circlePanel) 
    { 
     this.circlePanel = circlePanel; 

     this.setLayout(new GridLayout(BUTTONS,0)); 

     // Adding buttons to the layout 
     for (int i = 0;i < LeftPanel.BUTTONS;i++) 
     { 
      JButton button = new JButton(); 
      button.setBackground(generateColor()); 
      button.addActionListener(this); 
      this.add(button); 
     } 

     this.setVisible(true); 
    } 

    public Color generateColor() 
    { 
     Random random = new Random(); 
     // 255 - maximum value. 0 - minimum value 
     int randomNumber1 = random.nextInt((255 - 0) + 1) + 0; 
     int randomNumber2 = random.nextInt((255 - 0) + 1) + 0; 
     int randomNumber3 = random.nextInt((255 - 0) + 1) + 0; 
     Color color = new Color(randomNumber1,randomNumber2,randomNumber3); 
     return color; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     Color color = ((JButton)e.getSource()).getBackground(); 
     this.circlePanel.setColor(color); 
    } 
} 

MyFrame.java:

public class MyFrame extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 
    private CirclePanel circlePanel; 

    public MyFrame() 
    { 
     super("paintComponent"); 

     this.circlePanel = new CirclePanel(); 
     this.setLayout(new BorderLayout()); 
     this.setSize(400,400); 
     this.setResizable(false); 
     this.add(new LeftPanel(this.circlePanel),BorderLayout.WEST); 
     this.add(new RightPanel(this.circlePanel),BorderLayout.EAST); 
     this.add(new CirclePanel(),BorderLayout.CENTER); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     new MyFrame(); 
    } 
} 

我查看了程序是否得到了每個actionPerformed()方法,並且確實如此。

那麼它有什麼問題?

+0

你或許應該做'這.circlePanel.revalidate()'使更改生效 – Pragnani

回答

4

CirclePanel您顯示,是不是你傳遞給左/右面板中的一個,請參閱:

this.add(new LeftPanel(this.circlePanel),BorderLayout.WEST); 
this.add(new RightPanel(this.circlePanel),BorderLayout.EAST); 
this.add(new CirclePanel(),BorderLayout.CENTER); 

你可能想要做的:

this.add(new LeftPanel(this.circlePanel),BorderLayout.WEST); 
this.add(new RightPanel(this.circlePanel),BorderLayout.EAST); 
this.add(this.circlePanel,BorderLayout.CENTER); 
+0

賓果!愚蠢的我。謝啦。 – God

相關問題