2015-08-27 70 views
1

我是Java GUI的新手,并且遇到显示图像的问题。我的目的是显示一个大的图像,并允许用户点击图像的区域来指示特定位置的位置。无论如何,尽管读了甲骨文的解释和其他解决方案,我甚至无法让图片出现。显示图像,Java

我创建了一个JFrame并使用它的setContentPane()方法来添加一个JPanel和JLabel。我使用JLabel的setIcon()方法来添加一个图像,或者至少这是我的意图...

任何意见是赞赏,特别是如果有更好的方式做到这一点。我将使用OpenCV处理图像,并计划在显示它们之前将它们转换为Java图像(或BufferedImage)。

这是代码。为了节省空间,我排除了图书馆。

public class Pathology { 
    public static void main(String[] args) { 
     PrimaryFrame primaryFrame = new PrimaryFrame(); 
     primaryFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     primaryFrame.setSize(1500, 900); 
     primaryFrame.setVisible(true);   
     primaryFrame.setContentPane(primaryFrame.getGui()); 

     try { 
      primaryFrame.setImage(ImageIO.read(new File("C:\\Users\\Benjamin\\Pictures\\Pathology\\C\\001.png"))); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

GUI类:

public class PrimaryFrame extends JFrame{ 
    //private JTextField textField1; 
    JPanel gui; 
    JLabel imageCanvas; 

    public PrimaryFrame() { 
     super("Pathology-1"); 
     //setLayout(new FlowLayout()); 

     //textField1 = new JTextField("Chup!", 50); 
     //add(textField1); 

    } 

    public void setImage(Image image) { 
     imageCanvas.setIcon(new ImageIcon(image)); 
    } 
    public void initComponents() { 
     if (gui==null) { 
      gui = new JPanel(new BorderLayout()); 
      gui.setBorder(new EmptyBorder(5,5,5,5)); 
      imageCanvas = new JLabel(); 

      JPanel imageCenter = new JPanel(new GridBagLayout()); 
      imageCenter.add(imageCanvas); 
      JScrollPane imageScroll = new JScrollPane(imageCenter); 
      imageScroll.setPreferredSize(new Dimension(300,100)); 
      gui.add(imageScroll, BorderLayout.CENTER); 
     } 
    } 

    public Container getGui() { 
     initComponents(); 
     return gui; 
    } 
} 

回答

4

你会笑我如果我告诉你,你就必须把primaryFrame.setVisible(true);的主要方法结束了吗? :)

为了进一步理解,您不必在每次要添加/更新帧中的某些内容(例如在ActionListener中)时调用frame.setVisible(true)。相反,您可以拨打frame.revalidate()frame.repaint()。 (凡框架可以与特定的面板更换)

+0

谢谢,LuxxMiner。我仍在努力掌握这些基本原理。 – horseatingweeds

2

您需要通话后setVisible(true)setImage()

primaryFrame.setImage(ImageIO.read(new 
    File("C:\\Users\\Benjamin\\Pictures\\Pathology\\C\\001.png"))); 

,因为将不会显示setVisible()之后的任何更新到GUI。

这就是它和代码应该是这样的:

public class Pathology { 
    public static void main(String[] args) { 
     PrimaryFrame primaryFrame = new PrimaryFrame(); 
     primaryFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     primaryFrame.setSize(1500, 900); 
     primaryFrame.setContentPane(primaryFrame.getGui()); 

     try { 
      primaryFrame.setImage(ImageIO.read(new File(
       "C:\\Users\\Benjamin\\Pictures\\Pathology\\C\\001.png"))); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     primaryFrame.setVisible(true); 
    } 
}