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