Question

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

Was it helpful?

Solution

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;
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top