2014-02-16 86 views
0

最初,所有组件仅在水平方向上排成一行。 后来我设置滚动启用面板的尺寸如下JScrollPane滚动问题

main.setPreferredSize(scroll.getViewport().getSize()); 
main.setMaximumSize(new Dimension(scroll.getViewport().getWidth(),Integer.MAX_VALUE)); 

和它的工作部件开始在多行排列,并不会超出屏幕水平。但是为什么没有发生垂直滚动,实际上组件正在被覆盖,高度也是固定的,因为视口的大小,即使是最大尺寸也是定义的。

请帮.........

我需要的是只有垂直滚动.....组件不应该超出屏幕会水平,但可以超越屏幕垂直。

更新代码:现在我想要的是按钮不应该超出屏幕水平,而是可以使用垂直滚动,如果整个窗口被占用。

公共类测试{

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setTitle("JAVA GUI"); 
    JPanel main = new JPanel(); 
    JScrollPane scroll = new JScrollPane(main); 
    BoxLayout box = new BoxLayout(main, BoxLayout.Y_AXIS); 
    main.setLayout(box);  
    main.add(new JLabel("row 1"));  
    JPanel panel1 = new JPanel(new FlowLayout()); 

    for(int i=0;i<200;i++){  
     panel1.add(new JButton("b"+i));   
    } 
    JPanel panel2 = new JPanel(new FlowLayout()); 

    for(int i=0;i<200;i++){  
     panel2.add(new JButton("b"+i));   
    } 
    JPanel panel3 = new JPanel(new FlowLayout()); 

    for(int i=0;i<200;i++){  
     panel3.add(new JButton("b"+i));   
    } 
    Border border = BorderFactory.createLineBorder(Color.black,10); 
    panel1.setBorder(border); 
    panel2.setBorder(border); 
    panel3.setBorder(border); 
    main.add(panel1); 
    main.add(new JLabel("row2")); 
    main.add(panel2); 
    main.add(new JLabel("row3")); 
    main.add(panel3); 
    frame.setContentPane(scroll); 
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

} 

}当组件的优选尺寸大于滚动面板的尺寸时

+1

“但是,为什么F ***“ - 现在我们不知道你想说什么,因为***。 – Maroun

+0

什么是滚动,它是如何创建的?除非您明确设置首选大小的大小,否则不要认为它设置为“所有”。 – Smitty

+0

请勿用视图端口或滚动窗格的首选/最小/最大尺寸进行拧紧,否则它将与您一起拧回。作为视图的面板应该是适当的首选/最小/最大尺寸值或实现Scrollable界面,以提供有关应如何确定视口大小的提示 – MadProgrammer

回答

0

滚动条才会出现。

FlowLayout将打包组件,但不会更改首选大小。

查看扩展FlowLayout的Wrap Layout,并在组件换行时重新计算您的首选尺寸。

0

正如camickr在https://stackoverflow.com/a/21816061中指出的,这里的主要问题是FlowLayout没有正确地计算组件的首选大小。他联系的WrapLayout基本解决了这个问题。但在这种情况下,这仍然不够,因为面板的首选尺寸将“尽可能宽地显示所有按钮”。为了真正包裹的按钮,你也有一个实现Scrollable接口,并返回trueScrollable#getScrollableTracksViewportWidth()

class ScrollablePanel extends JPanel implements Scrollable 
{ 
    @Override 
    public Dimension getPreferredScrollableViewportSize() 
    { 
     return getPreferredSize(); 
    } 

    @Override 
    public int getScrollableUnitIncrement(Rectangle visibleRect, 
     int orientation, int direction) 
    { 
     return 1; 
    } 

    @Override 
    public int getScrollableBlockIncrement(Rectangle visibleRect, 
     int orientation, int direction) 
    { 
     return 1; 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() 
    { 
     return true; 
    } 

    @Override 
    public boolean getScrollableTracksViewportHeight() 
    { 
     return false; 
    } 

} 

因此,在你的代码面板,以取代main面板:

JPanel main = new ScrollablePanel(); // Use ScrollablePanel here 
JScrollPane scroll = new JScrollPane(main); 
... 
JPanel panel1 = new JPanel(new WrapLayout()); // Use WrapLayout here 
for(int i=0;i<200;i++){  
    panel1.add(new JButton("b"+i));   
}