【发布时间】:2014-03-16 03:01:30
【问题描述】:
我有以下小程序:
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 所预期的那样。
如果我将面板添加到滚动窗格并将滚动窗格添加到框架,则标签不会换行,因为滚动窗格报告的宽度(我猜)足以容纳所有标签,并允许用户滚动到见他们。
我想要滚动行为,但仅适用于垂直 - 我希望用户选择他想要查看的宽度,并让滚动条仅在垂直滚动时出现。我该怎么做?
我尝试扩展 JScrollPane 并从 getScrollableTracksViewportWidth() 返回 true,但是,正如我所料,这并没有达到我想要的效果,因为我想要跟踪的是框架的宽度,而不是视口。我尝试扩展 JPanel 并覆盖 getWidth 以返回框架的宽度,但这仍然将所有标签留在水平行中,即它们退出包装。如果没有自定义布局管理器,有什么可以做到这一点吗?在我看来,我们需要的只是对视口宽度的编程控制。
【问题讨论】:
-
问题可能出在
FlowLayout本身,请尝试查看WrapLayout -
我没有得到你的目标,顺便别忘了改变,增加滚动增量
标签: java swing jscrollpane