У вас есть как минимум два объекта Painter.Отображаемая не та, которая используется в качестве объекта ActionListener.Например, что если вы передадите ссылку на объект Painter, который отображается в вашем классе Button, примерно так (изменения обозначаются \ !! comments):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Painter extends JPanel implements ActionListener {
private int x = 30, y = 30;
// remove the blocked comment to make it run
/*
* public Painter(){ Buttons b = new Buttons(new String("Click to paint"));
* b.addActionListener(this); add(b); }
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(44, 55, 66));
g.fillRect(200, 200, x, y);
}
public void actionPerformed(ActionEvent e) {
x = 600;
y = 600;
repaint();
}
}
class Buttons extends JButton {
public Buttons(String Tag, Painter p) { \\!!
super(Tag);
setBounds(20, 20, 150, 50);
// !! Painter p = new Painter();// comment it out
addActionListener(p);// comment it out
}
}
class Window extends JFrame {
public Window() {
Painter p = new Painter();// !!
Buttons b = new Buttons("Click Me", p);// comment it out //!!
getContentPane().add(b);// comment it out
getContentPane().add(p);
getContentPane().setBackground(Color.WHITE);
setSize(700, 700);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
public class PaintOnEvent {
public static void main(String[] args) {
Window w = new Window();
}
}
Пример, учитывающийBorderLayout для contentPane выглядит следующим образом:
class Window extends JFrame {
public Window() {
Painter p = new Painter();
Buttons b = new Buttons("Click Me", p); // !!
b.setPreferredSize(new Dimension(150, 50));
JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // !!
btnPanel.setOpaque(false); // !!
btnPanel.add((b)); // !!
p.setOpaque(false); // !!
getContentPane().add(btnPanel, BorderLayout.NORTH); // !!
getContentPane().add(p, BorderLayout.CENTER); // !!
getContentPane().setBackground(Color.WHITE);
((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // !!
// !! setSize(700, 700);
setPreferredSize(new Dimension(700, 700)); // !!
pack(); // !!
setLocationRelativeTo(null); // !!
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}