Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java绘图最简单的方法是什么?_Java_Swing_Paint - Fatal编程技术网

用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

用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 = 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。