2014-10-03 73 views
0

我有两个JPanels,每个都有一堆JButtons。包含另外两个的JPanel具有BoxLayout,另外两个JPanelsFlowLayout。问题在于窗口大小调整以使按钮环绕时,第一个和第二个面板中的按钮(p0p2)被其相应面板的边缘覆盖。有任何想法吗?隐藏在JPanel中的Java组件

enter image description here

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Rectangle; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 
import javax.swing.border.TitledBorder; 

public class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p0 = new JPanel(); 
     p0.setLayout(new FlowLayout()); 
     p0.setBorder(new TitledBorder("p0")); 
     JPanel p1 = new JPanel(); 
     p1.setLayout(new FlowLayout()); 
     p1.setBorder(new TitledBorder("p1")); 
     CustomPanel panel = new CustomPanel(); 
     JScrollPane sp = new JScrollPane(panel); 
     panel.add(p0); 
     panel.add(p1); 
     frame.add(sp); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p0.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     p1.add(new JButton("Hello World!")); 
     frame.setVisible(true); 
    } 

} 

class CustomPanel extends JPanel implements Scrollable { 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     return null; 
    } 

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

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

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

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

} 

回答

3

的的FlowLayout不重新计算最佳尺寸时部件包裹。

相反,您可以使用Wrap Layout

所有你需要改变的是:

//p0.setLayout(new FlowLayout()); 
p0.setLayout(new WrapLayout()); 
+0

谢谢!很棒! – 2014-10-03 16:58:45