我正在基于DAO模式设计类。

我有3个班级和1个GUI表单。

public interface SchoolYearDao {
    List<SchoolYear> getAllSchoolYearInfo();
    List<SchoolYear> getAllSchoolYearStart();
    List<SchoolYear> getAllSchoolYearEnd();
    List<SchoolYear> getSchoolYearById(int aSchoolYearId);
    int getSchoolYearId(SchoolYear schoolyear);
    boolean addSchoolYear(SchoolYear schoolyear);

}

public class SchoolYear {
 //setters and getters
}

public class SchoolYearDaoImpl implements SchoolYearDao{
@Override
    public List<SchoolYear> getAllSchoolYearStart() {
        List<SchoolYear> listOfSchoolYearStart = new ArrayList<>();
        SchoolYear mySchoolYear = new SchoolYear();
        String SQL = "{CALL getAllSchoolYearInfo()}";

        try(Connection con = DBUtil.getConnection(DBType.MYSQL);
                CallableStatement cs = con.prepareCall(SQL);) {
            try(ResultSet rs = cs.executeQuery();){
                while(rs.next()){
                    mySchoolYear.setStart(rs.getInt("yearFrom"));
                }
                listOfSchoolYearStart.add(mySchoolYear);
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage());
        }
        System.out.println(listOfSchoolYearStart);
        return listOfSchoolYearStart;
    }
}


问题出在GUI上。

public class SchoolYearGUI extends javax.swing.JPanel {
    public SchoolYearGUI() {
        initComponents();

        schoolYearStartJcbx.setModel(new DefaultComboBoxModel(schoolyear.getAllSchoolYearInfo().toArray());
        schoolYearEndJcbx.setModel(new DefaultComboBoxModel(schoolyear.getAllSchoolYearEnd().toArray()));
    }
}


我无法显示正确的年份。我明白了

java - 将List &lt;ClassName&gt;转换为数组对象以设置为JComboBoxModel-LMLPHP

代替实际的整数2015、2016、2017等...

我在线研究,发现了类似的问题,但大多数问题都没有使用class列表作为List<SchoolYear>。在这种情况下,“ SchoolYear”是班级的名称。

我使用toArray();并尝试了Arrays.toString(array);,但无法正确执行。
我以为我会将返回类型更改为DefaultComboBoxModel方法的getAllSchoolYearStart(),但我意识到我必须保留List<SchoolYear>作为返回类型,以防万一我需要将结果集用作JTables等的模型。

因此,我只想使用List<SchoolYear>作为返回类型。 (如果这是个好主意?)

获得实际价值的最佳方法是什么?

提前致谢。

==============解决方案============================

感谢MadProgrammer的建议和其他答复者。

因此,我通宵研究了listcellrenderer并最终获得了如何使用它的基本思路。

public MainFrame() {
        initComponents();
        SchoolYearDaoImpl sy = new SchoolYearDaoImpl();
        DefaultComboBoxModel model = new DefaultComboBoxModel(sy.getAllSchoolYearStart().toArray());
        jcmbSchoolYearStart.setModel(model);
        jcmbSchoolYearStart.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if(value instanceof SchoolYear){
                    SchoolYear schoolyear = (SchoolYear) value;
                    setText(""+schoolyear.getStart());
                }
                return this;
            }
        } );
    }


我重写了getListCellRendererComponent并创建了一个if-statement来测试value是否是我的班级实例“ SchoolYear”,然后将任何原始的value强制转换为SchoolYear,然后使用SchoolYear模型的获取器getStart()获取存储在列表中的值。

我现在将渲染器移到项目中的外部类文件中。

java - 将List &lt;ClassName&gt;转换为数组对象以设置为JComboBoxModel-LMLPHP

最佳答案

就像@MadProgrammer所说的那样,在new DefaultComboBoxModel(schoolyear.getAllSchoolYearInfo().toArray()中,您放入了一个Object数组,而JComboBox的构造函数将尝试使用toString()方法来转换SchoolYear的每个实例以呈现它作为纯文本。如果您不覆盖默认的toString()方法以随意显示它,您将在现在的组合框中看到所看到的内容:类名和一些数字。

您可以实现toString()方法,但这不是最佳方法。您可以与getSchoolYearId()一起构造一些实用程序方法,以获取列表中每个对象的ID,并用ID填充数组。

private int[] getIDAndFillAnArray(List<SchoolYear> syrs) {
    int[] ids = new int[syrs.size()];
    for (int i=0; i<syrs.size(); i++) {
        ids[i] = syrs.get(i).getSchoolYearId();
    }
    return ids;
}


就像这样使用它:

schoolYearStartJcbx.setModel(new DefaultComboBoxModel(getIDAndFillAnArray(schoolyear.getAllSchoolYearInfo()));


这很简单。

10-06 16:02