0

Jidesoft の StyledLabel を拡張するカスタム ListCellRenderer を作成しました。私のレンダラーが使用されている JList は固定幅なので、私のレンダラーでは、この幅に基づいてテキストを短くしようとします。getListCellRendererComponent で setText を呼び出します。これは時々機能します。セルを選択すると、テキストはまったく短縮されていないかのように機能します。setText および text-shortening に関連する分岐はありません。

カスタムレンダリングとセルの高さについて説明しているこのやや関連する回答のソリューションを使用しようとしましたが、選択でも一貫して機能しませんでした。

編集:いくつかのコード

public class CustomListCellRenderer extends StyledLabel implements ListCellRenderer {

    public Component getListCellRendererComponent(
        JList list, 
        Object value, 
        int index, 
        boolean isSelected, 
        boolean cellHasFocus)   {
    setText(shortenName(value.toString(), 150));

    return this;
}

    private String shortenName(String name, int width)  {
    if(this.getGraphics() != null)  {
        final FontMetrics fontMetrics = this.getFontMetrics(this.getFont());

        String end = name.substring(name.length()/2);
        String beginning = name.substring( 0, name.length()/2);

        int stringWidth = SwingUtilities.computeStringWidth(fontMetrics, name);

        if(stringWidth < width)
            return name;

        do  {
            end = end.substring(1);
            beginning = beginning.substring(0, beginning.length() - 1);

            stringWidth = SwingUtilities.computeStringWidth(fontMetrics, beginning + "..." + end);
        } while (stringWidth > width);
        return beginning + "..." + end;
    }
    return name;
   }
    public static void main(String[] args)  {
    JFrame frame = new JFrame();
    JList list = new JList(new String[] {
            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
            "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"});
    list.setCellRenderer(new CustomListCellRenderer());
    frame.getContentPane().add(list);
    frame.setVisible(true);
}
}
4

1 に答える 1

1

の実装では、ラベルの にListCellRenderer依存しています。getGraphics()どちらでも問題ない場合もありgetGraphics()ますnullが、if(this.getGraphics() != null)条件を入力せず、単に変更されていない文字列を返すだけです。そのため、一貫性のない結果が得られます。この条件をコメントアウトすると、投稿されたコードの問題が解決しました。getGraphics()その値が制御 できないことに依存するべきではありません。

于 2014-04-15T21:41:29.007 に答える