2009-11-28 8 views
1

Netbeans GUI 빌더를 사용하고 있습니다 만, 조금 혼란 스럽습니다. 패널에 이미지를 추가하려면 어떻게합니까? 나는 그것이 올바르게하고 있다고 생각하지만 그것은 나타나지 않는다. init() 메소드에 있어야한다고 생각하지만 netbeans에서는 코드의 해당 부분을 변경할 수 없습니다.Jpanel에 이미지를 표시 할 수 없습니다.

//these four lines I added to add the image 
     imageIcon = new ImageIcon("login_icon.png"); 
     image = new JLabel(imageIcon); 
     image.setToolTipText("SGS Security"); 
     topPanel.add(image); 

내 클래스는 여기서 시작 :

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/* 
* Login.java 
* 
* Created on Oct 27, 2009, 8:34:15 PM 
*/ 

package sgs; 

import javax.swing.ImageIcon; 
import javax.swing.JLabel; 


public class Login extends javax.swing.JFrame { 

    JLabel image; 
    ImageIcon imageIcon; 

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

    //these four lines I added to add the image 
     imageIcon = new ImageIcon("login_icon.png"); 
     image = new JLabel(imageIcon); 
     image.setToolTipText("SGS Security"); 
     topPanel.add(image); 
    } 



    /** 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() { 

     topPanel = new javax.swing.JPanel(); 
     userLabel = new javax.swing.JLabel(); 
     passwordLabel = new javax.swing.JLabel(); 
     connectLabel = new javax.swing.JLabel(); 
     forgotPassLabel = new javax.swing.JLabel(); 
     forgotPassCheckBox = new javax.swing.JCheckBox(); 
     cancelButton = new javax.swing.JButton(); 
     okButton = new javax.swing.JButton(); 
     passwordTextField = new javax.swing.JTextField(); 
     userTextField = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setBackground(new java.awt.Color(216, 156, 60)); 

     topPanel.setBackground(new java.awt.Color(28, 90, 198)); 

     javax.swing.GroupLayout topPanelLayout = new javax.swing.GroupLayout(topPanel); 
     topPanel.setLayout(topPanelLayout); 
     topPanelLayout.setHorizontalGroup(
      topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 406, Short.MAX_VALUE) 
     ); 
     topPanelLayout.setVerticalGroup(
      topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 71, Short.MAX_VALUE) 
     ); 

     userLabel.setText("User name:"); 

     passwordLabel.setText("Password:"); 

     connectLabel.setText("Connect to SGS"); 

     forgotPassLabel.setText("Forgot password"); 

     forgotPassCheckBox.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       forgotPassCheckBoxActionPerformed(evt); 
      } 
     }); 

     cancelButton.setText("Cancel"); 

     okButton.setText("OK"); 
     okButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       okButtonActionPerformed(evt); 
      } 
     }); 

     userTextField.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       userTextFieldActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addComponent(connectLabel) 
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addComponent(passwordLabel) 
         .addComponent(userLabel))) 
       .addGap(30, 30, 30) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
        .addComponent(userTextField) 
        .addComponent(passwordTextField) 
        .addGroup(layout.createSequentialGroup() 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addComponent(forgotPassCheckBox) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addComponent(forgotPassLabel)) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(32, 32, 32) 
         .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(28, 28, 28) 
         .addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE))) 
       .addContainerGap()) 
      .addComponent(topPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addComponent(topPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(27, 27, 27) 
       .addComponent(connectLabel) 
       .addGap(34, 34, 34) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(userLabel) 
        .addComponent(userTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(passwordLabel) 
        .addComponent(passwordTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addComponent(forgotPassLabel) 
        .addComponent(forgotPassCheckBox)) 
       .addGap(23, 23, 23) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(cancelButton, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE)) 
       .addContainerGap()) 
     ); 

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

    private void forgotPassCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 
    }           

    private void userTextFieldActionPerformed(java.awt.event.ActionEvent evt) {            
     // TODO add your handling code here: 
    }           

    private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Login().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify 
    private javax.swing.JButton cancelButton; 
    private javax.swing.JLabel connectLabel; 
    private javax.swing.JCheckBox forgotPassCheckBox; 
    private javax.swing.JLabel forgotPassLabel; 
    private javax.swing.JButton okButton; 
    private javax.swing.JLabel passwordLabel; 
    private javax.swing.JTextField passwordTextField; 
    private javax.swing.JPanel topPanel; 
    private javax.swing.JLabel userLabel; 
    private javax.swing.JTextField userTextField; 
    // End of variables declaration 

} 
+0

netbeans 보일러 플레이트가하는 일에 익숙하지 않습니다. topPanel의 정의와 설정 방법을 보여주는 코드를 더 많이 제공 할 수 있습니까? 또한 디버깅을 위해 imageIcon.getIconWidth() 또는 뭔가를 보여주는 log/println을 추가하여 이미지가 발견되어로드되었는지 확인할 수도 있습니다. – PSpeed

+0

또 다른 디버깅 단계는 구성 요소가 표시되는지 여부를 확인하기 위해 아이콘 대신 JLabel에 텍스트를 설정하는 것입니다. 그것이 작동하면 이미지 로딩 문제도 지적 할 수 있습니다. – PSpeed

답변

0

이 자바 (GUI를)의 이상한 행동 중 하나입니다 이것은 내가 이미지에 추가하는 코드입니다. 패널에 이미지를 수동으로 페인트 할 수 있습니다. 여기

내가 무엇을 사용 :

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2= (Graphics2D) g; 

    if (currentImage != null) { 
     g2.drawImage(currentImage, null, 0, 0); 
    } 
} 

또한 이미지를 encapsolates JPanel에있는 "ImagePanel"구성 요소를 작성해야합니다.

drawImage의 중간 인수는 null입니다. 이미지 조작을 수행하지 않으므로 null입니다.

+0

-1, 이미지를 패널에 수동으로 페인트 할 필요가 없습니다. 작동 예제는 "레이블 사용 방법"또는 "아이콘 사용 방법"에 대한 스윙 튜토리얼을 읽으십시오. 사용자 정의 페인팅을 사용하는 유일한 방법은 스케일링이나 다른 기능을 사용하여 이미지를 수정해야하는 경우입니다. – camickr

+1

그것은 작동합니다. 대체 답변이있는 경우 작동하는 응답을 downvote하지 마십시오. 나만의 것을 추가하십시오. – monksy

+0

많은 것들이 작동하지만, 이미지 지원이 API의 일부이고 잘 문서화되어있을 때 맞춤 클래스를 만들어 휠을 재발 명할 필요가 없습니다. 그러나 제안에 동의하지 않을 수도 있기 때문에 제안에 투표하지 않습니다. 내가 투표 한 이유는 당신의 진술이 사실상 잘못 되었기 때문입니다. – camickr

1

GUI 빌더를 도려 내고 직접 GUI를 작성하는 방법을 학습하십시오. 그렇게하면 IDE를 배우는 대신 Java를 배우는 데 시간을 허비하게됩니다. GroupLayout 속성이 제대로 설정되지 않았고 GroupLayout이 IDE가 아닌 사람이 사용하도록 설계 되었기 때문에 문제가 무엇인지 전혀 알지 못합니다.

다른 가능성은 IDE가 사용자의 이미지를 찾을 수 없다는 것입니다. 이미지를 표시하고 null이 아닌지 확인하기 위해 System.out.println을 추가 했습니까?

How to Use Icons에 대한 스윙 튜토리얼의 섹션을 읽고 다운로드하여 작동하는지 테스트 할 수있는 작업 예제를 제안합니다. 자습서의 아이콘을 아이콘으로 대체하여 아이콘이 있는지 확인하십시오.

편집 :

내 원래의 제안이 정확이라고 생각 코드에서 두 번째 모양을 가진 후. 당신은 단 한 줄의 코드를 사용하여 패널에 레이블을 추가하려고 다음 IDE에 의해 생성 된 코드에서

topPanel.add(image); 

봐. add 문은 그렇게 단순하지 않습니다. 팩트를 수동으로 추가하려면 "그룹 레이아웃 사용 방법"튜토리얼의 섹션을 읽고 사용 된 다양한 제약 조건 및 방법을 이해해야합니다.

또는 IDE에서 수행하는 방법을 알아야합니다. 그게 내가 너를 선호하는 이유 야. 그렇다면 IDE가 아니라 코드에 대한 책임이 있습니다.

+0

적어도 내가 왜 다른 대답을 뽑았는지 설명해 주었다. 이 포럼의 사람들은 나를 놀라게합니다. 다시 말하지만, 내 답변에있는 것이 실제로 잘못 되었습니까? – camickr

+0

그건 내가 아니야. 귀하의 솔루션이 작동합니다. – monksy

+0

(투표를 0으로 리셋하기 위해 upvoted) – monksy

관련 문제