2016-03-03 2 views
3

У меня есть 3 JPanel внутри JFrame. Два для 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

Смежные вопросы