【问题标题】:drawing to a JPanel without inheritance在没有继承的情况下绘制到 JPanel
【发布时间】:2012-03-28 01:58:39
【问题描述】:

现在我正在开发一个程序,该程序会抛出一堆单独的(在运行时生成的)图像,每个图像都在它们自己的窗口中。为此,我尝试了这种方法:

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)?任何帮助,将不胜感激。

【问题讨论】:

    标签: java swing jpanel


    【解决方案1】:

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

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

    【讨论】:

    • 我如何将 BufferedImage 绘制到 JPanel?
    • 要在 JPanel 上绘制 BufferedImage,您需要继承 JPanel 并在 paintComponent 方法中调用 g.drawImage(myBufferedImage, x, y, ...)
    【解决方案2】:

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

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

    【讨论】:

    • 我使用的图像是在运行时生成的,所以我(据我所知)无法制作 imageIcon。我不想扩展 JPanel 的原因是我的代码实际上是用于生成图像背后的结构,并且显示它们主要只是一个有用的实用程序(在此之前我使用了一个复杂的 toString,但它达到了我的目的看不懂,所以我创建了这个。如何创建一个 BufferedImage 来显示?
    • @g.rocket:您关于在运行时无法创建 ImageIcon 的假设是错误的,这应该是有道理的,因为为什么正在运行的应用程序会阻止创建类?我看到“接受”的答案与我上面的第三个要点相同。
    • 我知道您可以在运行时从图像文件(位于硬盘驱动器上)制作 ImageIcon,但据我所知,我无法对 ImageIcon 进行自定义绘图,这就是我正在尝试做
    • 是的,差不多,但它解释了更多如何这样做,我不明白
    • @g.rocket:同样,我不确定您所说的“您不能自定义绘图到 ImageIcon”是什么意思。当然可以——你可以做任何你喜欢的自定义绘图。 ImageIcon 基于图像。如果您在“运行时”绘制到 BufferedImage,则可以随时从该图像创建 ImageIcon。
    【解决方案3】:
    a program that throws up a bunch of separate (generated at runtime) images, 
    each in their own window
    
    1. 不要那样做,不要创建很多JFrames,这些Object留在内存中,直到当前JVM实例存在,这个概念的结果很可能是@987654327 @

    2. 不要创建很多JFrames,只创建一个JFrame,其余的Containers可以是JDialogJWindow

    3. 不要在运行时创建新的JFramesJDialogsJWindows,重新使用现有的Containers

    4. 将这些图像作为Icons 放到JList 中,或者最好看看CardLayout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2012-12-10
      • 2012-08-05
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多