Java 水平填充,但垂直滚动

Java 水平填充,但垂直滚动,java,swing,layout,jscrollpane,gridbaglayout,Java,Swing,Layout,Jscrollpane,Gridbaglayout,我有一个JFrame看起来像这样: 调整大小后,它将使jComboxes适应JFrame的大小,如下所示: 这就是我想要的。但是当我添加一个JScrollPane时,jcomboxes不再适应: 如何使JComboxes仍然水平填充添加的JScrollPane?(使JScrollPane只影响垂直滚动) 您可以在JScrollPane上设置滚动策略: JScrollPane scroller = new JScrollPane(content, ScrollPaneConstan

我有一个
JFrame
看起来像这样:

调整大小后,它将使
jComboxes
适应
JFrame
的大小,如下所示:

这就是我想要的。但是当我添加一个
JScrollPane
时,
jcomboxes
不再适应:

如何使JComboxes仍然水平填充添加的
JScrollPane
?(使
JScrollPane
只影响垂直滚动)


您可以在
JScrollPane
上设置滚动策略:

JScrollPane scroller = new JScrollPane(content, 
    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
您可能也想查看该界面,该界面允许微调滚动行为。

通过添加:

cb1.setPreferredSize(new Dimension(0, 30));
cb2.setPreferredSize(new Dimension(0, 30));
cb3.setPreferredSize(new Dimension(0, 30));
您使用的界面将允许您标记它应该跟踪视口的宽度或高度。在这种情况下,您希望跟踪宽度,这将强制视图始终与视图端口大小相同

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ScrollableExample {

    public static void main(String[] args) {
        new ScrollableExample();
    }

    public ScrollableExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(new TestPane()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements Scrollable {

        public TestPane() {
            setLayout(new GridLayout());
            JComboBox cb1 = new JComboBox();
            cb1.addItem("");
            cb1.addItem("aaaaaaaaaaaaaaaaaa");

            JComboBox cb2 = new JComboBox();
            cb2.addItem("");

            JComboBox cb3 = new JComboBox();
            cb3.addItem("");

            add(cb1);
            add(cb2);
            add(cb3);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

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

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

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

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

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

    }

}

请看一看,了解更多细节。对于你的问题,我认为你做不到。如果存在垂直滚动条,它将垂直滚动。不可能以某种方式@override setHorizontalScrollBar()吗?。不是添加jComboxes(addBoxes()),而是替换为:JTextArea=new JTextArea();面积。设置首选尺寸(新尺寸(200200));内容。添加(区域);。这将使JFrame fill水平并垂直滚动。但是不要用JComboxes做同样的事情,你的用例完全是模棱两可的。如果您想让组合框适应调整大小的窗口,那么使用
JScrollPane
有什么意义?如问题中所述,我希望JScrollPane仅垂直滚动,而不是水平滚动。也就是说:水平填充,而不是垂直填充。这不会使内容宽度适应JFrame的大小。您可能想看一看,谢谢您指出这一点。我的问题是JComboBox的首选宽度比宽度大。这迫使我重新设置宽度,这似乎是高度不推荐的。据我所知:正确使用布局管理器是不更改PreferredSize的解决方案。不幸的是,我看不到任何布局管理器可以帮助我解决问题。+1,您也可以尝试使用,它有一个简单的API,允许您控制滚动行为。似乎您想使用
FIT
作为宽度提示。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ScrollableExample {

    public static void main(String[] args) {
        new ScrollableExample();
    }

    public ScrollableExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(new TestPane()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements Scrollable {

        public TestPane() {
            setLayout(new GridLayout());
            JComboBox cb1 = new JComboBox();
            cb1.addItem("");
            cb1.addItem("aaaaaaaaaaaaaaaaaa");

            JComboBox cb2 = new JComboBox();
            cb2.addItem("");

            JComboBox cb3 = new JComboBox();
            cb3.addItem("");

            add(cb1);
            add(cb2);
            add(cb3);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

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

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

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

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

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

    }

}