2012-06-12 93 views
0

嗨,我想創建一個JScrollPane,但它不會工作...我不知道爲什麼...這裏是我的代碼...JScrollPane的將無法工作

public class test extends JFrame{ 
    public test(){  
     setSize(1000,600); 

    } 

    private static JButton[] remove; 
    private static JPanel p = new JPanel(); 

    public static void main(String[]args){ 
     p.setLayout(null); 
     JFrame t=new test(); 
     remove = new JButton[25]; 
     for(int i=0;i<25;i++){ 
      remove[i]=new JButton("Remove"); 
      remove[i].setBounds(243,92+35*i,85,25); 
      p.add(remove[i]);  
     } 
     JScrollPane scrollPane = new JScrollPane(p); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     t.add(scrollPane); 
     t.setVisible(true); 
    } 

烏姆和林相當肯定框架是不夠大,這25個按鈕...但是,如果我刪除該p.setLayout(null);一個水平滾動條將被自動創建...我真的不知道我的代碼有什麼問題... Pls非常感謝你!

+1

嘗試調用['t.pack'](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack( ))。我還建議你找一個合適的['LayoutManager'](http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html)而不是使用'null LayoutManager','null LayoutManager's幾乎總是一個壞主意。 – Jeffrey

回答

3

您需要設置p的preferredSize以使其工作。

p.setPreferredSize(new Dimension(800, 2000)); 

或者你可以具有P個擴展JPanel,然後重寫的getPreferredSize()方法返回正確的尺寸。

我同意 - 擺脫你的空白布局。如果要正確使用Swing並具有健壯的Swing GUI,請了解並使用佈局管理器。

例如,

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

public class Foo extends JFrame { 

    private static final int BUTTON_COUNT = 25; 

    public static void main(String[] args) { 
     JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, 20)); 
     btnPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     AbstractAction removeAction = new AbstractAction("Remove") { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      JButton src = (JButton) evt.getSource(); 
      JPanel container = (JPanel) src.getParent(); 
      container.remove(src); 
      container.revalidate(); 
      container.repaint(); 
     } 
     }; 
     for (int i = 0; i < BUTTON_COUNT; i++) { 
     JButton removeBtn = new JButton(removeAction); 
     btnPanel.add(removeBtn); 
     } 
     JPanel borderPanel = new JPanel(new BorderLayout()); 
     borderPanel.add(btnPanel, BorderLayout.NORTH); 
     JScrollPane scrollpane = new JScrollPane(borderPanel, 
      JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     scrollpane.setPreferredSize(new Dimension(400, 800)); 

     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(scrollpane); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
+0

哦,我以前試過GridLayout。據我記得,一個按鈕只是填滿整個電網不是嗎?然而,如果我只是setLayout(null),我實際上可以把所有東西放在任何我想要的東西上......不知道:P哦,非常感謝你幫助我兩次!我很感激,這裏的每個人都願意幫助謝謝! – b321234

+1

@ b321234:不要因爲不瞭解如何完全使用它而丟棄工具。你可以親眼看看你的佈局如何讓你失敗。實驗,學習,你會發現佈局不可或缺。 –

+0

@ b321234:請參閱上面的編輯示例。 –

0

問題是滾動窗格檢查其中的組件是「首選大小」,因此具有空佈局的窗格的首選大小爲(0,0)。它忽略了它。

你應該做的線沿線的東西:

p.setPreferredSize(1000,600); 

而且你應該會看到一些滾動條出現,我不知道他們會如何,雖然準確。

+0

錯誤。由於佈局爲空,setBounds方法將JButton的位置設置爲參數中傳遞的僞矩形。換句話說,這些按鈕在一列中。 – Vulcan

+0

@Vulcan:可能是正確的。 JScrollPane不能很好地處理使用視口視圖的空佈局。 –

+0

@HovercraftFullOfEels看起來乍得是指按鈕的佈局。 – Vulcan