JFrame图形忽略前几个渲染



以下是查看错误的最小代码:

import javax.swing.*;
import java.awt.*;
public class Main1 extends JFrame {
static Main1 main;
public Main1() {
super("app");
}
public static void main(String[] args) {
main = new Main1();
main.setBounds(300, 300, 800, 500);
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setVisible(true);
Graphics g = main.getGraphics();
for(int i = 0; i < 100; i++){
g.setColor(new Color(255, 0, 0));
g.fillRect(0, 0, 800, 500);
}
}
}

如果我在";对于";循环,帧似乎没有被着色,但200个循环足以使其着色。

我想制作一个框架很少变化的应用程序,但这个功能破坏了代码的质量,因为我必须制作许多伪框架。

public static void main(String[] args) {
main = new Main1();
main.setBounds(300, 300, 800, 500);
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setVisible(true);
Graphics g = main.getGraphics();
for(int i = 0; i < 100; i++){
g.setColor(new Color(255, 0, 0));
g.fillRect(0, 0, 800, 500);
}
}

这不是Swing图形的制作方法。通过在组件上调用.getGraphics((来获取Graphics对象,会产生一个短暂的不稳定对象,有时是null对象。例如,创建的JFrame需要一些时间才能进行渲染,如果在渲染之前调用getGraphics()并尝试使用它,则该对象可能为null,当然不会wokr。

相反,根据教程,使用JVM提供的Graphics对象在JPanel的paintComponent方法中进行绘制:

public class MainPanel extends JPanel {
public MainPanel {
setPreferredSize(new Dimension(800, 500)));
setBackground(new Color(255, 0, 0)); // if you just want to set background
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);

// use g here do do your drawing
}
}

然后像这样使用:

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}  

教程:课程:执行自定义绘制

是的,如果你想驱动一个简单的动画,可以使用Swing Timer来帮助驱动它:

public class MainPanel extends JPanel {
private int x = 0;
private int y = 0;
public MainPanel {
setPreferredSize(new Dimension(800, 500)));
setBackground(new Color(255, 0, 0)); // if you just want to set background

// timer code:
int timerDelay = 15;
new Timer(timerDelay, ()-> {
x += 4;
y += 4;
repaint();
}).start();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);

// use g here do do your drawing
g.setColor(Color.BLUE);
g.drawRect(x, y, 20, 20);
}
}

最新更新