Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JScrollPane滚动问题_Java_Swing - Fatal编程技术网

Java JScrollPane滚动问题

Java JScrollPane滚动问题,java,swing,Java,Swing,最初,所有组件仅在一行的水平方向上对齐。 然后,我将滚动启用面板的大小设置如下 main.setPreferredSize(scroll.getViewport().getSize()); main.setMaximumSize(new Dimension(scroll.getViewport().getWidth(),Integer.MAX_VALUE)); 它工作了,组件开始以多行对齐,而不是水平超出屏幕。但是为什么没有出现垂直滚动呢?事实上,组件正在被覆盖,高度也随着视口大小而固定,即使

最初,所有组件仅在一行的水平方向上对齐。 然后,我将滚动启用面板的大小设置如下

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);

}
publicstaticvoidmain(字符串[]args){
JFrame=新JFrame();
setTitle(“JavaGUI”);
JPanel main=新的JPanel();
JScrollPane scroll=新的JScrollPane(主);
BoxLayout box=新的BoxLayout(主、BoxLayout.Y_轴);
主布局(框);
添加(新JLabel(“第1行”);
JPanel panel1=新的JPanel(新的FlowLayout());

for(int i=0;i仅当组件的首选大小大于滚动窗格的大小时,才会显示滚动条

FlowLayout将封装组件,但不会更改首选大小

查看扩展FlowLayout并在组件包装时为您重新计算首选大小的文件。

正如camickr在中指出的,这里的主要问题是
FlowLayout
无法正确计算组件的首选大小。他链接的
WrapLayout
基本上解决了这个问题。但在在他的情况下,这仍然不够,因为面板的首选尺寸将只是“显示所有按钮所需的宽度”。为了真正包装按钮,您还必须将
main
面板替换为实现
Scrollable
界面的面板,并在
Scrollable中返回
true

因此,在您的代码中:

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));         
}
JPanel main=new ScrollablePanel();//在此处使用ScrollablePanel
JScrollPane scroll=新的JScrollPane(主);
...
JPanel panel1=newjpanel(newwraplayout());//在此处使用WrapLayout

对于(inti=0;i)“但是为什么F***”-现在我们不知道你想说什么,因为***。什么是滚动,它以前是如何创建的?除非你明确设置了首选大小,否则不要假设它是为任何事情设置的。不要更改查看端口或滚动窗格的首选/最小/最大大小,它会将你拧回去。面板是一个cting作为视图,应该是首选/最小/最大大小的适当值,或者实现可滚动界面,以提供有关视口大小的提示。不要滥用,伙计,如果你很温和,欢迎你。伙计们用完整代码更新。请帮助。
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));         
}