2011-05-13 4 views
4

Java GUI에 익숙하지 않아서 간단한 문제가 있습니다. 나는 개념을 이해하기가 어려워서 아래 코드에서 JLable을 볼 수있게하려고 노력 중이다. 하지만 여전히 레이블은 보이지 않지만 프레임은 런타임에 열립니다.간단 JPanel에 JLabel 추가

public class Sample extends JPanel { 

    public void Sample() { 
     JPanel p = new JPanel(); 

     JLabel lab1 = new JLabel("User Name", JLabel.LEFT); 
     p.setLayout(new FlowLayout()); 
     p.add(lab1 = new JLabel("add JLabel")); 
    } 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.getContentPane().add(new Sample()); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 
} 

답변

19

당신은 샘플 패널 p를 추가하는 것을 잊었다된다. 끝 부분에 add(p)을 사용하거나 샘플 클래스가 JPanel을 확장 중이므로 p 패널을 제거하십시오.

옵션 1 :

JPanel p = new JPanel(); 

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT); 
    p.setLayout(new FlowLayout()); 
    p.add(lab1 = new JLabel("add JLabel")); 
    add(p); 

옵션 2 :

JLabel lab1 = new JLabel("User Name", JLabel.LEFT); 
    setLayout(new FlowLayout()); 
    add(lab1 = new JLabel("add JLabel")); 

의 JLabel의 또 왜 재정의 초기화

? 코드에서 JLable은 항상 "add JLabel"값을 보유합니다. '사용자 이름'을 보려면 add(lab1 = new JLabel("add JLabel")); 대신 add(lab1);을 사용하십시오.

방금이 요구 될 수있다

또한
JLabel lab1 = new JLabel("User Name", JLabel.LEFT); 
    setLayout(new FlowLayout()); 
    add(lab1); 

생성자가 너무 반환 형식이 생성자에서 공백을 제거 할 수 없습니다.

+0

이 왜'와 lab1'를 재 할당 할 JFrame의 {

private MyContentPane myContentPane = new MyContentPane(); public MyGui(){ super("title"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setContentPane(myContentPane); this.createMenu(); this.pack(); this.setVisible(true); } private void createMenu(){ JMenuBar myMenuBar = new JMenuBar(); JMenu xMenu = new JMenu("x"); JMenu x = new JMenu("x"); JMenuItem xItem = new JMenuItem("letter"); JMenuItem exitItem = new JMenuItem("exit"); xItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { myContentPane.xPanel(); } }); xItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { myContentPane.setxPanel(); } }); exitItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.exit(0); } }); displayMenu.add(letterItem); displayMenu.add(colorItem); fileMenu.add(exitItem); myMenuBar.add(displayMenu); myMenuBar.add(fileMenu); this.setJMenuBar(myMenuBar); } 

}을 확장'추가 (LAB1 = 새로운 JLabel의 ("JLabel의 추가")); 대신'add (lab1);'? – Syjin

+0

@ 토미 : 나는 OP와 똑같은 질문을 했나요? –

+0

대단히 감사합니다 !!! 생성자에 void를 넣는 것은 어리석은 실수였습니다. 다시 해리 주셔서 감사합니다. – Splitter

0

샘플은 Jpanel입니다.

샘플 확장 JPanel은 JPanel에서 상속 받았다는 의미입니다.

는 JPanel의 p와 모든 드롭 "페이지를."의

2

사용중인 생성자가 적절한 생성자가 아닙니다. Java 생성자에 반환 유형이없고 void이 추가되었습니다. main 메소드에서 new Sample()을 호출 할 때 실제로 메소드를 호출하는 것이 아니라 기본적으로 존재하는 기본 생성자를 호출합니다.

는 다음과 같이 시도 ..

public Sample() { 
    JPanel p = new JPanel(); 

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT); 
    p.setLayout(new FlowLayout()); 
    p.add(lab1 = new JLabel("add JLabel")); 
} 

는 또한 @Harry 기쁨 그렇지 않으면 패널이 아직 추가되지 않은 add(p); 문을 추가하기 위해 무엇을 제안 할 필요가있다.

+0

+1. ......... 좋은 선택. –

2

주석에 유의하십시오.

import java.awt.*; 
import javax.swing.*; 

public class Sample extends JPanel { 

    public Sample() { 
     // set the layout in the constructor 
     super(new FlowLayout(FlowLayout.LEADING)); 

     // best not to set size OR preferred size! 
     setPreferredSize(new Dimension(200,200)); 

     JLabel lab1 = new JLabel("User Name"); 
     add(lab1); 
    } 

    public static void main(String[] args) { 
     // construct the GUI on the EDT 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("User Details"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       frame.getContentPane().add(new Sample()); 
       // important! 
       frame.pack(); 

       frame.setVisible(true); 
      } 
     }); 
    } 
} 

가 일반적으로 사용자 정의 기능을 추가하지 않는 구성 요소를 확장하는 것이 좋습니다 간주되지 않는다는 것을 유의하십시오. 이는 (예를 들어) Sample 패널에 대한 새로운 메소드 정의를 의미 할 것입니다.이 코드는또는 UserDetailsContainer이라는 레이블을 붙일 수 있습니다. 또는 Login 구성 요소 일 수 있습니다.

+0

감사합니다 앤드류! :) super (새 FlowLayout (FlowLayout.LEADING)); 나에게 새로운 것은 내가 지금 어떻게 해야할지 알고있는 super()를 사용하는 방법을 몰랐다. 다시 한번 감사드립니다 .. – Splitter

+0

@Splitter :'JLabel' 생성자에서'JLabel.LEFT' 제약 조건을 사용하여'FlowLayout.LEADING'이 성취하려고했던 WAG를 만들었습니다. 생성자에서 레이아웃을 제공하는 것이 제 습관입니다. 왜냐하면 다른 줄의 코드를 낭비하는 것을 싫어하기 때문입니다. ;) –

0

@SuppressWarnings ("시리얼") 공용 클래스 MyGui이

관련 문제