gpt4 book ai didi

java - ListCellRenderer 未显示所需的文本

转载 作者:行者123 更新时间:2023-12-01 13:44:19 26 4
gpt4 key购买 nike

我试图仅获取 ArrayList 元素中的第一项以显示在组合框中。有人建议使用 ListCellRenderer 可以帮助我实现这一目标。我已经尝试了很多次,但无法访问必要的 getCourseNum() 方法来显示。我的代码:

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

public class CourseCon extends JPanel {

private static JPanel editPanel;
private JComboBox<String> editComboLevel;
private JComboBox editCombo;
private static ArrayList<Course> course = new ArrayList<Course>();

public CourseCon() {

Integer[] intArray = new Integer[course.size()];
for (int i = 0; i < course.size(); i++) {
intArray[i] = new Integer(i);
}
editPanel = new JPanel();
editPanel.setPreferredSize(new Dimension(100,70));
editPanel.add(editCombo = new JComboBox(intArray));
ComboBoxRenderer renderer= new ComboBoxRenderer();
editCombo.setRenderer(renderer);
editCombo.setSelectedIndex(0);
}

private static void createAndShowGUI() {
JFrame frame = new JFrame("Example of Code Snippet");
JComponent newContentPane = new CourseCon();
newContentPane.setOpaque(true);
frame.add(editPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setPreferredSize(new Dimension(120,80));
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
course.add(new Course("Course-1", "Description-1",
1, 2, "Level 1"));
course.add(new Course("Course-2", "Description-2",
3, 4, "Level 2"));
createAndShowGUI();
for(Course 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();
//String course = courseArray[selectedIndex];
//I couldn't get this to work

if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
//I put this in to test and it does show two times
//makes me think if I could just access getCourseNum()
//I'd have it. Correct me if I'm wrong please
setText("Testing");

return this;
}
}
}

这是我正在使用的类(class):

import java.util.*;

public class Course {

private String courseNum, courseTitle, courseLevel;
private int courseDur, courseFee;

Course() {}

Course(String courseNum, String courseTitle, int courseDur,
int courseFee, String courseLevel) {
this.courseNum = courseNum;
this.courseTitle = courseTitle;
this.courseDur = courseDur;
this.courseFee = courseFee;
this.courseLevel = courseLevel;
}
@Override
public String toString() {
String courseInfo = this.getCourseNum()+ ", "+this.getCourseTitle()+", "
+this.getCourseDur()+", "+this.getCourseFee()+", "+this.getCourseLevel();
return courseInfo;
}
public String getCourseNum() {
return this.courseNum;
}
public String getCourseTitle() {
return this.courseTitle;
}
public int getCourseDur() {
return this.courseDur;
}
public int getCourseFee() {
return this.courseFee;
}
public String getCourseLevel() {
return this.courseLevel;
}
public void setCourseNum(String courseNum) {
this.courseNum = courseNum;
}
public void setCourseTitle(String courseTitle) {
this.courseTitle = courseTitle;
}
public void setCourseDur(int courseDur) {
this.courseDur = courseDur;
}
public void setCourseTitle(int courseFee) {
this.courseFee = courseFee;
}
public void setCourseLevel(String courseLevel) {
this.courseLevel = courseLevel;
}
}

我已经尝试了几天,但我在未知的水域中游泳。如何访问 getCourseNum() 方法,以便这是填充组合框的唯一方法?任何帮助将不胜感激。注意:几天前我问了一个类似的问题,有人建议我修改我的代码。这是我的新尝试。我是一名初学者,所以欢迎任何和所有的建议。干杯

最佳答案

首先,将所有类(class)添加到组合框中,从长远来看,这将使您的生活变得更加美好和轻松......

editPanel.add(editCombo = new JComboBox(course.toArray(new Course[course.size()])));

其次,修改您的ComboBoxRenderer以接受Course而不是int...

if (value instanceof Course) {
Course course = (Course) value;
value = course.getCourseNum();
}

最后,您可能需要考虑使用从 DefaultListCellRenderer 扩展而不是 JLabel 并实现 ListCellRenderer,因为它负责整个过程一堆重要的东西...比如选择突出显示...

enter image description here

import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;

public class CourseCon extends JPanel {

private static JPanel editPanel;
private JComboBox<String> editComboLevel;
private JComboBox editCombo;
private static ArrayList<Course> course = new ArrayList<Course>();

public CourseCon() {

editPanel = new JPanel();
editPanel.setPreferredSize(new Dimension(100, 70));
editPanel.add(editCombo = new JComboBox(course.toArray(new Course[course.size()])));
ComboBoxRenderer renderer = new ComboBoxRenderer();
editCombo.setRenderer(renderer);
editCombo.setSelectedIndex(0);
}

private static void createAndShowGUI() {
JFrame frame = new JFrame("Example of Code Snippet");
JComponent newContentPane = new CourseCon();
newContentPane.setOpaque(true);
frame.add(editPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setPreferredSize(new Dimension(120, 80));
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
course.add(new Course("Course-1", "Description-1",
1, 2, "Level 1"));
course.add(new Course("Course-2", "Description-2",
3, 4, "Level 2"));
createAndShowGUI();
for (Course item : course) {
System.out.println(item);
}
}
});
}

class ComboBoxRenderer extends DefaultListCellRenderer {

public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {

if (value instanceof Course) {
Course course = (Course) value;
value = course.getCourseNum();
}

return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}

public static class Course {

private String courseNum, courseTitle, courseLevel;
private int courseDur, courseFee;

Course() {
}

Course(String courseNum, String courseTitle, int courseDur,
int courseFee, String courseLevel) {
this.courseNum = courseNum;
this.courseTitle = courseTitle;
this.courseDur = courseDur;
this.courseFee = courseFee;
this.courseLevel = courseLevel;
}

@Override
public String toString() {
String courseInfo = this.getCourseNum() + ", " + this.getCourseTitle() + ", "
+ this.getCourseDur() + ", " + this.getCourseFee() + ", " + this.getCourseLevel();
return courseInfo;
}

public String getCourseNum() {
return this.courseNum;
}

public String getCourseTitle() {
return this.courseTitle;
}

public int getCourseDur() {
return this.courseDur;
}

public int getCourseFee() {
return this.courseFee;
}

public String getCourseLevel() {
return this.courseLevel;
}

public void setCourseNum(String courseNum) {
this.courseNum = courseNum;
}

public void setCourseTitle(String courseTitle) {
this.courseTitle = courseTitle;
}

public void setCourseDur(int courseDur) {
this.courseDur = courseDur;
}

public void setCourseTitle(int courseFee) {
this.courseFee = courseFee;
}

public void setCourseLevel(String courseLevel) {
this.courseLevel = courseLevel;
}
}
}

关于java - ListCellRenderer 未显示所需的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462340/

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