ListCellRenderer not showing desired text

561 views Asked by At

I am trying to get only the first item in an ArrayList element to display in a combobox. It has been suggested that using ListCellRenderer would help me to achieve this. I have tried and tried, but am unable to access the necessary getCourseNum() method to show up. My code:

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;
        }
    }
}

And here is the class I'm working with:

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;
    }
}

I've been trying for a couple of days, but I'm swimming in unknown waters here. How can I access the getCourseNum() method so that is the only thing populating the combobox? Any help would be greatly appreciated. NOTE: I asked a similar question a couple of days ago and it was suggested to me that I revamp my code. This is my new attempt. I'm a beginning student so any and all suggestions are welcome. Cheers

1

There are 1 answers

4
MadProgrammer On BEST ANSWER

First, add all the Courses to the combobox, this will make your life infinitely better and easier in the long run...

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

Second, modify you ComboBoxRenderer to accept Course instead of int...

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

Lastly, you might want to consider using extending from DefaultListCellRenderer instead of JLabel and implementing the ListCellRenderer, as it takes care of a whole bunch of important stuff...like selection highlighting....

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;
        }
    }
}