JScrollPane JPanel和Layouts

时间:2014-03-22 15:00:49

标签: java swing layout jpanel layout-manager

我拥有的: 一个分割面板,右侧有一个滚动面板。 在这个滚动面板中,我有一个JPanel。 我希望在这个JPanel中有一系列其他的JPanel堆叠在一起。 我将Layout设置为BoxLayout。现在它堆叠了多个JPanels,但我有两个问题: 如果我从JPanel获取的内容比我的框架占用更少的空间,那么Jpanel之间的空间就会很大。 enter image description here

如果我从JPanel获得的内容比我的框架大,那么Pannels会相互重叠,而我在scrollPanel上的滚动不会激活。

enter image description here

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提前。

1 个答案:

答案 0 :(得分:3)

BoxLayout尊重添加到其中的组件的最大和最小尺寸。您正在使用Paragraph面板中的FlowLayout。首选大小始终是一行组件。

面板将缩小,直到只显示一行或增长占据所有空间。

当有更多空间时,允许面板生长。

覆盖Paragraph面板的getMaximum / MinimumSize()以返回首选大小。

问题是为什么使用一组标签来显示文字。你为什么不使用文本区域。

或者另一种选择可能是使用WrapLayout自动包装组件并根据包装重新计算首选大小。您仍然希望覆盖getMinimum / Maximum大小计算以返回首选大小。

  

我希望稍后在一些jlabels中添加一些鼠标监听器。

为什么呢?再次,如果您使用文本区域,您可以将MouseListener直接添加到文本区域,然后您可以使用插入位置(或将鼠标位置转换为文本区域中的偏移量)以确定鼠标所在的单词然后做你的处理。