2015-08-27 104 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); 
    } 
}