【问题标题】:Readjust text inside of JList element重新调整 JList 元素内的文本
【发布时间】:2018-07-03 00:19:33
【问题描述】:

我有一个JList,列表中填充了文件的元素,我希望将元素中的文本调整为列表的大小,增加单元格的高度并给出换行符。

我该怎么做?

【问题讨论】:

  • 你的意思是显示的JList的宽度应该适合文本的长度?你的意思是做什么
  • 如果是前者,并且您的 JList 是 JList<String>,则通过调用 jList.setPrototypeCellValue(....) 为列表设置原型字符串,其中 .... 表示适当大小的字符串。
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • @HovercraftFullOfEels “为什么要回答然后删除?”我在发布答案后再次阅读了这个问题,并决定我给出了正确的答案......对于错误的问题!我现在阅读它的方式是,OP 需要在列表中带有自动换行的可变高度单元格。 OP:使用带有正文宽度的 HTML 可能可以实现,但我没有时间检查。
  • @HovercraftFullOfEels OK.. 我有时间重新审视这个问题并确认 HTML 格式的单元格渲染器按预期工作。 :)

标签: java swing jlist defaultlistmodel


【解决方案1】:

我希望将元素中的文本调整为列表的大小

列表单元格渲染器(通常是JLabel)支持 HTML 格式,因此我们可以使用样式来设置正文宽度。单元格的高度将相应调整。中间列表使用限制为 100 像素宽度的渲染器。

这是基于前一千个 Unicode 字符的属性的三个列表。每个列表都尽可能宽,以便在列表模型中显示最宽的字符串(但它的格式是为了呈现)。

这是 MCVE:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Vector;

public class UnicodeNameList {

    private JComponent ui = null;

    UnicodeNameList() {
        initUI();
    }

    public final void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));
        Vector<String> unicodeNames = new Vector<>();
        Vector<String> unicodeDir = new Vector<>();
        Vector<String> unicodeChar = new Vector<>();
        for (int ii=0; ii<1000; ii++) {
            unicodeChar.add(new String(Character.toChars(ii)));
            unicodeNames.add(Character.getName(ii));
            unicodeDir.add("" + Character.getDirectionality(ii));
        }
        ui.add(new JScrollPane(new JList(unicodeChar)), BorderLayout.LINE_START);
        JList list = new JList(unicodeNames);
        LongListCellRenderer llcr = new LongListCellRenderer();
        list.setCellRenderer(llcr);
        ui.add(new JScrollPane(list));
        ui.add(new JScrollPane(new JList(unicodeDir)), BorderLayout.LINE_END);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            UnicodeNameList o = new UnicodeNameList();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}

class LongListCellRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        String pre = "<html><body style='width: 100px;'>";
        JLabel l = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        String s = value==null ? "Null" : value.toString();
        l.setText(pre + s);
        return l;
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2022-06-13
  • 1970-01-01
  • 2021-07-24
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多