在没有继承的情况下绘制到JPanel

问题描述:

现在我正在研究一个程序,它引发了一堆单独的(在运行时生成的)图像,每个图像都在它们自己的窗口中。要做到这一点,我已经试过这种方法:在没有继承的情况下绘制到JPanel

public void display(){ 
    JFrame window = new JFrame("NetPart"); 
    JPanel canvas = new JPanel(); 
    window.getContentPane().add(canvas); 
    Graphics g = canvas.getGraphics(); 
    Dimension d = getSize(); 
    System.out.println(d); 
    draw(g,new Point(d.minX*50,d.maxY*50), 50); 
    window.setSize(d.size(50)); 
    window.setResizable(false); 
    window.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    window.setVisible(true); 
} 

public void draw(Graphics g, Point startLoc, int scale){ 
    // generate and draw the image 
} 

public Dimension getSize(){ 
    //returns my own dimensions class 
} 

但是,这将引发NullPointerException异常的平局,声称图形为空。有没有办法从外部向外部绘制JPanel(不是从JPanel继承并重写PaintComponent)?任何帮助,将不胜感激。

如果您在运行时绘制图像,则应使用BufferedImage。

创建一个BufferedImage,它调用的getGraphics()来获得它的图形对象,使用图形(2D)API绘制到它,然后调用Graphics.dispose()(不是绝对必要的,但一个良好的习惯),并作为以前的海报建议要么使用它创建一个ImageIcon和使用setIcon()来或子类的JPanel/JComponent的放在一个JLabel并绘制它的paintComponent

+0

但是,如何将BufferedImage绘制到JPanel? – 2012-03-27 17:46:23

+0

要在JPanel上绘制BufferedImage,您需要继承JPanel并在paintComponent方法内调用g.drawImage(myBufferedImage,x,y,...) – ControlAltDel 2012-03-27 19:28:20

您发现getGraphics()不会以这种方式工作,因为在渲染组件之前获取的Graphics对象为null,即使它不为null,也不稳定,并且在每次重绘时都变得无效。可能的选项包括:

  • 从每个Image创建ImageIcon,将图标放入JLabel并显示JLabel。
  • 咬住项目符号并扩展JPanel或其他JComponent(不要说你为什么试图避免这种情况),并在JPanel的paintComponent方法中显示图像。
  • 这样做,但首先创建一个显示在paintComponent(...)方法中的BufferedImage。然后,您可以在程序运行期间修改BufferedImage,如果您需要更改显示,添加新图像...
+0

我使用的图像是在运行时生成的,所以我(据我所知)无法制作imageIcon。我不想扩展JPanel的原因是我的代码实际上是用于生成图像背后的结构,并且显示它们大多只是一个有用的实用工具(在此之前,我使用了一个复杂的toString,但它已经达到了我无法理解它,所以我创建了这个。如何创建一个BufferedImage来显示? – 2012-03-27 17:36:31

+0

@g。火箭:你在运行期间无法制作ImageIcon的假设是错误的,这应该是有道理的,因为为什么运行的应用程序会阻止创建类?我发现“接受”的答案与我上面的第3点相同。 – 2012-03-27 19:58:18

+0

我知道你可以在运行时从图像文件(坐在硬盘驱动器)上制作一个ImageIcon,但据我所知我无法自定义绘制到ImageIcon,这正是我想要做的 – 2012-03-27 23:24:28

a program that throws up a bunch of separate (generated at runtime) images, 
each in their own window 
  1. 不这样做,是这样,不创建大量的JFrames,这些Object停留在内存中,直到当前的JVM实例存在,从这个概念产生的结果很可能是OutOfMemory exceptions

  2. 不会产生大量的JFrames,只创建一个JFrameContainers其余部分可能是JDialogJWindow

  3. 不创建一个新的JFramesJDialogsJWindows上运行时,re_use现有Containers

  4. 把这些图像Icon S到JList也许更好的会看CardLayout