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
,因为 combobox
是 LoginPanel
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
关键字添加到 combobox
。 static
所做的是它告诉计算机,我们不会为每个 LoginPanel
对象使用不同的 combobox
,我们只需要一个全局 combobox
,所有 LoginPanel
对象将共享。更具体地说,combobox
与 LoginPanel
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
的工作原理并更改所有代码以遵循模型-视图-控制器模式,因此我提供了一种我希望是更容易解释的快速替代方案从概念上讲,将为您提供所需的功能。
我被困在这里,只看到一个我试图避免使用的解决方案,因为它会使我的代码看起来很乱。我有一个 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
,因为 combobox
是 LoginPanel
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
关键字添加到 combobox
。 static
所做的是它告诉计算机,我们不会为每个 LoginPanel
对象使用不同的 combobox
,我们只需要一个全局 combobox
,所有 LoginPanel
对象将共享。更具体地说,combobox
与 LoginPanel
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
的工作原理并更改所有代码以遵循模型-视图-控制器模式,因此我提供了一种我希望是更容易解释的快速替代方案从概念上讲,将为您提供所需的功能。