我想我需要在注释所在位置放一些代码(或者使用非静态方法,但我不确定)。 main方法创建窗口,然后启动图形方法。我希望蓝色方块能够闪现。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class paintTest extends JPanel{
private static JFrame theWindow = new JFrame("Window");
static boolean blueSqr = false;
public void paint(Graphics g) {
g.setColor(Color.RED);
g.fillRect(10, 10, 10, 10);
if(blueSqr){
g.setColor(Color.BLUE);
g.fillRect(10, 10, 10, 10);
}
}
public static void main(String[] args){
createWindow();
theWindow.getContentPane().add(new paintTest());
while(true){
blueSqr = false;
System.out.println("off");
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
blueSqr = true;
// Needs something here
System.out.println("on");
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}
}
public static void createWindow(){
theWindow.setSize(500, 500);
theWindow.setLocationRelativeTo(null);
theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theWindow.setVisible(true);
}
}
任何帮助都会非常好。
答案 0 :(得分:5)
使用Swing Timer
来呼叫repaint()
。另外,在paintComponent()
中覆盖JPanel
,而不是paint()
。
这样的事情:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PaintTest extends JPanel{
boolean blueSqr = false;
PaintTest() {
setPreferredSize(new Dimension(100,25));
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
blueSqr = !blueSqr;
repaint();
}
};
Timer timer = new Timer(1000,al);
timer.start();
}
public void paintComponent(Graphics g) {
Color c = (blueSqr ? Color.BLUE : Color.RED);
g.setColor(c);
g.fillRect(10, 10, 10, 10);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame theWindow = new JFrame("Window");
theWindow.getContentPane().add(new PaintTest());
createWindow(theWindow);
}
});
}
public static void createWindow(JFrame theWindow){
theWindow.pack();
theWindow.setLocationByPlatform(true);
theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theWindow.setVisible(true);
}
}
还有其他一些改进我无法记录(代码比言语更响亮)。如果您有任何疑问(请先查看文档),请询问。
答案 1 :(得分:4)
你的问题是
1)通过在Swing相关代码中调用Thread.sleep(int)
,永远不要这样做,以便延迟Swing(有很多关于为什么不在编程语言中使用sleep的主题......)使用Swing Timer
2)您的JPanel
不会返回任何XxxSize
3)对于Swing使用paintComponent()
,只有在您有非常重要的原因时才使用方法paint()
更多关于重绘和动画2D Graphics tutorial
4)Swing GUI应该在Event Dispatch Thread
中构建