2015-01-07 166 views
0

好吧,我有一個名爲AppMain的類,它擴展了JFrame和一個JPanel(稱爲面板),我在其中添加各種JSwing組件(按鈕,標籤,分隔符),用戶可以按各種操作。一個這樣的動作是(在運行時)添加一個帶有各種JSpinners和TextAreas的整個JPanel。這些細節在一個名爲PlayerCharacter的類中擴展了JPanel。當你創建很多面板時,你會用完垂直空間並且不會自動創建滾動條。我的問題是如何添加滾動條。我嘗試製作一個ScrollPane,在其中放置第二個面板。向JPanel添加垂直滾動功能

代碼看起來有點像這樣:

public class AppMain extends JFrame { 

public static void main(String[] args) { 
    new AppMain(); 
} 

private static JPanel panel = new JPanel(); 
private static JPanel contentPanel = new JPanel(); 
JScrollPane scrollPane = new JScrollPane(contentPanel); 
JButton addPlayerButton = new JButton("Add player"); 

AppMain() { 
    super("window name"); 
    setSize(1200, 750); 
    setLocation(250, 50); 
    panel.setLayout(null); 
    contentPanel.setLayout(null); 
    addPlayerButton.setBounds(5, 5, 150, 40); 
    contentPanel.setBounds(5, 10, 1100, 750); 
    scrollPane.setBounds(5, 10, 1100, 750); 
    panel.add(addPlayerButton); 
    panel.add(scrollPane); 
    getContentPane().add(panel); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    interfaceControls(); 
} 

public void interfaceControls() { 
    addPlayerButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 

        for (int i = 0; i < 8; i++){ 
        JLabel tmpLabel = new JLabel("text " + i); 
        tmpLabel.setBounds(5, (100 + (100 * i)), 100, 100); 
        contentPanel.add(tmpLabel); 
        contentPanel.revalidate(); 
        contentPanel.repaint(); 
        } 
       } 

      }); 
     } 
    }); 

} 
} 

編輯:對於那些想知道,工程代碼:

public class AppMain extends JFrame { 

public static void main(String[] args) { 
    new AppMain(); 
} 

private static JPanel panel = new JPanel(); 
JPanel topPanel = new JPanel(); 
JPanel contentPanel = new JPanel(); 
JButton addPlayerButton = new JButton("Add player"); 



AppMain() { 
    super("window name"); 
    setSize(1200, 750); 
    setLocation(250, 50); 
    JScrollPane scrollPanel = new JScrollPane(contentPanel); 

    panel.setLayout(new BorderLayout()); 

    contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); 
    panel.add(addPlayerButton, BorderLayout.PAGE_START); 
    panel.add(scrollPanel, BorderLayout.CENTER); 

    getContentPane().add(panel); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    interfaceControls(); 
} 

public void interfaceControls() { 
    addPlayerButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 

        for (int i = 0; i < 8; i++){ 
        JButton dynamicButton = new JButton("text " + i); 
        contentPanel.add(dynamicButton); 
        contentPanel.revalidate(); 
        contentPanel.repaint(); 
        } 
       } 

      }); 
     } 
    }); 

} 

}

+0

最好的辦法是提供一個能夠重現問題的[mcve](http://stackoverflow.com/help/mcve)。 –

回答

3

我不介意分享項目,但我不知道有多安全,這是

我們永遠不想看到你整個應用程序。這是太多的代碼來看待。相反,我們希望看到一個SSCCE,這是一個簡化的代碼,演示了您正在嘗試執行的「概念」。

SSCCE應該包含在您的所有問題中。很少會發布4行代碼爲我們提供幫助解決問題所需的信息。 SSCCE的另一個好處是,在嘗試創建SSCCE時經常會發現問題,因爲在20行代碼中查找問題比調試200行代碼更容易。

contentPanel.add(newPlayerCharacter); 
panel.validate(); 
panel.repaint(); 

正常的代碼應該是:

contentPanel.add(newPlayerCharacter); 
contentPanel.revalidate(); // note the "re" 
contentPanel.repaint(); 

如果沒有幫助,然後張貼在問題的正確SSCCE。

編輯:

不要使用null佈局(和setBounds())!!!

Swing設計用於佈局管理器。我不知道你的實際佈局是什麼,所以我只是將你指向Layout Managers的Swing教程以獲取更多信息和工作示例。

當添加到滾動窗格的視口的組件的首選大小大於滾動窗格的大小時,滾動條將自動出現。佈局經理負責確定首選大小。由於您使用的是空佈局,因此首選大小爲(0,0),因此沒有理由顯示滾動條。

+0

我在代碼中編輯。這兩個似乎都沒有工作。 –

+2

@RekijanKileren,你發佈的代碼:1)沒有實現我的建議。 2)不是SSCCE。我們無法執行您的代碼,因爲我們無法訪問您的「newPlayerCharacter」類。我們不想訪問你的班級,因爲這個班級與你的問題無關。你的問題是關於添加一個組件到面板的滾動窗格。因此添加一個JLabel。 '保持代碼簡單!!!'。在你發佈正確的SSCCE之前,我無法提供幫助。 – camickr

+0

我再次編輯原始帖子。希望這能提供更好的見解。感謝迄今堅持與我:) –