Java 将png文件绘制到swing GUI时出现问题

Java 将png文件绘制到swing GUI时出现问题,java,swing,Java,Swing,我面临的一个问题是,我无法将png图像绘制到swing GUI的JPanel(之后我将其添加到JScrollPane) 这是我的代码,我正试图使用它 if(processCreated == true){ System.out.println("updating tree of organisms"); processCreated = false; updateTree(); try { Thread.sleep(100);

我面临的一个问题是,我无法将png图像绘制到swing GUI的
JPanel
(之后我将其添加到
JScrollPane

这是我的代码,我正试图使用它

if(processCreated == true){
     System.out.println("updating tree of organisms");
     processCreated = false; 
     updateTree();
     try {
        Thread.sleep(100);
     } catch (InterruptedException ex) {
        Logger.getLogger(Svet.class.getName()).log(Level.SEVERE, null, ex);
     }
     tree = new File(path+"/out.png"); //File
     try {
        treeImage = ImageIO.read(tree); //BufferedImage
        tp = new TreePane(treeImage.getScaledInstance( 500, 500 ,treeImage.SCALE_SMOOTH)); // my class, implementation below
        treeOutput.add(tp); //adding "JPanel" with picture into GUI
        treeOutput.repaint();
     } catch (IOException ex) {
        Logger.getLogger(Svet.class.getName()).log(Level.SEVERE, null, ex);
     }
}
在此之后,
JScrollPane
仍为空。我的代码有什么问题吗?你可以在评论中找到什么是什么

这是我的
TreePane
课程

public class TreePane extends JPanel{
   Image img;

   public TreePane( Image img ){
      this.img = img;
   }

   public void paintComponent(Graphics g){
      super.paintComponent(g);
      int imgX = 0;
      int imgY = 0;

      g.drawImage(img, imgX, imgY, this);
   }
}

很可能你的树面板的尺寸是0,0,因此你永远看不到任何东西。尝试在paintComponent中添加断点并进行检查-它可能永远不会被调用

要修复此问题,应在将树面板添加到JScrollPane之前显式设置树面板的大小

    tp = new TreePane(treeImage.getScaledInstance( 500, 500 ,treeImage.SCALE_SMOOTH)); // my class, implementation below
    tp.setSize(myWidth, myHeight);
    treeOutput.add(tp); //adding "JPanel" with picture into GUI
    treeOutput.repaint();

很可能你的树面板的尺寸是0,0,因此你永远看不到任何东西。尝试在paintComponent中添加断点并进行检查-它可能永远不会被调用

要修复此问题,应在将树面板添加到JScrollPane之前显式设置树面板的大小

    tp = new TreePane(treeImage.getScaledInstance( 500, 500 ,treeImage.SCALE_SMOOTH)); // my class, implementation below
    tp.setSize(myWidth, myHeight);
    treeOutput.add(tp); //adding "JPanel" with picture into GUI
    treeOutput.repaint();

TreePane
的首选大小是(0,0),这就是滚动窗格使用的大小。您可以覆盖
getPreferredSize()
,但最简单的方法是只使用
JLabel
来显示图像。我同意@kiheru的观点:不要让事情变得困难——使用JLabel,将其放入JScrollPane,然后简单地设置其图标。
TreePane
的首选大小是(0,0),这就是滚动窗格使用的大小。您可以覆盖
getPreferredSize()
,但最简单的方法是只使用
JLabel
来显示图像。我同意@kiheru的观点:不要让事情变得困难——使用JLabel,将其放入JScrollPane,然后简单地设置其图标。与其设置大小,还不如设置一些大多数布局管理者不尊重的东西,为什么不让它重写
getPreferredSize
,并根据图像的大小确定返回值?实际上,简单地将一个JLabel放入JScrollPane并设置其图标可能更容易。这也很有帮助。但在我自己的解决方案中,问题在于使用Swing组件,而使用AWT组件则效果良好。谢谢大家的帮助。与其设置大小,大多数版面管理员不尊重的东西,为什么不让它覆盖
getPreferredSize
,并将返回值基于图像的大小?实际上,更简单的方法可能是将一个JLabel放入JScrollPane并设置其图标。这也很有帮助。但在我自己的解决方案中,问题在于使用Swing组件,而使用AWT组件则效果良好。谢谢大家的帮助。