我有以下小程序:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class ScrollPanePlay extends JFrame
{
public static void main(String[] args)
{
ScrollPanePlay frame = new ScrollPanePlay();
frame.setVisible(true);
}
public ScrollPanePlay()
{
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel panel = new JPanel(this);
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
panel.add(new JLabel("one"));
panel.add(new JLabel("two"));
panel.add(new JLabel("three"));
panel.add(new JLabel("four"));
panel.add(new JLabel("five"));
JScrollPane scrollPane = new JScrollPane(panel);
add(panel, BorderLayout.CENTER); // <== add either panel or scrollpane
pack();
}
}
如果我添加了面板,那么当窗口缩小时,面板中的标签将会换行,如FlowLayout所预期的那样。
如果我将面板添加到滚动窗格并将滚动窗格添加到框架,则标签不会换行,因为scrollPane报告的宽度(我猜)足以容纳所有标签,并允许用户滚动到看到他们。
我想要滚动行为,但仅限于垂直 - 我希望用户选择他想要看到的宽度,并让滚动条仅显示为垂直滚动。我怎么能这样做?
我尝试扩展JScrollPane并从getScrollableTracksViewportWidth()
返回true,但是,正如我所料,这并不是我想要的,因为它是帧的宽度,我希望跟踪事物,而不是视口。我尝试扩展JPanel并覆盖getWidth以返回框架的宽度,但仍然将所有标签留在水平行中,即它们退出包装。有没有自定义布局管理器可以做到这一点?在我看来,我们所需要的只是对视口宽度进行编程控制。
答案 0 :(得分:0)
这是一个视口问题。当在JScrollPane中时,JPanel不会调整大小以适应JScrollPane大小(这就是ScrollPanes存在的原因)。
您可以使用Scrollable Panel而不是JPanel,并将其设置为适合最大宽度(在这种情况下,它适合JScrollPane)。
类似的东西:
ScrollablePanel panel = new ScrollablePanel( new BorderLayout());
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
请查看此answer以获得更一般的答案以及指向.class的链接。