2012-08-16 155 views
4

我需要使用絕對佈局的JScrollPane。我知道使用setLayout(null)根本不值得推薦。我一直在閱讀,如果你想使用JScrollPane的絕對佈局,有必要設置裏面的元素的首選大小屬性,以便JScrollPane可以計算它的大小。在JScrollPane中使用絕對佈局

我一直在嘗試下一個代碼更改訂單和elemnts的大小,但我不能工作了,我已經錯了。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 


public class frame extends JFrame { 

private JPanel contentPane; 
private JScrollPane scrollPane; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame frame = new frame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public frame() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setLayout(null); 
    setContentPane(contentPane); 

    JPanel panel = new JPanel(); 
    panel.setBackground(Color.red); 
    panel.setBounds(0,0,600,600); 
    panel.setPreferredSize(new Dimension(420,280)); 

    scrollPane = new JScrollPane(panel); 
    scrollPane.setBounds(0, 0, 600, 600); 
    scrollPane.setLayout(null); 
    scrollPane.setBackground(Color.green); 

    scrollPane.add(panel); 
    scrollPane.setPreferredSize(new Dimension(450,300)); 
    contentPane.add(scrollPane); 
} 
} 

爲什麼setPreferredSize沒有做正確的工作? 在此先感謝。

+0

請參閱['ScrollPanePaint'](http://stackoverflow.com/a/10097538/230513)。 – trashgod 2012-08-17 01:00:40

+0

a)永遠不會使用空佈局(又名:無佈局管理器)b)永遠不會使用setXXSize – kleopatra 2012-08-17 13:02:31

回答

4

改變實際JScrollPane的佈局管理器沒有意義;如果您希望在應用程序中使用絕對佈局,則通常會在容器類(如JPanel)上調用setLayout(null),以便使用絕對定位在其中定位子組件。

我建議你應該嘗試:

  • 呼叫setLayout(null)上載JScrollPaneJPanel(我認爲這是你想要做什麼)。
  • 而不是使用JPanel直接繼承它和你的子類實現Scrollable接口,它提供給JScrollPane關於最佳滾動視口大小的附加信息。
5

首先,不改變滾動窗格的佈局管理器,它不要求你要實現

二什麼,滾動窗格的作品雖然JViewport。你有你的容器添加到它,而不是(scrollPane.add(panel)是錯誤的做法),而是使用scrollPane.setViewportView(panel)

第三,要看一看的Scrollable界面滾動窗格並不僅僅依靠首選大小的內容

2

我可以看到你的問題。

在此設置面板的邊界和首選大小。

panel.setBounds(0,0,600,600); 
panel.setPreferredSize(new Dimension(420,280)); 

然後設置結合的滾動窗格

scrollPane.setBounds(0, 0, 600, 600); 

井,面板的邊界是無用的,會導致滾動窗格只關心的優選尺寸和麪板的優選尺寸更小然後是scrollPane的邊界,所以scrollPanel認爲他不需要顯示其他任何東西,這就是爲什麼它不顯示任何滾動條或啓用它們。 OBS:我看不出設置scrollPanel的佈局。所以你可以跳過那條線。

正如解說:既然你做護理窗格的首選大小與絕對佈局面板使用滾動就好了。