所有jComboBox都相互镜像

时间:2019-02-28 04:37:42

标签: java

我正在使用Net-beans,因此,我在一个面板中的一帧中有40个组合框。 因此,为了方便起见,我调整了其中8个的大小,然后将面板上的所有8个组合框复制并粘贴了5次。但是,在运行时,每当我选择1个组合框说要索引2时,它们中的所有其他40个对象也会自动选择要索引2。

因此,我进行了一些测试,发现当我删除以下这段代码时,所有JComboBoxes都可以正常工作。这是代码...

public void MoveToComboBox()
{
try
{
Class.forName("java.sql.Driver");
Connection conn= (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/teacher?zeroDateTimeBehavior=convertToNull","root","1234");//standard
PreparedStatement pst=conn.prepareStatement("Select * from sections");
DefaultComboBoxModel dcm=new DefaultComboBoxModel(); 
ResultSet rs=pst.executeQuery();      
while(rs.next())
{
    String a=rs.getString("section");  
    dcm.addElement(a);  
}      

d11.setModel(dcm);
d12.setModel(dcm);
d13.setModel(dcm);
d14.setModel(dcm);
d15.setModel(dcm);
d16.setModel(dcm);
d17.setModel(dcm);
d18.setModel(dcm); //these are just 8 of them rest 40 are all like this just like this
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"Please Prepare the data for first use first.");
}
}

我创建了一种方法,该方法可以从称为表节的SQL表中获取数据,并将其设置在所有组合框上 然后在激活的窗口中运行此方法...

private void f3WindowActivated(java.awt.event.WindowEvent evt) {                                   
f3.setLocationRelativeTo(null);     
MoveToComboBox(); // <-- This is the code if I comment this everything works fine
t1.requestFocus();
}                                  

是的,出现了镜像组合框的问题;

1 个答案:

答案 0 :(得分:1)

数据模型将具有一个或多个视图作为侦听器和模型更改器。模型是否更改,所有视图都会更改(在接收到更改事件时)。在这种情况下,模型:

  • 包含所有元素
  • 维护选定的元素(这会导致上述问题)

在您的情况下,创建N个DefaultComboBoxModels并仅共享数据:

Vector<String> sections = new Vector<>();
try (Connection conn = DriverManager.getConnection(...);
        PreparedStatement pst = conn.prepareStatement("SELECT section FROM sections");
        ResultSet rs = pst.executeQuery()) {
    while(rs.next()) {
        String s = rs.getString(1);  
        sections.add(s);  
    }
} 
d11.setModel(new DefaultComboBoxModel(sections));
d12.setModel(new DefaultComboBoxModel(sections));
d13.setModel(new DefaultComboBoxModel(sections));
...

以上,我使用了一个丑陋的 try-with-resources 构造,以确保在最后调用以下内容:

  • rs.close();
  • pst.close();
  • conn.close();

(这是因为所有对象都可以自动关闭。)

您也可以在末尾显式调用它们。

Class.forName仅用于加载MySQL产品,因为在编译过程中不需要(或需要事件)导入MySQL特定的驱动程序。但是,如今并不需要,因为可以动态找到JDBC数据库驱动程序。 而且您的Class.forName没有加载MySQL类。

请注意,Vector类较旧,但适合使用DefaultComboBoxModel(Vector)