我正在基于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()));
}
}
我无法显示正确的年份。我明白了
代替实际的整数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()
获取存储在列表中的值。我现在将渲染器移到项目中的外部类文件中。
最佳答案
就像@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()));
这很简单。