我有一个JSlider,其值从1到360.对于每个值,我想从数据库中获取一个图像并将其放到JLabel中。所以我有360个案例,其中单个区别是用于从数据库中获取相应图像的变量开关(参见下面的代码)。我知道我需要刷新我的代码,因为我的“解决方案”代码非常繁重。
我希望我清楚我要存档的内容。贝娄是代码。
degreesSlider = new JSlider(); //my JSlider
degreesSlider.setMajorTickSpacing(10);
degreesSlider.setMaximum(360);
degreesSlider.setMinorTickSpacing(1);
degreesSlider.setOrientation(javax.swing.JSlider.VERTICAL);
degreesSlider.setPaintLabels(true);
degreesSlider.setPaintTicks(true);
degreesSlider.setSnapToTicks(true);
degreesSlider.setValue(0);
degreesSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent evt) {
int x = degreesSlider.getValue(); //get JSlider value
int row = myJTable.getSelectedRow();
int realIndex = myJTable.convertRowIndexToModel(row);
String clickJTable = (myJTable.getModel().getValueAt(realIndex, 0).toString()); //detect my JTable row click
switch (x) {
case 1:
try {
PreparedStatement pst = conn.prepareStatement("select pol, cros from test where degrees = ? AND id_min=?");
pst.setInt(1, x); //x is the only variable of the all 360 cases
pst.setString(2, clickJTable);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
byte[] imageP = rs.getBytes("pol");
byte[] imageC = rs.getBytes("cros");
pol = new ImageIcon(imagepolars);
cros = new ImageIcon(imagecrossed);
mineralsPolars.setIcon(pol); //put image into JLabel
mineralsCrossed.setIcon(cros); //put image into JLabel
}
rs.close();
pst.close();
} catch (Exception e) {
}
break;
//case 2, 3, 4 ... 360 with the same code and the difference between them is the variable x
}
}
});
答案 0 :(得分:3)
考虑到每个switch子句的代码是相同的,为什么不用
替换你的开关? if (x >= 1 && x <= 360) {
// do the db lookup
}
编辑:
您需要if语句的唯一原因是,如果要检查滑块值(x
)是否与查询指定的范围相同,并且@NominSim指出,滑块值是在你的控制中,所以你可能根本不需要它。
答案 1 :(得分:2)
根据我的理解,您不需要switch
语句,您只需要一个能够根据滑块值检索和更新带有正确图标的图标的功能。由于检索和更新图标的代码仅基于您的x
值,因此将传递给新函数。
要提高此类函数的性能,可以将预处理语句对象的创建移到此函数之外。由于为每个调用创建一个预准备语句对象将取消预准备语句的几乎所有好处,并且在每次调用/滑块值更改时构建如此重的对象是非常昂贵的。
我建议使用DAO对象将db逻辑封装在一个地方,而不是用SQL和db逻辑污染UI代码。这样,通过重用已创建的语句并重用代码,您将能够获得更好的性能。
答案 2 :(得分:1)
每个case值必须是编译时常量/表达式,而不是a 变量。没有两个与a关联的case常量表达式 switch语句可能具有相同的值。
你可以拥有的是调用具有选定值的子程序
类似于changeLabelImgTo(int count);
答案 3 :(得分:0)
将代码解压缩到方法中并传入变量x
:
public void stateChanged(ChangeEvent evt) {
...
fetchImage(x);
...
}
private void fetchImage(int x) {
try {
PreparedStatement pst = conn.prepareStatement("select pol, cros from test where degrees = ? AND id_min=?");
pst.setInt(1, x); //x is the only variable of the all 360 cases
pst.setString(2, clickJTable);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
byte[] imageP = rs.getBytes("pol");
byte[] imageC = rs.getBytes("cros");
pol = new ImageIcon(imagepolars);
cros = new ImageIcon(imagecrossed);
mineralsPolars.setIcon(pol); //put image into JLabel
mineralsCrossed.setIcon(cros); //put image into JLabel
}
rs.close();
pst.close();
} catch (Exception e) {
}
}
答案 4 :(得分:0)
我可能在这里遗漏了一些东西,但是如果内部的代码块都是一样的,那你为什么要使用一个switch case呢?