2015-05-09 72 views
1

您好我工作的一個Java應用程序,以下是從所謂的GUI中的自定義類延伸JFrame中的摘錄:BoxLayout不能共享錯誤?

public Gui(){ 
    super("EVC Scan & Price"); 
    setSize(400,500); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    // GridLayout layout = new GridLayout(5,1); 
    BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 
    setLayout(layout); 

    //add header row 
    headerRow.setAlignmentX(Component.CENTER_ALIGNMENT); 
    BorderLayout layoutHeading = new BorderLayout(); 
    headerRow.setLayout(layoutHeading); 
    if (headerImg != null){ 
    ImageIcon icon = new ImageIcon(headerImg); 
    picLabel.setIcon(icon);} 
    headerRow.add(picLabel, BorderLayout.NORTH); 
    title.setAlignmentX(JLabel.CENTER_ALIGNMENT); 
    headerRow.add(title, BorderLayout.SOUTH); 
    add(headerRow); 

    //add first row 
    firstRow.setAlignmentX(Component.LEFT_ALIGNMENT); 
    BoxLayout layoutRow1 = new BoxLayout(firstRow,BoxLayout.Y_AXIS); 
    firstRow.setLayout(layoutRow1); 
    firstRow.add(catLabel); 
    scroll.setSize(390,100); 
    firstRow.add(scroll); 
    add(firstRow); 

    setVisible(true); 
} 

我看了很多教程和API和實在看不出什麼毛病此不過,行讀:add(headerRow);似乎是「BoxLayout無法共享」錯誤的觸發器。 如果我將JFrame的佈局更改爲流佈局,則應用於firstRow部分的嵌套boxlayout工作正常嗎?

任何人都可以幫忙嗎?

回答

3

更改此:

BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 

這樣:

BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 

錯誤生產代碼中使用的容器,而實際上它不是傳遞的JFrame到的BoxLayout的構造爲BoxLayout的。實際上,您將佈局添加到JFrame的contentPane而不是JFrame。另外,通過讓類擴展JFrame,迫使您創建和顯示JFrame,而且通常需要更多的靈活性時,您可能正在畫一個角落。事實上,我敢打賭,我已經創建了大多數Swing GUI代碼,而且我已經看到了而不是擴展了JFrame,事實上很少有人會想要這樣做。更常見的是,您的GUI類將專門用於創建JPanel,然後可將其放置到JFrame或JDialogs或JTabbedPanes中,或在需要時通過CardLayouts進行交換。這將大大增加您的GUI編碼的靈活性。