我有一个JList
,我添加了ListCellRenderer
的实例作为JList
的单元格渲染器
myList.setCellRenderer(new ListItemPanel());
此处myList
是JList
,其中列表模型的类型为String
。 ListItemPanel
的实施如下。
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
更改为其他值时,项目的高度将更改为该值。但是,当选择一个项目时,不会发生任何变化。
nameLabel
是JLabel
上的JPanel
。
我尝试重新验证并重新绘制list
,JPanel
和nameLabel
。并在setPreferredSize
和JPanel
中使用了JLabel
方法
但是,在选择时,没有任何内容会改变list
项的高度。希望有人可以帮助..!
在here中,它正在讨论根据文本中的文字更改每个项目的高度。但是,在添加文本后,高度是固定的。那不是我需要的...... 感谢大家的关注......
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
。
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;
}
}