ResultSet问题中的JComboBox项

时间:2015-05-20 18:21:10

标签: java swing jcombobox resultset implements

我被困在这里,只看到一个我试图克制的解决方案,因为它会让我的代码看起来很乱。我在一个类中有一个JComboBox.addPopupMenuListener。我有另一个实现addPopupMenuListener的类。在另一个类中,我从DB中提取项目并将它们存储在List中。

我现在完全不知道如何将此List中的项添加到JComboBox。有什么想法吗?

问题 - 虽然我已经声明了JComboBox组合框;作为公众,我无法在实施课程中使用这个组合框。我该怎么办?以下是代码 -

package tg.com.bugtracker.loginpage;

import java.awt.*;
import javax.swing.*;

public class LoginPanel extends JPanel {

    public JComboBox<String> combobox;

    public LoginPanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.insets = new Insets(10,10,10,10);
        constraints.anchor = GridBagConstraints.LINE_START;
        combobox = new JComboBox<>();
        combobox.setPreferredSize(new Dimension(250, 20));
        combobox.addPopupMenuListener(new loginNames());
        add(combobox, constraints);
    }
}

实施班级 -

package tg.com.bugtracker.loginpage;

import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

import java.sql.*;
import java.util.List;

public class loginNames implements PopupMenuListener{

    @Override
    public void popupMenuCanceled(PopupMenuEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
        // TODO Auto-generated method stub

    }

    public List<String> loginNames;

    @Override
    public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
        String URL = "jdbc:ucanaccess://C:\\Users\\bharat.nanwani\\Desktop\\BugTrackerDB.accdb";
        ResultSet rs;
        PreparedStatement p;
        String sqlquery = "SELECT FirstName FROM UserDetails;";
        try {
            Connection cnn = DriverManager.getConnection(URL);
            p = cnn.prepareStatement(sqlquery);
            rs = p.executeQuery();
            rs.close();
            p.close();
            while (rs.next()) {
                String names = rs.getString("FirstName");
                loginNames.add(names);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

1 个答案:

答案 0 :(得分:2)

您无法在课程combobox中使用loginNames,因为comboboxLoginPanel课程的成员。我不确定你是否已经学习了类和对象的细节,所以我会给你两个可能的修复,然后解释它们。

以下是两个修复:

1)更改声明

public JComboBox<String> combobox

public static JComboBox<String> combobox

然后使用LoginPanel.combobox访问loginNames类中的组合框。

2)将以下构造函数添加到loginNames

private LoginPanel login;

public loginNames( LoginPanel login ) {
    this.login = login;
}

然后,您可以通过键入loginNames来访问this.login.combobox课程中的组合框。

类和对象的基本概念是您使用类作为模板来创建对象。 LoginPanel是一个类,您可以使用代码LoginPanel创建new LoginPanel()个对象。每个对象(即LoginPanel的实例)都会有一些与之关联的变量和方法。例如,在您的无效代码中,每个LoginPanel对象都有一个名为JComboBox<String>的唯一combobox变量。

您无法从combobox访问listNames的原因是listNames不知道您正在谈论的LoginPanel对象。它知道有一个LoginPanel类,但在任何给定时间都可以存在2个或更多LoginPanel个对象,并且这些LoginPanel个对象都将具有不同的combobox个。

在提供的第一个修补程序中,我们将static关键字添加到comboboxstatic所做的是它告诉计算机,而不是每个combobox对象都有不同的LoginPanel,我们将只有一个全局combobox全部{ {1}}对象将共享。更具体地说,LoginPanelcombobox类关联,并且不再与LoginPanel对象关联。如果您这样做,则只能有一个LoginPanel,因此您可以使用代码comboboxlistNames类中引用该内容。

对于第二个修补程序,请回想一下,我们不能仅从LoginPanel.combobox类访问combobox,因为每个listNames对象都有一个不同的combobox(并且超过LoginPanel可能存在1 LoginPanel个对象)。在第二个修复中,我们通过将构造函数中的引用传递给我们正在讨论的特定LoginPanel对象来直接解决此问题。通过传递此引用,我们指定login是我们要修改的LoginPanel对象,并且它具有我们要添加列表元素的唯一combobox。因此,您可以输入login.combobox来访问combobox

这两种修复都不是理想的选择。正如其他人所提到的,Java Swing遵循模型 - 视图 - 控制器模式,因此,期望使用Java Swing的应用程序也将使用此模式。 ComboBoxModel类允许您实现此模式。添加static关键字不会为您提供模型 - 视图 - 控制器模式。

我查看了你的代码,由于你没有完全遵循Java命名约定,我认为你可能对Java有点新,可能还有面向对象的编程。既然你可能不想花费大量时间来学习ComboBoxModel如何工作并改变你的所有代码以遵循模型 - 视图 - 控制器模式,我提供了我希望的一个更容易解释的快速替代方案从概念上讲,它将为您提供所需的功能。