我被困在这里,只看到一个我试图克制的解决方案,因为它会让我的代码看起来很乱。我在一个类中有一个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();
}
}
}
答案 0 :(得分:2)
您无法在课程combobox
中使用loginNames
,因为combobox
是LoginPanel
课程的成员。我不确定你是否已经学习了类和对象的细节,所以我会给你两个可能的修复,然后解释它们。
以下是两个修复:
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
关键字添加到combobox
。 static
所做的是它告诉计算机,而不是每个combobox
对象都有不同的LoginPanel
,我们将只有一个全局combobox
全部{ {1}}对象将共享。更具体地说,LoginPanel
与combobox
类关联,并且不再与LoginPanel
对象关联。如果您这样做,则只能有一个LoginPanel
,因此您可以使用代码combobox
在listNames
类中引用该内容。
对于第二个修补程序,请回想一下,我们不能仅从LoginPanel.combobox
类访问combobox
,因为每个listNames
对象都有一个不同的combobox
(并且超过LoginPanel
可能存在1 LoginPanel
个对象)。在第二个修复中,我们通过将构造函数中的引用传递给我们正在讨论的特定LoginPanel
对象来直接解决此问题。通过传递此引用,我们指定login
是我们要修改的LoginPanel
对象,并且它具有我们要添加列表元素的唯一combobox
。因此,您可以输入login.combobox
来访问combobox
。
这两种修复都不是理想的选择。正如其他人所提到的,Java Swing遵循模型 - 视图 - 控制器模式,因此,期望使用Java Swing的应用程序也将使用此模式。 ComboBoxModel
类允许您实现此模式。添加static
关键字不会为您提供模型 - 视图 - 控制器模式。
我查看了你的代码,由于你没有完全遵循Java命名约定,我认为你可能对Java有点新,可能还有面向对象的编程。既然你可能不想花费大量时间来学习ComboBoxModel
如何工作并改变你的所有代码以遵循模型 - 视图 - 控制器模式,我提供了我希望的一个更容易解释的快速替代方案从概念上讲,它将为您提供所需的功能。