2013-02-24 137 views
2

我擴展JScrollPane並向其添加若干組件。當我將滾動窗格添加到JFrame時,不顯示任何組件。在我的類擴展的情況下,例如JPanel,然後將其添加到獨立的JScrollPane中,一切正常。我無法理解這種行爲。任何人都可以解釋我,爲什麼會發生?JScrollPane不添加組件

這裏有兩種變體(在一個工程,並且沒有之一):

這種變異不起作用:

public class MainScrollPanel extends JScrollPane { 

    private JPanel verticalPanel; 

    public MainScrollPanel() throws IOException, ParseException { 
     initGUI(); 
     readData(); 
    } 

    private void initGUI() { 
     verticalPanel = new JPanel(); 
     verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS)); 

     add(verticalPanel); 
     setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    } 

    private void readData() throws IOException, ParseException { 
     //read data 
     //... 
     for(NewData message : messages) { 
      verticalPanel.add(new JLabel(message.getMessage())); 
     } 
    } 
} 

public class MainGUI extends JFrame { 
    private MainScrollPanel mainPanel; 

    public MainGUI() throws IOException, ParseException { 
     super("Scroll app"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     mainPanel = new MainScrollPanel(); 
     getContentPane().add(mainPanel); 

     setSize(200, 200); 
     setVisible(true); 
    } 

    public static void main(String[] args) throws IOException, ParseException { 
     new MainGUI(); 
    } 
} 

這一個正常工作:

public class MainScrollPanel extends JPanel { 

    public MainScrollPanel() throws IOException, ParseException { 
     initGUI(); 
     readData(); 
    } 

    private void initGUI() { 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
    } 

    private void readData() throws IOException, ParseException { 
     //The same as in previous example 
    } 
} 

public class MainGUI extends JFrame { 
    private MainScrollPanel mainPanel; 

    public MainGUI() throws IOException, ParseException { 
     //... 
     JScrollPane scrollPane = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     getContentPane().add(scrollPane); 
     //... 
    } 
} 
+1

* 「我向JScrollPane中。」「*爲什麼 – 2013-02-24 14:38:02

+0

這可能是因爲你錯過了'超(...);?'呼叫延伸'JScrollPane'類 – Sorceror 2013-02-24 14:38:11

+0

在大多數情況下,不需要擴展JScrollPane。Swing已經被使用,很少被擴展。 – Aubin 2013-02-24 14:39:41

回答

5

您可能不需要或不想擴展JScrollPane,但無論如何,您幾乎都不會直接將組件直接添加到JScrollPane,而是添加到其Viewport。否則你失去了視口及其功能。

這可以通過JScrollPane的方法來完成:setViewportView(Component comp) 另一種方法是將組件傳遞到JScrollPane的構造函數(或在此其超級構造函數),因爲這會自動組件傳遞給視口。這是一個小小的語法糖。

例如,

private void initGUI() { 
    verticalPanel = new JPanel(); 
    verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS)); 

    setViewportView(verticalPanel); // ********** changed ******* 

    setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
} 
+0

+1:擴展一個添加到JScrollPane的ViewPort的JPanel是正確的。 – Aubin 2013-02-24 14:41:04

+0

@HovercraftFullOfEels,oh,我忘了關於視口...我的錯。是的,將JPanel設置爲視口而不是將Jpanel添加到JScrollPane可以正常工作。感謝您指出這種細微差別。 – Dragon 2013-02-24 14:45:31

+0

@Dragon:非常歡迎! – 2013-02-24 14:45:47