我的应用程序不是面向JFrame的,它只使用一个输出。我只需要告诉它在这里画一个矩形,现在清除屏幕,几百次。为此,我在main中编写了以下代码,根据我的理解,应该将整个JFrame清除为漂亮的蓝色背景颜色。
JFrame frame = new JFrame("Maze Master Premium Super-Deluxe V199.39");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int resolution = 20;
int frameWidth = horiz * resolution;
int frameHeight = vert * resolution;
frame.setMinimumSize(new Dimension(frameWidth, frameHeight));
frame.setSize(frameWidth, frameHeight);
frame.pack();
frame.setVisible(true);
frame.toFront();
Graphics g = frame.getGraphics();
g.setPaintMode();
g.setColor(Color.BLUE);
//Clear background
g.fillRect(0, 0, frameWidth, frameHeight);
frame.update(g);
但是当我运行它时,JFrame会以默认的浅灰色背景颜色显示。我是否必须让我的类扩展JFrame,或者是否足以使用frame.update(g)并且我只是得到其他错误?
答案 0 :(得分:3)
从你的问题来看,很难准确掌握你想要实现的目标。你只是想改变框架的背景颜色或执行一些自定义绘画???
这Graphics g = frame.getGraphics()
永远不是一个好主意。除了getGraphics
可能返回null
之外,图形在Java中是无状态的,这意味着您用于绘制的图形上下文可能会在绘制周期之间发生变化,您绝不应该依赖或保持对它的引用。
除了错误的方法之外,JFrame
包含一些数字组件,它们在它上面呈现,所以即使这种方法有效,你也不会看到任何差异,因为框架实际上是由其他组件(JRootPane
及其内容窗格)
自定义绘画应该使用其中一种Component
绘画方法。
以下示例使用许多技术来更改和更新帧的内容。
首先,它用我们自己的组件替换内容窗格。这总是必需的,但因为我在框架上进行自定义绘画,所以它是最简单的。我可以简单地将PaintPane
添加到框架中以获得类似的结果。
其次,我使用setBackground
来更改组件的背景。
第三,我重写paintComponent
以便在我的组件上执行自定义绘制。
public class SimplePaint01 {
public static void main(String[] args) {
new SimplePaint01();
}
public SimplePaint01() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setContentPane(new PaintPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PaintPane extends JPanel {
private int angle = 0;
private Rectangle shape = new Rectangle(0, 0, 100, 100);
public PaintPane() {
setBackground(Color.RED);
Timer timer = new Timer(16, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
angle += 5;
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = ((getWidth() - shape.width) / 2);
int y = ((getHeight() - shape.height) / 2);
shape.x = x;
shape.y = y;
g2d.setColor(Color.BLUE);
g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(angle), x + (shape.width / 2), y + (shape.height / 2)));
g2d.fill(shape);
g2d.dispose();
}
}
}