我拥有的: 一个分割面板,右侧有一个滚动面板。 在这个滚动面板中,我有一个JPanel。 我希望在这个JPanel中有一系列其他的JPanel堆叠在一起。 我将Layout设置为BoxLayout。现在它堆叠了多个JPanels,但我有两个问题: 如果我从JPanel获取的内容比我的框架占用更少的空间,那么Jpanel之间的空间就会很大。
如果我从JPanel获得的内容比我的框架大,那么Pannels会相互重叠,而我在scrollPanel上的滚动不会激活。
frame = new Frame();
splitPane = new SplitPane();
scrollPane = new ScrollPane();
frame.add(splitPane);
scrollPane.setViewportView(new Lesson());
splitPane.setRightComponent(scrollPane);
splitPane.setLeftComponent(new JTree());
Frame,SplitPane,ScrollPane()是扩展JFrame,JSplitPane,JScrollPane的类。 Atm他们只有一个构造函数,在它工作之后,我想在那里进行一些自定义。
public class Lesson extends JPanel {
private static final long serialVersionUID = 1L;
public Lesson() {
customize();
String text = "text from pictures";
add(new Paragraph(text));
add(new Paragraph(text));
}
private void customize() {
BoxLayout boxLayout = new BoxLayout(this, BoxLayout.PAGE_AXIS);
setLayout(boxLayout);
}
}
public class Paragraph extends JPanel {
private static final long serialVersionUID = 1L;
public Paragraph(String text) {
setLayout(new FlowLayout(FlowLayout.LEFT));
setPreferredSize(new Dimension());
StringTokenizer splitStringTokenizer = new StringTokenizer(text, " ");
while(splitStringTokenizer.hasMoreTokens()){
add(label(splitStringTokenizer.nextToken().toString()));
}
}
private JLabel label(String string){
JLabel jlabel= new JLabel(string);
return jlabel;
}
}
有关如何解决此问题的任何提示? Ty提前。
答案 0 :(得分:3)
BoxLayout尊重添加到其中的组件的最大和最小尺寸。您正在使用Paragraph面板中的FlowLayout。首选大小始终是一行组件。
面板将缩小,直到只显示一行或增长占据所有空间。
当有更多空间时,允许面板生长。
覆盖Paragraph面板的getMaximum / MinimumSize()以返回首选大小。
问题是为什么使用一组标签来显示文字。你为什么不使用文本区域。
或者另一种选择可能是使用WrapLayout自动包装组件并根据包装重新计算首选大小。您仍然希望覆盖getMinimum / Maximum大小计算以返回首选大小。
我希望稍后在一些jlabels中添加一些鼠标监听器。
为什么呢?再次,如果您使用文本区域,您可以将MouseListener直接添加到文本区域,然后您可以使用插入位置(或将鼠标位置转换为文本区域中的偏移量)以确定鼠标所在的单词然后做你的处理。