在没有继承的情况下绘制到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
您发现getGraphics()
不会以这种方式工作,因为在渲染组件之前获取的Graphics对象为null,即使它不为null,也不稳定,并且在每次重绘时都变得无效。可能的选项包括:
- 从每个Image创建ImageIcon,将图标放入JLabel并显示JLabel。
- 咬住项目符号并扩展JPanel或其他JComponent(不要说你为什么试图避免这种情况),并在JPanel的paintComponent方法中显示图像。
- 这样做,但首先创建一个显示在
paintComponent(...)
方法中的BufferedImage。然后,您可以在程序运行期间修改BufferedImage,如果您需要更改显示,添加新图像...
我使用的图像是在运行时生成的,所以我(据我所知)无法制作imageIcon。我不想扩展JPanel的原因是我的代码实际上是用于生成图像背后的结构,并且显示它们大多只是一个有用的实用工具(在此之前,我使用了一个复杂的toString,但它已经达到了我无法理解它,所以我创建了这个。如何创建一个BufferedImage来显示? – 2012-03-27 17:36:31
@g。火箭:你在运行期间无法制作ImageIcon的假设是错误的,这应该是有道理的,因为为什么运行的应用程序会阻止创建类?我发现“接受”的答案与我上面的第3点相同。 – 2012-03-27 19:58:18
我知道你可以在运行时从图像文件(坐在硬盘驱动器)上制作一个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
不这样做,是这样,不创建大量的
JFrames
,这些Object
停留在内存中,直到当前的JVM实例存在,从这个概念产生的结果很可能是OutOfMemory exceptions
不会产生大量的
JFrames
,只创建一个JFrame
的Containers
其余部分可能是JDialog
或JWindow
不创建一个新的
JFrames
,JDialogs
或JWindows
上运行时,re_use现有Containers
把这些图像Icon S到JList也许更好的会看CardLayout
但是,如何将BufferedImage绘制到JPanel? – 2012-03-27 17:46:23
要在JPanel上绘制BufferedImage,您需要继承JPanel并在paintComponent方法内调用g.drawImage(myBufferedImage,x,y,...) – ControlAltDel 2012-03-27 19:28:20