JList项

时间:2015-12-25 15:25:49

标签: java swing jlist listcellrenderer

我有一个JList,我添加了ListCellRenderer的实例作为JList的单元格渲染器

myList.setCellRenderer(new ListItemPanel());

此处myListJList,其中列表模型的类型为StringListItemPanel的实施如下。

public class ListItemPanel<E> extends javax.swing.JPanel implements ListCellRenderer<E>{
    public Component getListCellRendererComponent(JList<? extends E> list, E value, int index, boolean isSelected, boolean cellHasFocus) {
        nameLabel.setText(value.toString());
        if(isSelected){
            setBackground(Color.YELLOW);
            setPreferredSize(new Dimension(list.getWidth(), 40));
        }else{
            setBackground(Color.PINK);
            setPreferredSize(new Dimension(list.getWidth(), 18));
        }
        return this;
    }
}

使用上面这段代码,我希望在JList中更改所选项目的颜色和高度。但只有颜色变化才会发生。 list项的高度在开始时似乎为18。当我将18更改为其他值时,项目的高度将更改为该值。但是,当选择一个项目时,不会发生任何变化。

nameLabelJLabel上的JPanel

我尝试重新验证并重新绘制listJPanelnameLabel。并在setPreferredSizeJPanel中使用了JLabel方法 但是,在选择时,没有任何内容会改变list项的高度。希望有人可以帮助..!

修改

我需要的是在选择时更改项目的高度。

here中,它正在讨论根据文本中的文字更改每个项目的高度。但是,在添加文本后,高度是固定的。那不是我需要的...... 感谢大家的关注......

问题的SSCCE

import javax.swing.*;
import java.awt.*;

public class A  extends javax.swing.JFrame {

    private DefaultListModel<String> myListModel = new DefaultListModel<>();
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList myList;

    public A(){
        //Setting the GUI
        jScrollPane1 = new javax.swing.JScrollPane();
        myList = new javax.swing.JList();
        myList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1.setViewportView(myList);
        add(jScrollPane1);
        setSize(300,400);
        setLocationRelativeTo(null);

        //Add model, renderer and elements to the list
        myList.setModel(myListModel);
        myList.setCellRenderer(new ListItemPanel());
        myListModel.addElement("ABCD");
        myListModel.addElement("1234567890");
        myListModel.addElement("q121we34rt56yu7");
        myListModel.addElement("ABC 123 #$%");
        myListModel.addElement("11 11 22 22 33 33");
        myListModel.addElement("321 ewq A1");
    }

    //Execute the program
    public static void main(String[] args) throws Exception{
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new A().setVisible(true);
            }
        });
    }

}

//Customized ListCellRenderer
class ListItemPanel<E> extends javax.swing.JPanel implements ListCellRenderer<E>{

    private javax.swing.JLabel nameLabel;

    public ListItemPanel() {
        nameLabel = new javax.swing.JLabel();
        setLayout(new BorderLayout());
        add(nameLabel);
    }

    public Component getListCellRendererComponent(JList<? extends E> list, E value, int index, boolean isSelected, boolean cellHasFocus) {
        nameLabel.setText(value.toString());
        if(isSelected){
            setBackground(Color.YELLOW);
            setPreferredSize(new Dimension(list.getWidth(), 40));   //If selected, set the height to 40
        }else{
            setBackground(Color.PINK);
            setPreferredSize(new Dimension(list.getWidth(), 18));   //If not selected, set the height to 18
        }
        return this;
    }
}



回答问题

setFixedCellHeight()方法中,据说

  

...通过应用getPreferredSize ....

在ListUI中计算单元格高度

因此,如果可以在ListUI内更改值,我的任务就可以完成..

值存储在变量cellHeights中,正如我在源代码中看到的那样,该变量只更新一次。因此,我更改了代码,以便每次选择项目时都会更改cellHeights

答案的SSCCE

import javax.swing.*;
import java.awt.*;
import javax.swing.plaf.basic.BasicListUI;

public class A  extends javax.swing.JFrame {

    private DefaultListModel<String> myListModel = new DefaultListModel<>();
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList myList;

    public A(){
        //Setting the GUI
        jScrollPane1 = new javax.swing.JScrollPane();
        myList = new javax.swing.JList();
        myList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1.setViewportView(myList);
        add(jScrollPane1);
        setSize(300,400);
        setLocationRelativeTo(null);

        //Add model, renderer and elements to the list
        myList.setModel(myListModel);
        myList.setCellRenderer(new ListItemPanel());
        myList.setUI(new BasicListUI() {        //Update UI of JList

            @Override
            protected void paintCell(Graphics g, int row, Rectangle rowBounds, ListCellRenderer cellRenderer, ListModel dataModel, ListSelectionModel selModel, int leadIndex) {
                Object value = dataModel.getElementAt(row);
                boolean cellHasFocus = list.hasFocus() && (row == leadIndex);
                boolean isSelected = selModel.isSelectedIndex(row);
                ListItemPanel rendererComponent = (ListItemPanel)cellRenderer.getListCellRendererComponent(list, value, row, isSelected, cellHasFocus);
                int x = rendererComponent.getH();
                if(x != cellHeights[row]){
                    cellHeights[row] = x; //Change the height of the selected item
                    myList.repaint();   //Though repaint is called here, it will actualy be effected after this function call
                }
                super.paintCell(g, row, rowBounds, cellRenderer, dataModel, selModel, leadIndex);
            }

        });
        myListModel.addElement("ABCD");
        myListModel.addElement("1234567890");
        myListModel.addElement("q121we34rt56yu7");
        myListModel.addElement("ABC 123 #$%");
        myListModel.addElement("11 11 22 22 33 33");
        myListModel.addElement("321 ewq A1");
    }

    //Execute the program
    public static void main(String[] args) throws Exception{
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new A().setVisible(true);
            }
        });
    }

}

//Customized ListCellRenderer
class ListItemPanel<E> extends javax.swing.JPanel implements ListCellRenderer<E>{

    private int h;  //This variable is used to store the height of the component
    private javax.swing.JLabel nameLabel;

    public ListItemPanel() {
        nameLabel = new javax.swing.JLabel();
        setLayout(new BorderLayout());
        add(nameLabel);
    }

    public Component getListCellRendererComponent(JList<? extends E> list, E value, int index, boolean isSelected, boolean cellHasFocus) {
        nameLabel.setText(value.toString());
        if(isSelected){
            setBackground(Color.YELLOW);
            h = 40; //If selected, set the height to 40
        }else{
            setBackground(Color.PINK);
            h = 18; //If not selected, set the height to 18
        }
        return this;
    }

    public int getH(){
        return h;
    }
}

0 个答案:

没有答案