最初,所有组件仅在单行中的水平方向上对齐。 然后我设置滚动启用面板的大小如下
main.setPreferredSize(scroll.getViewport().getSize());
main.setMaximumSize(new Dimension(scroll.getViewport().getWidth(),Integer.MAX_VALUE));
它使组件开始在多行中对齐,而不是水平地超出屏幕。但是为什么垂直滚动没有发生,实际上组件被覆盖,高度也从视口大小固定,甚至定义了maxsize。
请帮助.........
我需要的只是垂直滚动.....组件不应该超出屏幕水平,但可以超越屏幕垂直。
更新代码:现在我想要的是按钮不应该超出屏幕水平,而是在整个窗口被占用时可以使用垂直滚动。
公共课测试{
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);
}
}
答案 0 :(得分:0)
只有当组件的首选大小大于滚动窗格的大小时,才会显示滚动条。
FlowLayout将包装组件,但不会更改首选大小。
查看扩展FlowLayout的Wrap Layout,并在组件换行时重新计算首选大小。
答案 1 :(得分:0)
正如camickr在https://stackoverflow.com/a/21816061中指出的那样,这里的主要问题是FlowLayout
无法正确计算组件的首选大小。他链接的WrapLayout
基本上解决了这个问题。但在这种情况下,这仍然是不够的,因为面板的首选尺寸将只是“显示所有按钮所需的宽度”。为了真正包装按钮,您还必须将main
面板替换为实现Scrollable
界面的面板,并在true
Scrollable#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;
}
}
所以在你的代码中:
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));
}