绘制到没有继承的JPanel

时间:2012-03-27 17:26:06

标签: java swing 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
}

但是,这会在draw中抛出NullPointerException,声称图形为null。有没有办法从外部向外部绘制JPanel(不是从JPanel继承并覆盖PaintComponent)?任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:4)

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

  • 从每个Image创建ImageIcon,将图标放在JLabel中并显示JLabel。
  • 咬住子弹并扩展JPanel或其他JComponent(你没有说明为什么要避免这种情况)并在JPanel的paintComponent方法中显示图像。
  • 执行上述操作,但首先创建一个显示在paintComponent(...)方法中的BufferedImage。然后你可以在程序运行期间修改BufferedImage,如果你需要更改显示,添加新图像,......

答案 1 :(得分:4)

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

创建一个BufferedImage,在其上调用getGraphics()以获取其Graphics对象,使用Graphics(2D)api绘制它,然后调用Graphics.dispose()(不是严格必要但是一个好习惯)并且像以前一样海报建议使用它创建一个ImageIcon并使用setIcon()或子类JPanel / JComponent放入JLabel并在paintComponent中绘制它

答案 2 :(得分:3)

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,重新使用现有的Containers

  4. 将这些图片作为Icon添加到JList,或者更好地查看CardLayout