package examples; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.beans.*; import javax.swing.*; /** * A painted copy of a component. * @author kjg * */ public class ListeningPaintedBuffer extends JPanel implements PropertyChangeListener { JComponent original; BufferedImage buffer; public ListeningPaintedBuffer(JComponent original) { this.original = original; update(); original.addPropertyChangeListener(this); } public void propertyChange(PropertyChangeEvent pce) { System.out.println("Got property change " + pce.getPropertyName() + ". Old value: " + pce.getOldValue() + "New value: " + pce.getNewValue()); update(); } void update() { buffer = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D bufferedGraphics = (Graphics2D) buffer.getGraphics(); bufferedGraphics.setColor(Color.WHITE); bufferedGraphics.fillRect(0,0,original.getWidth(), original.getHeight()); original.paint(bufferedGraphics); repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.scale(((double) getWidth()/buffer.getWidth()), ((double) getHeight())/buffer.getHeight()); g2.drawImage(buffer, 0, 0, null); } // Test program: public static void main(String[] args) { JFrame f = new JFrame("My GUI"); final JToggleButton button = new JToggleButton("CSE132 Rocks!"); button.setIcon(new ImageIcon("smile.jpg")); button.setBounds(10,10,200,100); f.setLayout(null); f.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { button.firePropertyChange("TOGGLED", !button.isSelected(), button.isSelected()); } }); ListeningPaintedBuffer image = new ListeningPaintedBuffer(button); image.setBounds(220,10,200,100); f.add(image); ListeningPaintedBuffer image2 = new ListeningPaintedBuffer(button); image2.setBounds(10,200,100,50); f.add(image2); f.setSize(500,300); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }