JList项目中的自动换行

时间:2011-11-19 20:43:43

标签: java swing jscrollpane jlist

我有一个JList,项目名称非常长,导致水平滚动条显示在滚动窗格中。

无论如何,我可以自动换行,以便整个项目名称出现在2行中,但只需点击一下即可选择? I.E它仍应表现作为单个项目,但显示分为两行。


以下是我看到下面的例子后所做的事情

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

3 个答案:

答案 0 :(得分:19)

是的,使用安德鲁的代码,我想出了类似的东西:

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);
   }

}

答案 1 :(得分:0)

它可以更容易地完成。您可以使用ListModel通过consatructor创建JList。在CustomListModel中扩展AbstractListModel,getElementAt()方法可以返回具有相同html格式文本的String。所以这种做法在没有细胞渲染器修改的情况下也是如此。

答案 2 :(得分:-1)

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

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

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

<强>更新

结果如下: enter image description here