问题描述
虽然我已经成功地创建了带有滚动条的窗口,但我有一种特殊情况,即使 JScrollPane
中的内容对于查看区域来说太大,滚动条也不会出现。
我在一个窗口中有一个按钮,可以打开一个新窗口,显示来自特定 JSONObject
的信息。为此,它创建了一个扩展 JFrame
的类的实例。作为其他一些需要的知识,DetailBox
是一个 JPanel
,它包含一些基于 obj
的手动绘制的形状,一个 JSONObject
。 JFrame
类的paint 方法调用super.paint()
,然后是以下方法(为简单起见总结)。
public void drawAdvancedView(Graphics g) {
JPanel all = new JPanel(); // "all",as the name suggests,will contain all the elements of the window.
all.setLayout(null);
// Create a DetailBox (a custom JPanel) and place it within "all":
DetailBox Box = new DetailBox(obj);
Box.setBounds(0,400,((obj.getInt("linecount") * 2) + 100));
Box.paintComponent(g);
all.add(Box);
// The JPanel "lower" contains some additional text @R_449_4045@ion placed in a JTabbedPane below the drawing.
JPanel lower = new JPanel();
lower.setBounds(0,((obj.getInt("linecount") * 2) + 100),300);
JTabbedPane tabs = new JTabbedPane();
// Create a JPanel,place it inside of a JScrollPane,then place it within "tabs".
// Create a JPanel,then place it within "tabs".
lower.add(tabs);
all.add(lower);
// At this point,"all" contains all the elements wanted in the window.
JScrollPane sizeLocker = new JScrollPane(all); // Next,create the JScrollPane "sizeLocker" and place "all" within it.
sizeLocker.setMaximumSize(new Dimension(400,500));
sizeLocker.getVerticalScrollBar().setUnitIncrement(16);
add(sizeLocker);
created = true;
}
到目前为止,这一切都基本正常。单击按钮时,会生成并显示相应的窗口。但是,似乎总是缺少一件事:JScrollPane
。以任何方式将窗口调整为更小只会隐藏元素,而不是允许用户滚动。值得注意的是,所有内容都在那里,并且仅通过 JFrame
本身添加到 JScrollPane
。使用 JScrollPane
语句修改 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS)
确实会显示滚动条,但它始终显示为灰色。我还尝试删除窗口的各种元素,问自己诸如“嵌套的 JScrollPanes
不起作用吗?也许是 DetailBox
?尝试完全删除 lower
?”我尝试根据这些想法删除和重新添加元素,但没有任何区别,除了单个元素本身明显从框架中消失。
有没有其他人遇到过这样的事情,也许有解决办法?我的想法没有认真修改程序的行为,例如尝试布局而不是通过 setBounds()
使用绝对定位(我尝试使 DetailBox
在没有在其上绘制其他元素)。我能看到的这个 JScrollPane
和在同一程序中的其他地方工作的唯一真正区别是它是从它内部添加到 JFrame
的,而不是从它外部添加的。但是,它仍然使用 add()
方法,所以我看不出它会有什么严重影响。当然,如果需要,我非常乐意提供更多详细信息和/或代码。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)