gpt4 book ai didi

java - 无法使 ListCellRenderer 正常运行

转载 作者:行者123 更新时间:2023-12-01 23:22:47 24 4
gpt4 key购买 nike

今天早些时候我发布了一个问题,并在 MadProgrammer 的指导下使用 ListCellRenderer 来实现所需的结果。我几乎可以正常工作,但它在组合框中显示相同的条目两次,我不知道为什么。请帮我解答这个谜题。代码:

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

public class NotWorking extends JPanel {
private JPanel editPanel;
private JComboBox<String> editComboLevel;
private JComboBox editCombo;
private String[] levels = {"Level 1", "Level 2", "Level 3"};
private static ArrayList<NotWorking> course = new ArrayList<NotWorking>();
public static String courseNum, courseTitle, courseLevel;

public JPanel createContentPane (){

Integer[] intArray = new Integer[course.size()];
for (int i = 0; i < course.size(); i++) {
intArray[i] = new Integer(i);
}

editPanel = new JPanel(new GridLayout(4,2));
editPanel.setPreferredSize(new Dimension(100,75));
editPanel.add(editCombo = new JComboBox(intArray));
ComboBoxRenderer renderer= new ComboBoxRenderer();
editCombo.setRenderer(renderer);

return editPanel;
}

NotWorking() {}
NotWorking(String courseNum, String courseTitle, String courseLevel) {
this.courseNum = courseNum;
this.courseTitle = courseTitle;
this.courseLevel = courseLevel;
}
@Override
public String toString() {
String courseInfo = getCourseNum() + ", " + getCourseTitle() + ", " + getCourseLevel();
return courseInfo;
}
public String getCourseNum() {
return this.courseNum;
}
public String getCourseTitle() {
return this.courseTitle;
}
public String getCourseLevel() {
return this.courseLevel;
}
public void setCourseNum(String courseNum) {
this.courseNum = courseNum;
}
public void setCourseTitle(String courseTitle) {
this.courseTitle = courseTitle;
}
public void setCourseLevel(String courseLevel) {
this.courseLevel = courseLevel;
}

private static void createAndShowGUI() {
JFrame frame = new JFrame("Example of Code Snippet");
NotWorking myCourse = new NotWorking();
frame.setContentPane(myCourse.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
course.add(new NotWorking("Course1", "Course1 desc", "Level 1"));
course.add(new NotWorking("Course2", "Course2 desc", "Level 2"));
createAndShowGUI();
for(NotWorking item : course)
System.out.println(item);
}
});
}
class ComboBoxRenderer extends JLabel
implements ListCellRenderer {
public ComboBoxRenderer() {
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
}

public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
int selectedIndex = ((Integer)value).intValue();

if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}

setText(getCourseNum());

return this;
}
}
}

正如您所看到的,ArrayList 中添加了 2 个内容。我将组合框中的显示限制为仅显示类(class)编号,但 Course2 显示了两次,当我打印 ArrayList 的内容时,我看到 Course2 的所有详细信息显示了两次,而 Course1 则没有显示。任何帮助将不胜感激。干杯

最佳答案

使用自定义渲染器只是解决方案的一半。自定义渲染器将通过使用组合框的键盘来打破默认的项目选择。请参阅Combo Box With Custom Renderer了解更多信息和更完整的解决方案。

您的代码的主要问题是 NotWorking 类。此类不应扩展 JPanel。它只是一个类,用于保存该类的 3 个属性。类(class)编号、标题和级别不应是静态变量。不应引用 Swing 组件。

您的设计应该是一个类用于 NotWorking 类,另一个类用于创建 GUI。

How to Use Combo Boxes 上的 Swing 教程中的部分开始为了更好的设计。然后自定义教程中的 ComboBoxDemo.java 示例代码,将 NotWorking 类添加到组合框中,而不是添加字符串数据。

关于java - 无法使 ListCellRenderer 正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com