【问题标题】:JComboBox items from ResultSet IssuesResultSet 问题中的 JComboBox 项
【发布时间】:2015-08-02 03:54:33
【问题描述】:

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

我现在完全不知道如何将此列表中的项目添加到 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();
        }
    }

}

【问题讨论】:

  • 了解ComboBoxModel,这是向 JComboBox 提供数据的地方。
  • 对不起。我只是想知道为什么我不能在我的实现类中使用组合框(我已声明为公共)?
  • loginNames 需要对 JComboBox(或其模型)的引用才能将项目添加到 JComboBox
  • @Bharat Nanwani Swing 遵循 MVC 模式。在这种情况下:Model=ComboBoxModel、View=JComboBox、Controller=AnyKindOfListeners。

标签: java swing jcombobox resultset implements


【解决方案1】:

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

这里有两个修复:

1) 更改声明

public JComboBox&lt;String&gt; combobox

public static JComboBox&lt;String&gt; combobox

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

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

private LoginPanel login;

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

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


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

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


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

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


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

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

【讨论】:

  • 1+ 很好的解释:)
  • 天啊!这个解释让我脑海中的整个概念变得清晰。非常感谢!
  • 没问题。我很高兴它有所帮助。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2012-06-26
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多