Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JList项中的单词换行_Java_Swing_Jscrollpane_Jlist - Fatal编程技术网

Java JList项中的单词换行

Java JList项中的单词换行,java,swing,jscrollpane,jlist,Java,Swing,Jscrollpane,Jlist,我有一个JList,其中有很长的项目名称,导致水平滚动条出现在滚动窗格中 我是否可以进行文字换行,以便整个项目名称显示在两行中,并且可以在一次单击中选择?也就是说,它应该仍然作为一个单一的项目,但显示在两行 下面是我在看到下面的示例后所做的 我在我的项目MyCellRenderer中添加了一个新类,然后添加了MyList.setCellRenderer(新的MyCellRenderer(80))在我的列表的后期创建代码中。还有什么我需要做的吗?是的,使用Andrew的代码,我想出了如下的方法:

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

我是否可以进行文字换行,以便整个项目名称显示在两行中,并且可以在一次单击中选择?也就是说,它应该仍然作为一个单一的项目,但显示在两行


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


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

是的,使用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);
   }

}
导入java.awt.Component;
导入javax.swing.*;
公共类宽度{
公共静态void main(字符串[]args){
字符串[]名称={“John Smith”,“engelbert Humberdinck”,
“约翰·雅各布·静默·施密特”};
MyCellRenderer cellRenderer=新的MyCellRenderer(80);
JList list=新JList(名称);
list.setCellRenderer(cellRenderer);
JScrollPane=新的JScrollPane(列表);
JPanel面板=新的JPanel();
面板。添加(sPane);
showMessageDialog(空,面板);
}
}
类MyCellRenderer扩展了DefaultListCellRenderer{
公共静态最终字符串HTML_1=“”;
公共静态最终字符串HTML_3=“”;
私有整数宽度;
公共MyCellRenderer(整型宽度){
这个。宽度=宽度;
}
@凌驾
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus){
String text=HTML_1+String.valueOf(宽度)+HTML_2+value.toString()
+HTML_3;
返回super.getListCellRenderComponent(列表、文本、索引、isSelected、,
细胞聚焦);
}
}

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

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

更新

结果如下所示:

这样做更容易。您可以使用ListModel通过ConsatrConstructor创建JList。在CustomListModel扩展AbstractListModel中,getElementAt()方法可以返回具有相同html格式文本的字符串。因此,这种方法可以在不修改单元格渲染器的情况下执行相同的操作。

我似乎记得有人(是Andrew)使用JLabel、HTML和简单样式表来解决类似的问题。是的,当然是Andrew:。我相信这个概念也可以在你的自定义单元格渲染器中使用。另一种选择(为什么每个人都看我很有趣?)是对长名称使用工具提示,对标签本身使用“Value is…”。当然,在HFoEs答案中给出的一个具体例子中,这不会很好地起作用。我不想用鼠标在名单上区分每个叫“穆罕默德”的人。这不是我的聪明,而是这里的这个:。我不能多次对他的答案进行投票,但我鼓励任何认为我的答案有帮助的人对链接进行投票。(大家都知道,包括@Andrew Thompson,我不太喜欢html欺骗,特别是如果错误地用于硬编码大小调整的话),为什么不使用列表的实际值而不是固定值呢?非常感谢您的示例!!我真的很感激!!嘿@HovercraftFullOfEels我刚试过这个代码。。。它似乎对我不起作用。。。。我没有在浏览器上开发任何东西,这是一个纯java应用程序,它不包装文本。。。你能帮帮我吗。下面是我所做的,我在我的项目MyCellRenderer中添加了一个新类,然后添加了MyList.setCellRenderer(新的MyCellRenderer(80));在我的列表的创建后代码中。还有什么我需要做的吗?谢谢你的帮助,但这不起作用。如果调整了JList的大小,则不会调整行的高度,并且会发生有趣的视觉效果。看到我的附加图像。。。我添加了绿色和红色来帮助说明。包装是用户界面,与模型无关。更改模型以适应UI是错误的。
String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3;