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