每次按下按钮都不会再次重新创建JFrame

时间:2016-04-14 19:26:45

标签: java swing jframe

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

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

P.S。我的代码,如果有人感兴趣。这很简单。在这里,你可以看到我的按钮监听器,然后我按它创建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);
            }


        }
    });

1 个答案:

答案 0 :(得分:1)

观察:

  • 您的主要问题是错误的 - 您的问题不在于您每次运行此侦听器时都在创建新的JFrame,因为您绝对每次创建新的JFrame听众被称为。
  • 相反,您需要创建一个新的JSplitPane,用组件推送它,然后将其添加到现有的JFrame中,然后显示相同的旧JFrame,但显示新组件。
  • 所以你需要做的就是不要这样做。
  • 我建议你从这个类中提取第二个窗口的代码并为它创建一个新类,如果只是为了重新分解你的代码并使其更多更容易调试和增强。
  • 在这个新课程中,构建GUI的组件,将它们添加到主JPanel中,并且只执行一次。

您在评论中说明:

  

但我处理该按钮点击的varibale将不会传递给JFrame

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

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

  • 为此类提供接受数据而非GUI组件的方法。
  • 并使这些方法变得智能,以便他们知道如何添加数据,以便与任何您想要保留的现有dtat一起显示。这是关键的关键部分,细节很重要,但只有你知道你想要显示什么的人才能知道你想要如何做到这一点的详细信息。您当前的代码太长,让我感到困惑,至少能够提供比此更具体的建议。
  • 然后在上面的b2按钮的监听器代码中,提取所需的数据,将其传递到上面的类的字段,然后显示数据显示窗口。

其他问题

  • 首先,我并没有试图唠叨,但你真的必须重新考虑这段代码,因为它是一个不敬虔的混乱,你必须很难调试和增强,因为它肯定很难我们这样做。
  • 这包括创建一堆新类来封装大部分数据和行为。
  • 允许您将所有数据库功能 out 分开的代码。
  • 接下来,您应该注意从Swing事件线程调用数据库和所有其他长时间运行的代码。
  • 请注意,子窗口,换句话说,不是主GUI窗口但显示辅助信息的窗口,不应该由JFrame组成,而是JDialogs,模式对话框,如果要在主窗口中暂停程序流时显示子窗口,如果不是,则为非模态。