天天看點

java重新繪制_按下按鈕時重新繪制Java

文章Painting in AWT and Swing可以提供關于應用程式觸發繪畫的一些觀點。下面的例子說明了原理。請注意,setForeground()會自動調用repaint(),因為前景色是bound property,但您可以随時自行調用。

import java.awt.*;

import java.awt.event.*;

import java.util.Random;

import javax.swing.*;

public class SwingPaint {

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame f = new JFrame();

final GamePanel gp = new GamePanel();

f.add(gp);

f.add(new JButton(new AbstractAction("Update") {

@Override

public void actionPerformed(ActionEvent e) {

gp.update();

}

}), BorderLayout.SOUTH);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

}

});

}

private static class GamePanel extends JPanel {

private static final Random r = new Random();

public GamePanel() {

this.setForeground(new Color(r.nextInt()));

}

@Override

public Dimension getPreferredSize() {

return new Dimension(320, 240);

}

public void update() {

this.setForeground(new Color(r.nextInt()));

}

@Override

public void paintComponent(Graphics g) {

super.paintComponent(g);

Dimension size = this.getSize();

int d = Math.min(size.width, size.height) - 10;

int x = (size.width - d) / 2;

int y = (size.height - d) / 2;

g.fillOval(x, y, d, d);

g.setColor(Color.blue);

g.drawOval(x, y, d, d);

}

}

}