用Java绘图最简单的方法是什么?
用Java绘图最简单的方法是什么用Java绘图最简单的方法是什么?,java,swing,paint,Java,Swing,Paint,用Java绘图最简单的方法是什么 import java.awt.*; import javax.swing.*; public class Canvas { private JFrame frame; private Graphics2D graphic; private JPanel canvas; public Canvas() { frame = new JFrame("A title"); canvas
import java.awt.*;
import javax.swing.*;
public class Canvas
{
private JFrame frame;
private Graphics2D graphic;
private JPanel canvas;
public Canvas()
{
frame = new JFrame("A title");
canvas = new JPanel();
frame.setContentPane(canvas);
frame.pack();
frame.setVisible(true);
}
public void paint(Graphics g){
BufferedImage offImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Grapics2D g2 = offImg.createGraphics();
g2.setColor(new Color(255,0,0));
g2.fillRect(10,10,200,50);
}
}
这不起作用,我不知道如何让任何东西出现。要使某些东西出现在paintGraphics g中,需要在该图形上调用fillRect等绘图方法。您正在创建位图,然后绘制到位图,而不是屏幕
public void paint(Graphics g){
g.setColor(new Color(255,0,0));
g.fillRect(10,10,200,50);
}
}
最简单的方法:
public class Canvas extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// painting code goes here.
}
}
您只需扩展JPanel并覆盖面板的paintComponent方法
我想重申,您不应该覆盖绘制方法
这里有一个非常简单的例子,它是有效的
public static void main(String[] args) {
JFrame f = new JFrame();
JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 0, 100, 100);
}
};
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
jjnguy已经写了如何正确地做这件事。。。但在您的示例中,它不起作用的原因如下:
import java.awt.*;
import javax.swing.*;
public class Canvas
这里有一个与Swing或AWT没有任何关系的类。
顺便说一下,您可能需要选择另一个名称,以避免与java.awt.Canvas混淆
在这里,您正在为混乱创建一个新的JPanel,也称为canvas,并将其添加到框架中。
是此面板的paint和paintComponent方法,在系统显示帧时调用这些方法
frame.pack();
frame.setVisible(true);
}
public void paint(Graphics g){
BufferedImage offImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Grapics2D g2 = offImg.createGraphics();
g2.setColor(new Color(255,0,0));
g2.fillRect(10,10,200,50);
}
此绘制方法从未使用过,因为它不是组件的一部分,如果要调用它,则仅绘制到某个缓冲区图像,而不是屏幕
public void paint(Graphics g){
g.setColor(new Color(255,0,0));
g.fillRect(10,10,200,50);
}
}
有没有不覆盖绘制的具体原因?@Neo,这与绘制周期有关。如果您覆盖了绘画,您可以改变组件的绘画周期。@Neo,这里有一个来自Sun的例子,它覆盖了绘画组件-@Neo覆盖绘画通常会使它忘记需要绘制的组件。它适用于简单、幼稚的程序,但当您变得更复杂时,您会发现您的底层内容不再被绘制,并且没有任何意义。对于自定义绘制,JPanel几乎没有什么功能可以做到JComponent无法做到的。除非需要一些额外的JPanel方法,否则改用JComponent是有意义的。我希望每个人都不要再建议重写paint。Swing中的自定义绘制是通过覆盖paintComponent来完成的。有关详细信息,请阅读有关自定义绘制的Swing教程。这是Swing,而不是AWT,您应该覆盖paintComponent而不是paint。