2015-08-15 3 views
0

Я пытаюсь написать программу, в которой есть две кнопки, которые, когда я нажимаю первый, квадрат должен перекрашивать снова и снова и менять его цвет, нажимая второй. но это просто перекрасить один раз :( если кто-нибудь может помочь я буду ценить его.повторно нарисовать панель повторно после нажатия кнопки

class Squre { 
JFrame frame; 
JButton button1; 
JButton button2; 
MyPanel panel; 

public static void main(String[] args){ 
    Squre s= new Squre(); 
    s.go(); 

} 
public void go(){ 
    frame = new JFrame(); 
    panel= new MyPanel(); 
    button1= new JButton(); 
    button2= new JButton(); 

    button1.setText("START"); 
    //button1.setSize(30, 20); 
    frame.setVisible(true); 
    frame.setSize(700,700); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(BorderLayout.CENTER ,panel);// add panel 
    frame .getContentPane().add(BorderLayout.WEST, button1);// add the west button 
    frame .getContentPane().add(BorderLayout.EAST, button2);//ADD THE EAST BUTTON 
    button1.addActionListener(new StrListener()); 
    button2.setText("EXPLOSION"); 
    button2.addActionListener(new ExpListener()); 
} 
private class StrListener implements ActionListener{ 

    public void actionPerformed(ActionEvent e){ 
     do{ 
      frame.repaint(); 

     } 
     while(e.equals(button2)==true); 
} 
} 
private class ExpListener implements ActionListener{ 
    // @Override 
    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
}class MyPanel extends JPanel{ 
public void paintComponent(Graphics g){ 
    g.fillRect(0,0,this.getWidth(),this.getHeight()); 

    int red = (int) (Math.random() * 255); 
    int green = (int) (Math.random() * 255); 
    int blue = (int) (Math.random() * 255); 
    Color rn=new Color(red, green, blue); 
    g.setColor(rn); 
    g.fillRect(250, 250, 50, 50); 



} 
}} 

ответ

2
e.equals(button1) // event not equal to a button 

e.equals(button1) никогда не станет правдой, потому что event не равна button .Но repaint проходит один раз, потому что это сделать в то время как петля.

вы должны использовать

e.getSource().equals(button1); 

, чтобы проверить, нажата ли кнопка button1 или нет.

но даже вы используете e.getSource().equals(button1) вы не будете видеть изменение цвета, как вы ожидали .if вы запускаете этот раз потребляя в то время как цикл внутри EDT, вы блокируйте EDT нити .hence цвета не изменятся, но если вы поставите sout вы будете см., что цикл работает постоянно. Для этого вы можете использовать swing timer. таймер качания не будет блокировать EDT.

с помощью таймера Свинг ....

следует импортировать swing timer //

private class StrListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource().equals(button1)) { 
      Timer t = new Timer(100, new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent ae) { 
        frame.repaint(); 
       } 
      }); 
      t.start(); 
     } 
    } 
} 

enter image description here

+0

это было полезно, TNX – mlh

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