2014-07-09 3 views
1

GUI가 여러 개 있고 NetBeans GUI Builder를 사용하고 있습니다. 다음 중 하나를 클릭하면 그림이 포함 된 다른 프레임을 여는 것이 좋습니다.Java GUI에서 이미지를 업데이트하는 방법

그래서 나는 청취자 (actionPerformed)와 버튼을 연관 시키며, 클릭하면 실제로 새 프레임을 게시합니다.

새 프레임에서 나는 JLabel을 왁스 칠 한 다음 레이블의 이미지를 연관시킵니다.

label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/tree.png"))); 

내 문제는 그림이 프로그램의 실행 중에 덮어 여러 번 프레임에 아직 변경되지 않은 점이다 : 나는 그 넷빈즈이 코드를 생성하는 할 보았다. 즉, 새 프레임에는 항상 이미지의 이전 버전이 표시됩니다.

이미지를 항상 최신 상태로 유지하려면 어떻게해야합니까? 당신에게 대단히 감사합니다


강령 : 내가 지금처럼 아이콘의 생성과 JLabel의에의 setIcon 분리해서 것

package View; 

import Controller.Util; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 

public class AlberoIpotesi extends javax.swing.JFrame { 

    /** Creates new form AlberoIpotesi */ 
    public AlberoIpotesi() { 
     initComponents(); 

     remove(label); 
     revalidate(); 
     repaint(); 
     Decifra.sessioneDec.toString(".../src/img/tree"); 
     revalidate(); 
     repaint(); 
    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jLabel1 = new javax.swing.JLabel(); 
     scroll = new javax.swing.JScrollPane(); 
     label = new javax.swing.JLabel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 
     setTitle("Albero delle ipotesi"); 

     jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N 
     jLabel1.setText("Albero delle ipotesi"); 

     label.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/tree.png"))); // NOI18N 
     label.setVerticalAlignment(javax.swing.SwingConstants.TOP); 
     scroll.setViewportView(label); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(29, 29, 29) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(scroll, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jLabel1)) 
      .addContainerGap(29, Short.MAX_VALUE)) 
    ); 
     layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jLabel1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(scroll, javax.swing.GroupLayout.PREFERRED_SIZE, 374, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(25, Short.MAX_VALUE)) 
    ); 

     pack(); 
    }// </editor-fold>       

    /** 
    * @param args the command line arguments 
    */ 
    public static void start() { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
     } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(AlberoIpotesi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(AlberoIpotesi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(AlberoIpotesi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(AlberoIpotesi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new AlberoIpotesi().setVisible(true); 
     } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JLabel jLabel1; 
    public static javax.swing.JLabel label; 
    public static javax.swing.JScrollPane scroll; 
    // End of variables declaration     
} 
+0

기능을 시도하십시오. revalidate(); 그리고 repaint(); – schlagi123

+0

@ schlagi123 답장을 보내 주셔서 감사 합니다만 작동하지 않습니다. 이미지는 항상 업데이트되지 않습니다 ... – user3602008

+0

상기 프레임의 코드를 추가 할 수 있습니까? –

답변

2

:

ImageIcon icon = new ImageIcon("path/to/picture.png"); 
label.setIcon(icon); 

그 방법을 나중에 아이콘의 이미지를 변경하고 레이블을 업데이트 할 수 있습니다.

icon = new ImageIcon("path/to/new_picture.png"); // Changes the icon 
label.setIcon(icon); // Updates the label's icon 
+0

답장을 보내 주셔서 감사합니다.하지만 다른 것이 필요합니다. 두 개의 서로 다른 이미지가 아닌 하나의 이미지 (동일한 이름과 동일한 경로)가 업데이트되었습니다. – user3602008

0

그래서 기본적으로 이해하고 싶은 것은 바로 표시하고자하는 프레임의 새 인스턴스 객체를 만드는 버튼이 있다는 것입니다. 그런 다음 프로젝트의 특정 위치에 이미지가 저장되어 업데이트 된 이미지를 표시하도록 객체를 호출합니다.

프레임 실행 방법을 알지 못합니다. 그러나 내가 제안 할 수있는 것은 매개 변수화 된 생성자를 사용하여 프레임이 호출 될 때마다 (필요할 경우) 이미지를 변경한다는 것입니다.

https://www.dropbox.com/s/mpqvy9hgsvsgq9t/PeanutsAndPretzels.zip

나는 계약 유래의 조건 및 외부 프로젝트 파일의 모르겠습니다. 그러나 나는 너를 도울지도 모른다 무언가를 집계했다. 아마 아이디어를 얻기 위해 배쉬를 줘.

+0

나는 당신의 프로젝트를 운영했는데 그것이 내가 필요한 것이 아니다. 수정되지 않은 두 개의 정적 이미지가 있습니다. 버튼을 클릭 할 때마다 생성되는 이미지가 있습니다 (항상 같은 이름과 경로가 사용됩니다). 기본적으로 작업 (추가, 제거 등)을 수행하는 일반 트리가 있습니다. 버튼을 클릭하면 Graphviz를 사용하여 트리의 이미지를 생성하는 메소드가 호출됩니다. 시간이 지남에 따라 하나의 이미지가 변경됩니다. – user3602008

관련 문제