gpt4 book ai didi

java - 使 JFrame 不再在每次按下按钮时重新创建

转载 作者:行者123 更新时间:2023-11-30 07:27:28 25 4
gpt4 key购买 nike

我用它的监听器创建了按钮,然后按下按钮,它打开了我指定的 JFrame。问题是,然后我关闭该 JFrame 并再次单击按钮再次重新打开 JFrame,它会再次创建我的 JFrame。有人可以解释如何避免这种情况吗?

(我想要的是,每次我在按钮上重新打开 JFrame 时,单击它只是从那里连续地离开我的 JFrame,而不仅仅是一遍又一遍地重新创建它)

附注如果有人感兴趣的话我的代码。它非常简单。正如您所看到的,这是我的按钮监听器,然后我按它它会创建 JFrame,正如我之前所说的那样。我刚刚为那些对 Java 感兴趣并想要更多解释的人添加了这段代码。但我的主要问题如上所述:)

         b2.addActionListener(new ActionListener() {             
JTextField molecname = new JTextField("Molecule name", 20);
Connection conn = null;
ResultSet resultSet;
SwingJList<String> myJList2;
Statement stat;
JButton searchButton = new JButton("Search");
JScrollPane listScrollPane;
JSplitPane splitPane;
JPanel searchPane;
GridLayout searchPane2;
JList list;
JLabel molLabel;
@Override
public void actionPerformed(ActionEvent event) {
molLabel = new JLabel("Molecule name:");
molecname.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
molecname.setText("");
}
});
try {
conn = DriverManager.getConnection(db.getMolecule().getDBLink(), props);
if (conn != null) {
DatabaseMetaData metadata = conn.getMetaData();
List<String[]> sqltable = new ArrayList<>();
try {
String[] types = {"TABLE"};
resultSet = metadata.getTables(null, null, "%", types);
while (resultSet.next()) {
//tableName = resultSet.getString(3);
tableName = (tableName == null) ? resultSet.getString(3) : tableName + "." + resultSet.getString(3);
//sqltable.add(new String[]{tableName});
}
} catch (SQLException ex) {
Logger.getLogger(JFDatabase.class.getName()).log(Level.SEVERE, null, ex);
}
for (String[] tablename : sqltable) {
System.out.println(Arrays.toString(tablename));
System.out.println(Arrays.asList(tablename));
}
String[] LIST_DATA4 = tableName.split(Pattern.quote("."));

myJList2 = new SwingJList<>(Arrays.asList(LIST_DATA4));
myJList2.addListSelectionListener((ListSelectionEvent e2) -> {

if (!e2.getValueIsAdjusting()) {
String selectedName = myJList2.getSelectedValue();
molecname.setText(selectedName);
}
});

stat = conn.createStatement();
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
molecname.getText();
String molname1 = molecname.getText();
props.put("molname", molname1);
try {
String[] types = {"TABLE"};
ResultSet resultSet = metadata.getTables(null, null, molname1, types);
if (resultSet.next()) {
System.out.println("Egzistuoja");
ResultSet resset = stat.executeQuery("SELECT * FROM " + molname1 + "");
ResultSetMetaData metadata = resset.getMetaData();
int columnCount = metadata.getColumnCount();
System.out.println("Table columns : ");
for (int i = 1; i <= columnCount; i++) {
String columnName = metadata.getColumnName(i);
System.out.println(columnName);
}
}

} catch (SQLException ex) {
Logger.getLogger(JFDatabase.class.getName()).log(Level.SEVERE, null, ex);
}
frame2.dispose();
}

});

list = new JList(sqltable.toArray());
list.setCellRenderer(f);

listScrollPane = new JScrollPane(myJList2);
listScrollPane.setPreferredSize(new Dimension(250, 200));
listScrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "List", TitledBorder.CENTER, TitledBorder.TOP));
searchPane = new JPanel();
searchPane2 = new GridLayout(15, 3);
searchPane.setLayout(searchPane2);
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listScrollPane, searchPane);

searchPane.add(molLabel);
searchPane.add(molecname);
searchPane.add(searchButton);

frame2.add(splitPane);
frame2.pack();
frame2.setLocationRelativeTo(null);
frame2.setVisible(true);

JOptionPane.showMessageDialog(null,
"Database connected",
"Warning", JOptionPane.INFORMATION_MESSAGE);
System.out.println("You made it, take control your database now!");
} else {
JOptionPane.showMessageDialog(null,
"Database connection not avaible",
"Warning", JOptionPane.WARNING_MESSAGE);
System.out.println("Failed to make connection!");
}
} catch (SQLException e3) {
JOptionPane.showMessageDialog(null,
"Database connection not avaible",
"Warning", JOptionPane.WARNING_MESSAGE);
System.err.print(e3);
}


}
});

最佳答案

观察结果:

  • 您的主要问题是错误的 - 您的问题不在于您每次运行此监听器时都创建一个新的 JFrame,因为您绝对每次此监听器运行时都创建一个新的 JFrame打电话。
  • 相反,您要创建一个新的 JSplitPane,将其与组件一起插入,然后将其添加到现有的 JFrame,然后显示这个相同的旧 JFrame,但它正在显示新组件。
  • 所以您需要做的就是不要这样做。
  • 我建议您从此类中提取第二个窗口的代码,并为其创建一个新类,哪怕只是为了重构您的代码并使其更易于调试和增强。
  • 在这个新类中,构建 GUI 的组件,将它们添加到主 JPanel,并且只执行一次。
<小时/>

您在评论中指出:

But my varibale i am dealing on that button click will be not passed to JFrame

但这没有意义。请解释一下。

<小时/>

关于需要发送到此窗口(或任何其他窗口)的任何数据

  • 为此类提供接受数据的方法,而不是 GUI 组件。
  • 并使这些方法变得智能,以便它们知道如何添加数据,以便与您想要保留的任何现有 dtat 一起显示。这是关键的关键部分,其中的细节很重要,但有关如何执行此操作的详细信息只能由您自己知道,因为您是确切知道要显示什么内容的人。您当前的代码对我来说太长且令人困惑,至少无法提供比这更具体的建议。
  • 然后在上面的 b2 按钮的监听器代码中提取所需的数据,将其传递到上面类的字段,然后显示数据显示窗口。
<小时/>

其他问题

  • 首先,我并不是想唠叨,但你确实必须重新考虑这段代码,因为它是一团乱七八糟的东西,对你来说一定很难调试和增强,因为这对我们来说确实很困难这样做。
  • 这包括创建一堆新类来封装大部分数据和行为。
  • 以及允许您将所有数据库功能从 GUI 代码中分离出来的代码。
  • 接下来,您应该注意从 Swing 事件线程调用数据库和所有其他长时间运行的代码。
  • 请注意,子窗口(即不是主 GUI 窗口但显示辅助信息的窗口)不应由 JFrame 组成,而应由 JDialog 组成,如果您想在以下情况下停止主窗口中的程序流,则不应由 JDialog 组成:显示子窗口,如果不正确,则显示非模式窗口。

关于java - 使 JFrame 不再在每次按下按钮时重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com