ResultSet 问题中的 JComboBox 项

JComboBox items from ResultSet Issues

我被困在这里,只看到一个我试图避免使用的解决方案,因为它会使我的代码看起来很乱。我有一个 JComboBox.addPopupMenuListener 合二为一 class。我有另一个 class 实现了 addPopupMenuListener。在另一个 class 中,我从数据库中提取项目并将它们存储在列表中。

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

问题 - 虽然我已经声明了 JComboBox 组合框;因为 public 我无法在实施 class 中使用此组合框。我该怎么办?下面是代码-

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);
    }
}

实施Class-

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();
        }
    }

}

您不能在 class loginNames 中使用 combobox,因为 comboboxLoginPanel class 的成员。我不确定你是否了解了 classes 和 object 的细节,所以我会给你两个可能的修复方法,然后解释它们。

这里有两个修复:

1) 更改声明

public JComboBox<String> combobox

public static JComboBox<String> combobox

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

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

private LoginPanel login;

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

然后,您可以通过键入 this.login.combobox.

访问 loginNames class 中的组合框

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

你不能从listNames访问combobox的原因是listNames不知道你在说什么LoginPanel对象。它知道有一个 LoginPanel class,但在任何给定时间都可以存在 2 个或更多 LoginPanel 个对象,并且这些 LoginPanel 个对象都将具有不同的 combobox es.


在提供的第一个修复中,我们将 static 关键字添加到 comboboxstatic 所做的是它告诉计算机,我们不会为每个 LoginPanel 对象使用不同的 combobox,我们只需要一个全局 combobox,所有 LoginPanel 对象将共享。更具体地说,comboboxLoginPanel class 关联,不再与 LoginPanel 对象关联。如果这样做,则只能有一个 combobox,因此您可以使用代码 LoginPanel.combobox.

listNames class 中引用它

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


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

我查看了您的代码,由于您没有完全遵循 Java 命名约定,我认为您可能对 Java 和面向对象编程有点陌生。由于您可能不想花很多时间学习 ComboBoxModel 的工作原理并更改所有代码以遵循模型-视图-控制器模式,因此我提供了一种我希望是更容易解释的快速替代方案从概念上讲,将为您提供所需的功能。