2015-09-02 5 views
0

У меня есть горизонтально расположенный JList. Все элементы в списке имеют значительно разные размеры, и по умолчанию рендеринг масштабирует каждый элемент до размера самого большого элемента в списке. Я попытался реализовать собственный рендеринг следующим образом, но каждый элемент в списке остается того же размера. Любой совет?JList Индивидуальные размеры

Ниже приводится ListCellRenderer:

package ui.wizards; 

import java.awt.Component; 
import java.awt.Dimension; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.ListCellRenderer; 
import javax.swing.SwingConstants; 

public class WizHistoryCellRenderer extends JLabel 
     implements ListCellRenderer<String> 
{ 
    private static final long serialVersionUID = -3650608268225337416L; 
    JList<? extends String> list; 

    @Override 
    public Component getListCellRendererComponent(JList<? extends String> list, 
     String value, int index, boolean isSelected, boolean cellHasFocus) 
    { 
     this.list = list; 
     int width = this.getFontMetrics(this.getFont()) 
      .stringWidth((String) value); 
     int height = 20; 
     setText(value); 

     if (list != null) 
     { 
      if (index == list.getSelectedIndex()) 
       showSelected(); 
      else 
       showUnselected(); 
     } 
     setMaximumSize(new Dimension((int) (1.1 * width), height)); 
     setPreferredSize(new Dimension((int) (1.1 * width), height)); 

     setHorizontalAlignment(SwingConstants.CENTER); 
     setOpaque(true); 

     return this; 
    } 

    private void showSelected() 
    { 
     setBackground(list.getSelectionBackground()); 
     setForeground(list.getSelectionForeground()); 
    } 

    private void showUnselected() 
    { 
     setBackground(list.getBackground()); 
     setForeground(list.getForeground()); 
    } 
} 

ответ

0

Попытка вызова метода setFixedCellHeight JList, с -1 в качестве аргумента. Это приводит к тому, что JList использует предпочтительную высоту, возвращаемую любым настраиваемым визуализатором при рисовании элементов списка.

+0

Я попытался вызвать setFixedCellHeight (-1) и setFixedCellWidth (-1) как до, так и после вызова setListCellRenderer(), но ни один из них не повлиял. – Bryant

0

Я думаю, вы могли бы попробовать подкласс javax.swing.plaf.basic.BasicListUI и переопределить protected void paintCell(Graphics g, int row, Rectangle rowBounds, ListCellRenderer cellRenderer, ListModel dataModel, ListSelectionModel selModel, int leadIndex) и, возможно, некоторые другие методы, выполняющие расчет размера ячейки.

Затем используйте JList.setUI(ListUI), чтобы применить свой пользовательский интерфейс. Пользовательский интерфейс отвечает за рисование JList с помощью ListCellRenders. Пожалуйста, извините, что я не представляю полный пример, поскольку это, по-видимому, большая часть работы по настройке всех аспектов пользовательского процесса рисования.

+0

Спасибо за подсказку. Если я смогу заставить его работать, я опубликую твики. – Bryant

Смежные вопросы