现在我正在开发一个程序,它会抛出一堆独立的(在运行时生成的)图像,每个图像都在自己的窗口中。为此,我尝试了这种方法:
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)?任何帮助,将不胜感激。
答案 0 :(得分:4)
您发现getGraphics()
无法以这种方式工作,因为获取的Graphics对象在呈现组件之前为null,即使它不为null,也不稳定且变为无效每次重绘。可能的选项包括:
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
不要这样做,不要创建大量的JFrames
,这些Object
保留在内存中,直到当前的JVM实例存在,结果来自这个概念漂亮可能是OutOfMemory exceptions
不要创建大量JFrames
,只创建一个JFrame
,Containers
的其余部分可以是JDialog
或JWindow
不要在运行时创建新的JFrames
,JDialogs
或JWindows
,重新使用现有的Containers
将这些图片作为Icon添加到JList,或者更好地查看CardLayout