2016-08-19 50 views
0

我寫了兩種方式來顯示圖像時,JPanel數組綁定,但它不顯示圖像。單擊JPanel數組時顯示圖像

這是我的代碼:

public class Mutil_Image_2 implements MouseListener { 

    public JPanel [][]sub=new JPanel[10][10]; 
    public JPanel screen = new JPanel(); 

    public JFrame f = new JFrame("Draw on Panel"); 
    public static int v1,v2; 
    public static int x1 =1,y1=1; 

    public Mutil_Image_2(String title) 
    { 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setExtendedState(JFrame.MAXIMIZED_BOTH); //Full Screen 

     screen.setBorder(BorderFactory.createLineBorder(Color.black)); 
     screen.setLayout(new GridLayout(10,10));  

     int dem =0; 
     for (int i=0; i<=9;i++) 
     { 
      for (int j=0; j<=9;j++) 
      {     
       sub[i][j]= new JPanel(); 
       sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red));    
       screen.add(sub[i][j]); 

       v1=i; 
       v2=j;    
       sub[i][j].addMouseListener(this); 
       f.add(screen); 
      } 

     } 
     f.pack(); 
     f.setVisible(true); 
    } 
    public static void main(String args[]) 
    { 
     new Mutil_Image_2("Grid Layout");  
    } 

    public void mouseClicked(MouseEvent e) { 

    } 
    public void mouseEntered(MouseEvent e) { 
    } 
    public void mouseExited(MouseEvent e) { 
    } 
    public void mouseReleased(MouseEvent e) {  
    } 

    public void mousePressed(MouseEvent e) { 
     JPanel source = (JPanel) e.getSource();  
     BufferedImage img1; 

     if(e.getButton() == MouseEvent.BUTTON1)  
     {      
      x1=e.getX(); 
      y1=e.getY(); 
      //source.setBackground(Color.black); 
      source.setSize(500, 500); 

      try { // The first way to show Image 
       img1 = ImageIO.read(new File("D:\\Pict3.png")); 
       JLabel picLabel = new JLabel (new ImageIcon(img1)); 
       source.add(picLabel); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      source.add(new draw_Image_in_MultiPanel()); //Second way to show Image   
     } 
    } 
} 

class draw_Image_in_MultiPanel extends JPanel { 

    Image img1,img2; 

    public draw_Image_in_MultiPanel() {   
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setSize(screenSize.width, screenSize.height); 
    } 

    public void paint(Graphics g) { 
     super.paintComponent(g); 
     int vt1 = Mutil_Image_2.x1; 
     int vt2 = Mutil_Image_2.y1; 

     try 
     { 
       img1 = ImageIO.read(new File("D:\\Pict3.jpg"));      
       g.drawImage(img1, vt1, vt2, img1.getWidth(this),img1.getHeight(this) , Color.darkGray, this); 
       g.drawString("Postion is:" + vt1 + " -" + vt2, vt1,vt2); 


     } catch (IOException e) {   
      e.printStackTrace(); 
     }   
    } } 

回答

0

試試這個你第一種方式:

source.add(picLabel); 
    //Followed by 
    source.revalidate(); 

對於你的第二個辦法:

source.add(new draw_Image_in_MultiPanel()); 
    //Again followed by 
    source.revalidate(); 

一般來說,當您添加或在將JFrame設置爲可見之後更改組件,您應該在t上調用「revalidate()」他的容器。這告訴Java更新UI佈局。我很確定這是你的問題。

編輯

與您的代碼玩耍後,它在我看來,調整大小和編輯JPanels將會給你帶來了很多頭疼的。相反,我想出了一個使用JDialog在您點擊面板時顯示圖像的例子。這個JDialog作爲一個面板,你可以在任何地方繪製,它總是在你的其他面板上方。這也意味着您的所有面板可以保持相同的尺寸。它還簡化了用戶在其他地方點擊時關閉面板。 所有你的代碼都是一樣的(減去我刪除的內部類)我對你的代碼所做的任何編輯或刪除都被註釋掉了,所以你可以看到我改變了什麼以及爲什麼。

public class Mutil_Image_2 implements MouseListener { 


//A JDialog to show your image 
public JDialog popup; 
//A JPanel to store the last panel that was clicked. 
public JPanel lastPane; 

public JPanel[][] sub = new JPanel[10][10]; 
public JPanel screen = new JPanel(); 

public JFrame f = new JFrame("Draw on Panel"); 
public static int v1, v2; 
public static int x1 = 1, y1 = 1; 

public Mutil_Image_2(String title) { 
    //Popup that is owned by your JFrame f. 
    popup = new JDialog(f); 
    //Initial location 
    popup.setLocation(0, 0); 
    //Initial size same as source in your original code. 
    popup.setSize(500, 500); 
    //Removes the window controls from the popup to make it look like a JPanel 
    //Setting this to false will make the popup look like a JFrame. 
    popup.setUndecorated(true); 


    //Your original code for drawing all the JPanels 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setExtendedState(JFrame.MAXIMIZED_BOTH); // Full Screen 

    screen.setBorder(BorderFactory.createLineBorder(Color.black)); 
    screen.setLayout(new GridLayout(10, 10)); 

    int dem = 0; 
    for (int i = 0; i <= 9; i++) { 
     for (int j = 0; j <= 9; j++) { 
      sub[i][j] = new JPanel(); 
      sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red)); 
      screen.add(sub[i][j]); 

      v1 = i; 
      v2 = j; 
      sub[i][j].addMouseListener(this); 
      f.add(screen); 
     } 

    } 
    f.pack(); 
    f.setVisible(true); 
} 

public static void main(String args[]) { 
    new Mutil_Image_2("Grid Layout"); 
} 

public void mouseClicked(MouseEvent e) {} 
public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public void mouseReleased(MouseEvent e) {} 

public void mousePressed(MouseEvent e) { 
    JPanel source = (JPanel) e.getSource(); 
    BufferedImage img1; 



    if (e.getButton() == MouseEvent.BUTTON1) { 

     //Close the popup if the same panel was clicked twice 
     if(lastPane != null){ 
      if(lastPane.equals(source)){ 
       popup.setVisible(false); 
       lastPane = null; 
       return; 
      } 
     } 
     //If the above test was false we are clicking a different panel 
     //assign this panel to lastPane so we can close the popup if 
     //this pane is clicked again 
     lastPane = source; 

     //We now get the position of the click in the frames coordinates 
     //Using e.getX/Y will return the click in panel coordinates, we don't want 
     //that as we are positioning the popup relative to the JFrame. 
     x1 = f.getMousePosition().x; 
     y1 = f.getMousePosition().y; 

     //Position the popup on the mouse click 
     popup.setLocation(x1, y1); 

     //Old code 
     //x1 = e.getX(); 
     //y1 = e.getY(); 
     // source.setBackground(Color.black); 
     //source.setSize(500, 500); 

     try { // The first way to show Image 
      img1 = ImageIO.read(new File("D:\\Pict3.png")); 
      JLabel picLabel = new JLabel(new ImageIcon(img1)); 

      //Remove any components in the popups content pane 
      //this essemntially gives up a fresh panel inside 
      //the popup. 
      popup.getContentPane().removeAll(); 
      //add picture to popup 
      popup.add(picLabel); 
      //show popup 
      popup.setVisible(true); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

}

給一個嘗試,我相信這是你在找什麼,我能想到的最簡單的方法來做到這一點。

迴應您關於定位圖像的其他問題: 您可以在彈出窗口的內容窗格上使用佈局管理器,也可以將彈出窗口的佈局管理器設置爲空,並在您的JLabel上使用設置位置。

如果您有任何其他問題,請不要猶豫,問:) :)

+0

非常感謝我給你。我試着和它適用於第一種方式,但在第二個方法的Java說: 在java.security.AccessController.doPrivileged(本機方法) \t在java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(來源不明) \t在java.awt.EventQueue.dispatchEvent(未知來源) \t在java.awt.EventDispatchThread.pumpOneEventForFilters(未知來源) \t在java.awt.EventDispatchThread.pumpEventsForFilter(未知來源) \t在java.awt.EventDispatchThread.pumpEventsForHierarchy(未知來源) –

+0

這很有趣,我似乎無法複製那個錯誤。 –

+0

您是否需要執行第一種方式和第二種方式,或者是否希望只有在第一種方式失敗時才執行第二種方式。如果是後者,嘗試在catch塊中粘貼第二個.add調用。如果兩種方法都打算做同樣的事情,那麼使用這兩種方法有點多餘。 –