2011-05-13 115 views
4

我有一個簡單的問題,因爲我對Java GUI不太瞭解。我試圖讓下面的代碼看到JLable,因爲我發現很難理解這個概念。但仍然標籤不可見,但框架在運行時打開。簡單添加一個JLabel到JPanel

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)或者僅刪除面板p導致您的示例類正在擴展JPanel。

選項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將始終保持「添加JLabel」的值。如果您想查看「用戶名」,請使用add(lab1);而不是add(lab1 = new JLabel("add JLabel"));

可能你只是需要這樣的:

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

而且構造函數不能有返回類型所以從構造函數中刪除無效。

+0

爲什麼你重新分配與''lab1'添加(lab1中的=新的JLabel( 「添加的JLabel」) );'而不是'add(lab1);'? – Syjin 2011-05-13 05:43:22

+0

@Tommy:我向OP詢問過同樣的東西嗎? – 2011-05-13 05:44:21

+0

非常感謝你們!在構造函數中放置一個void是一個愚蠢的錯誤。再次感謝Harry。 – Splitter 2011-05-13 06:27:48

0

樣本是Jpanel。

示例擴展JPanel表示您從JPanel繼承。

只是下降的JPanel p和所有的 「P。」 S

2

您使用的構造函數不是正確的構造函數。java構造函數沒有返回類型,void是額外的。當在主方法中調用新的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。 ......... 不錯的選擇。 – 2011-05-13 06:02:53

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面板的新方法(如果我正確地猜出你要使用該代碼的位置,可以更好地標記爲UserDetailsUserDetailsContainer ..)。或者它可能是Login組件..

+0

謝謝安德魯! :)超級(新FlowLayout(FlowLayout.LEADING));對我來說是一件新事物我不知道如何使用super(),現在我知道如何使用它了。再次感謝.. – Splitter 2011-05-13 15:37:15

+0

@Splitter:我做了一個WAG,「FlowLayout.LEADING」是你試圖通過在JLabel構造函數中使用JLabel.LEFT約束來實現的效果。我的習慣是在構造函數中提供佈局,僅僅是因爲我討厭'浪費'另一行代碼。 ;) – 2011-05-13 15:43:00

0

@SuppressWarnings( 「串行」) 公共類MyGui擴展的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); 
} 

}