2013-08-25 66 views
3

首先我必須說,我已經檢查了這些問題,並沒有發現我的答案:JScrollPane的不適合我的JPanel工作

1234567

和許多像這樣

其他問題還我已經檢查了這些教程和示例:

1910,11

和許多其他網站。但我無法解決我的問題。

和 這是單純善良的我的代碼:

public class Question extends JFrame { 
public Question() { 
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
    setLayout(new BorderLayout()); 
    setSize(d.width, d.height); 
    setResizable(false); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    JPanel panel = new JPanel(); 
    panel.setPreferredSize(new Dimension(d.width, d.height)); 
    panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
    panel.setLayout(new BoxLayout(panel, 1)); 
    for (int i = 0; i < 100; i++) { 
     panel.add(new JButton("kjdh")); 
    } 
    JScrollPane scrollPane = new JScrollPane(panel); 
    scrollPane.setPreferredSize(new Dimension(500, 500)); 
    getContentPane().add(scrollPane); 
    getContentPane().add(panel); 
    setVisible(true); 

} 

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

JScrollPane不會出現。我測試了很多東西。我改變了將panelscrollPane添加到我的frame的方式,但它不起作用。任何人都可以幫助我嗎?

+0

您是否嘗試過scrollPane.add(面板),並僅添加面板? –

+0

您是否嘗試過框架來計算尺寸?對,首選大小需要首選項配置,請使用完整大小。 –

+0

您已經在滾動窗格中添加了jpanel,因此不需要再次在框架中添加jpanel。避免添加兩次不必要的代碼,如添加jpanel。只需刪除'getContentPane()。add(panel)'行。 –

回答

13
  1. 不要設置在面板上的優選尺寸。有關原因的原因,請參閱Should I avoid the use of setPreferred/Maximum/MinimumSize methods in Java Swing?
  2. 僅將添加到滾動窗格到內容窗格。
    1. 使用缺省佈局(BorderLayout)將默認爲把部件在CENTER約束如果沒有提供,並且CENTER區域只能接受單個組分A內容窗格。
    2. 除此之外,面板已經添加到滾動窗格中,它已經出現在它的內部,並且只能出現在單個容器中。
  3. 請勿延長框架,只使用其中的一個實例。
  4. 請勿setSize,但setExtendedState
  5. GUI應該在EDT上構建和更新。
  6. 更好的關閉操作是DISPOSE_ON_CLOSE

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

public class Question { 

    public Question() { 
     JFrame f = new JFrame(); 
     f.setLayout(new BorderLayout()); 
     f.setResizable(false); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     panel.setLayout(new BoxLayout(panel, 1)); 
     for (int i = 0; i < 100; i++) { 
      panel.add(new JButton("kjdh")); 
     } 
     JScrollPane scrollPane = new JScrollPane(panel); 
     f.getContentPane().add(scrollPane); 
     f.pack(); 
     f.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       new Question(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+2

+1,作爲答案而不是評論好得多。雖然,我也會大膽的2,因爲兩者都需要解決這個問題,其他的都是很好的編程實踐。 – camickr

+0

@camickr好點。我編輯了答案以擴大兩點,**強調**第二點。 –

+0

如果我想讓程序全屏顯示,該怎麼辦?我將尺寸設置爲全屏 – Paniz

5

您已經在上下文窗格中添加了一個不必要的重複面板。相反的:

getContentPane().add(scrollPane); 
getContentPane().add(panel); 

只使用

getContentPane().add(scrollPane); 

它是有意義的雙擊自動滾屏面板是面板的容器,所以它足以上下文窗格中添加一個容器。

+2

please without scrollPane.setPreferredSize(new Dimension(500,500));,因爲放在JFrame.CENTER上,所以很容易被忽略 – mKorbel

+0

同意@mKorbel。請參閱[我是否應避免在Java Swing中使用setPreferred/Maximum/MinimumSize方法?](http://stackoverflow.com/q/7229226/418556)(基本上'yes')和我的示例。不需要「大小猜測」。 –

+0

@ Jk1謝謝,現在很好回答 – mKorbel