【问题标题】:JScrollPanel JPanel and LayoutsJScrollPane JPanel 和布局
【发布时间】:2014-04-30 00:43:03
【问题描述】:

我有什么: 右侧带有滚动面板的拆分面板。 在这个滚动面板中,我有一个 JPanel。 我想在这个 JPanel 中有一系列其他 JPanel 堆叠在另一个 JPanel 下。 我将布局设置为 BoxLayout。现在它堆叠了多个 JPanel,但我有两个问题: 如果我来自 JPanel 的内容占用的空间比我的框架少,那么 Jpanel 之间的空间就会很大。

如果我来自 JPanel 的内容比我的框架大,那么 Pannel 将相互重叠,并且我的来自 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。

【问题讨论】:

  • 您的问题是您的 Pharagraph 类(应该重命名为 Paragraph 吗?) JPanel 使用 FlowLayout,如果 JPanel 的内容大于其大小,它不会增加其大小。您可能希望使用其他布局,甚至创建自己的自定义布局来解决此问题。问题:您的令牌必须是 JLabels 吗?如果您只是将文本添加到 JTextArea,那么您的问题就会得到解决。
  • Tokens buns 是 JLabels,即使是文本,我想稍后在一些 jlabels 中添加一些鼠标侦听器。我删除了 flowLayout,但它仍然在其他面板上
  • "I removed the FlowLayout" -- 你确定吗? JPanel 的默认布局是 FlowLayout,我敢打赌,如果您打印出此类的布局,即使您将其删除,它实际上也会是 FlowLayout。可以在 JTextArea 中使用 MouseListener,您可以识别单击了哪些文本。我再次建议使用 JTextArea。
  • 我将开始搜索 JTextArea 以及如何做到这一点。 Ty 获取信息。

标签: java swing layout jpanel layout-manager


【解决方案1】:

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

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

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

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

问题是为什么要使用标签面板来显示文本。为什么不使用文本区域。

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

我想稍后在一些 jlabels 中添加一些鼠标侦听器。

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

【讨论】:

  • 我想为一些 jlabels 添加一些鼠标监听器,所以这就是我使用 Jlabels 的原因。
  • @RareşSmeu,我想我的评论不清楚,我的意思是您可以将 MouseListener 直接添加到文本区域以确定鼠标所在的单词。当您可以将 MouseListener 直接添加到文本区域时,您为什么认为需要使用 JLabel?
  • 我不知道这是可能的,我会尝试使用 JTextArea。我改为 WrapLayout 并覆盖 getMinimum/Maximum 大小,我的问题就解决了。泰
猜你喜欢
  • 2012-08-14
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多