JList 项中的自动换行

Posted

技术标签:

【中文标题】JList 项中的自动换行【英文标题】:Word wrap in JList items 【发布时间】:2012-01-02 02:06:00 【问题描述】:

我有一个 JList 的项目名称很长,导致水平滚动条出现在滚动窗格中。

无论如何我可以自动换行,以便整个项目名称出现在 2 行中,但可以一键选择?即,它仍应表现为单个项目,但显示为两行。


这是我在看到下面的示例后所做的

我在我的项目 MyCellRenderer 中添加了一个新类,然后在我的列表的帖子创建代码中添加了 MyList.setCellRenderer(new MyCellRenderer(80));。我还有什么需要做的吗?

【问题讨论】:

我似乎记得有人(是 Andrew)使用 JLabel、html 和简单的样式表来解决这样的问题。 是的,当然是 Andrew:is-there-some-word-wrap-property-of-jlabel-exist。我相信这个概念也可以用在你的自定义单元格渲染器中。 另一种选择(为什么每个人都在看我好笑?)是使用工具提示作为长名称,使用“值是...”作为标签本身。当然,这不适用于HFoEs answer中给出的一个具体示例。我不想将鼠标悬停在列表上以区分每个名为“Mohamed”的人。 【参考方案1】:

是的,使用 Andrew 的代码,我想出了这样的东西:

import java.awt.Component;
import javax.swing.*;

public class JListLimitWidth 
   public static void main(String[] args) 
      String[] names =  "John Smith", "engelbert humperdinck",
            "john jacob jingleheimer schmidt" ;
      MyCellRenderer cellRenderer = new MyCellRenderer(80);
      JList list = new JList(names);
      list.setCellRenderer(cellRenderer);
      JScrollPane sPane = new JScrollPane(list);
      JPanel panel = new JPanel();
      panel.add(sPane);
      JOptionPane.showMessageDialog(null, panel);

   


class MyCellRenderer extends DefaultListCellRenderer 
   public static final String HTML_1 = "<html><body style='width: ";
   public static final String HTML_2 = "px'>";
   public static final String HTML_3 = "</html>";
   private int width;

   public MyCellRenderer(int width) 
      this.width = width;
   

   @Override
   public Component getListCellRendererComponent(JList list, Object value,
         int index, boolean isSelected, boolean cellHasFocus) 
      String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString()
            + HTML_3;
      return super.getListCellRendererComponent(list, text, index, isSelected,
            cellHasFocus);
   


【讨论】:

这不是我的聪明才智,而是这里的这个:Andrew's post。我不能多次为他的回答点赞,但我鼓励任何认为我的回答对链接有帮助的人点赞。 (你们都知道,包括@Andrew Thompson,我不太喜欢 html 欺骗,尤其是如果误用于硬编码大小 )那么,为什么不使用实际的 with的列表而不是固定的? 非常感谢这个例子!我真的很感激! 嘿@HovercraftFullOfEels 我刚刚尝试了这段代码......它似乎对我不起作用......我没有在浏览器上开发任何东西它是一个纯Java应用程序并且它不包装文本。 ..你能帮帮我吗?这是我所做的我在我的项目 MyCellRenderer 中添加了一个新类,然后我添加了 MyList.setCellRenderer(new MyCellRenderer(80));在我的列表的帖子创建代码中。还有什么我需要做的吗?感谢您的帮助和耐心【参考方案2】:

它可以更容易地完成。您可以使用 ListModel 通过构造函数创建 JList。在 CustomListModel 扩展 AbstractListModel 中,getElementAt() 方法可以返回具有相同 html 格式文本的字符串。所以这种方式在不修改单元格渲染器的情况下也是如此。

【讨论】:

包装是 UI 而不是模型相关。更改模型以适应 UI 是不好的。【参考方案3】:

您还可以动态计算宽度(而不是固定值):

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3;

因此,如果面板调整列表大小,换行仍然正确。

更新

结果如下所示:

【讨论】:

这不起作用。如果调整 JList 的大小,则不会调整行的高度,并且会发生有趣的视觉事情。看我附上的图片...我添加了绿色和红色来帮助说明。

以上是关于JList 项中的自动换行的主要内容,如果未能解决你的问题,请参考以下文章

poi如何设置word中的表格自动换行

如何使用 CSS 防止列表项中的换行符

怎样让excel表格中的文字自动换行

表格中的Lable怎样自动换行 ? ASP.NET C#

notepad++怎样设置自动换行

在内联元素中的块元素会自动换行..求解答~谢谢~