но вдова JFrame имеет зеленый прямоугольник еще до того, как я нажму на кнопку.
Это потому, что вы уже жестко задали зеленый цвет в методе paintComponent. Поэтому он всегда будет зеленым.
У вашего класса должно быть свойство устанавливать цвет прямоугольника. Что-то вроде:
class MyPanel extends JPanel
{
private Color rectangleColor = getBackground();
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor( rectangleColor); // i choose green as a color
g.fillRect(20, 50, 100, 100);
}
public void setRectangleColor(Color rectangleColor)
{
this.rectangleColor = rectangleColor;
repaint();
}
}
Затем в ActionListener используемой вами кнопки:
//frame.repaint();
drawPanel.setRectangleColor( Color.GREEN );
button.setText("color changed");
Переменная 'drawPanel` также должна быть переменной экземпляра в вашем классе.
Теперь с этим дизайном вы можете иметь несколько кнопок. Каждая кнопка может изменить прямоугольник на свой цвет.