绘制到Jpanel

时间:2017-10-12 16:47:03

标签: java swing canvas jframe jpanel

我目前正在尝试制作一个可以绘制内容的画布,并将其显示在JFrame中。

为此,我打算在一个JPAnel组件中有一个bufferedImage,paintComponent方法可以从中绘制。

理想情况下,从给定的JFrame中我希望能够引用这个缓冲的图像,然后使用其Graphics2D绘制内容,paintComponent方法可以在使用缓冲的图像绘制时显示它。

我这样做是为了避免直接使用paintcomponent方法,我希望能够从程序中的任何位置引用这个画布,并在调用帧repaint()方法时绘制它。

class MyPanel extends JPanel {
    BufferedImage img = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
    Graphics2D  imgG2 = img.createGraphics();

    public Graphics2D getGraphics() {
        return imgG2;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        int w = img.getWidth();
        int h = img.getHeight();
        g2.drawImage(img, 0, 0, w, h, null);
    }
}
class Main {

private static JFrame createAndShowGui() {
      JFrame frame = new JFrame("droneFrame");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.add(new MyPanel());
      frame.setSize(500, 500);
      frame.setResizable(false);
      frame.setVisible(true);

      return frame;
}

public static void main(String args[]) {
    JFrame frame = createAndShowGui();

    //Something here to reference the inner Jpanels imgG2 field, and draw to it.

    frame.repaint();
    //Draw whatever is currently in the buffered image.
}
}

但是,我不知道如何做到这一点,因为frame.getComponent(0)只返回一个Component,而不是它的特定组件类型。

提前致谢。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,您需要将JFrame的内容窗格设置为JPanel,然后引用缓冲图像的图形,您需要获取JFrame的内容窗格,并将其向下转换为特定类型MyPanel。

现在您的内容窗格格式正确,并且可以引用图形,因为它现在具有该字段。