2016-04-14 8 views
1

drücke Ich habe Knopf mit seinem Listener erstellt und dann drücke ich Knopf, öffnet meinen spezifizierten JFrame. Das Problem ist, dass ich dann diesen JFrame schließe und zum zweiten Mal auf die Schaltfläche klicke, um JFrame erneut zu öffnen. Es erstellt meinen JFrame erneut. Kann jemand erklären, wie man diese Art von Situation vermeidet?Lassen Sie JFrame nicht jedes Mal neu erstellen, wenn ich den Knopf

(Was ich will, ist, dass jedes Mal, wenn ich meine JFrame auf dem Knopf wieder öffnen klicken, um es von dort nur kontinuierliche ich meine JFrame links, nicht nur immer und immer wieder neu zu erstellen)

P. S. Mein Code, wenn jemand interessiert ist. Es ist sehr einfach. Hier, wie Sie sehen können, ist meine Taste Listener und dann drücke ich es JFrame zu erstellen, wie ich schon sagte. Ich habe diesen Code nur für jemanden hinzugefügt, der sich für Java interessiert und mehr Erklärungen benötigt. Aber mein Hauptproblem ist oben :)

  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); 
      } 


     } 
    }); 
+0

Das liegt daran, dass Sie den Rahmen beim Klicken auf die Schaltfläche erstellen. Erstelle es einfach im Voraus und setze die Sichtbarkeit auf "True"/"False", wenn du auf " – Bene

+0

" klickst. Aber meine Varibale, mit der ich klarkomme, wird nicht an JFrame übergeben :( –

Antwort

1

Beobachtungen angegeben:

  • Ihre wichtigste Frage ist falsch - Ihr Problem ist nicht, dass Sie eine neue JFrame mit jedem sind die Schaffung laufen durch diese Hörer, weil Sie sind auf jeden Fall NICHT Erstellen eines neuen JFrame jedes Mal, wenn dieser Listener aufgerufen wird.
  • Stattdessen erstellen Sie ein neues JSplitPane, verschieben es mit Komponenten und fügen dieses einem bereits vorhandenen JFrame hinzu und zeigen dann dasselbe alte JFrame an, aber eines, das neue Komponenten anzeigt.
  • Also, was Sie tun müssen, ist dies nicht zu tun.
  • Ich schlage vor, dass Sie den Code dieses zweiten Fensters aus dieser Klasse extrahieren und eine neue Klasse für sie erstellen, wenn Sie nur Ihren Code re-Faktor viel einfacher Debuggen und zu verbessern.
  • In dieser neuen Klasse, bauen Sie die GUI-Komponenten, fügen Sie sie zu den wichtigsten JPanel, und tun dies nur einmal und einmal.

Sie Zustand in Kommentar:

Aber mein Varibale ich auf diese Schaltfläche klicken befasse wird JFrame nicht

weitergegeben werden, aber dies ist nicht sinnvoll. Bitte erkläre.


In Bezug auf alle Daten, die zu diesem Fenster gesendet werden muss (oder ein anderes Fenster)

  • diese Klasse Methoden geben, die Daten nicht GUI-Komponenten übernehmen.
  • Und machen Sie diese Methoden intelligent, so dass sie wissen, wie die Daten hinzugefügt werden, so dass sie mit einem vorhandenen dtat angezeigt werden, das Sie beibehalten möchten. Dies ist der kritische Schlüsselbereich, in dem die Details wichtig sind, aber welche Details Sie dazu benötigen, kann Ihnen nur bekannt sein, da Sie derjenige sind, der genau weiß, was Sie anzeigen möchten. Ihr aktueller Code ist zu lang und verwirrend, als dass ich zumindest genauere Empfehlungen geben könnte.
  • Dann extrahieren Sie im Listener-Code Ihrer b2-Schaltfläche die benötigten Daten, übergeben sie an das Feld der obigen Klasse und zeigen dann Ihr Datenanzeigefenster an.

Weitere Themen

  • In erster Linie, und ich bin nicht zu nörgeln versuchen, aber Sie müssen wirklich diesen Code erneut Faktor, da es ein gottlos Chaos ist, eine, die schwierig sein muss, für Sie zu debuggen und zu verbessern, weil es sicher schwierig für uns ist, dies zu tun.
  • Dies umfasst das Erstellen einer Reihe neuer Klassen, um einen Großteil dieser Daten und dieses Verhaltens zu kapseln.
  • Und Code, mit dem Sie alle Datenbank-Funktionalität aus des GUI-Code trennen können.
  • Als nächstes sollten Sie darauf achten, Datenbank und alle anderen lang laufenden Code aus dem Swing-Event-Thread abzurufen.
  • Beachten Sie, dass Unterfenster, dh Fenster, die nicht das Haupt-GUI-Fenster sind, aber Seiteninformationen anzeigen, nicht aus JFrames bestehen sollten, sondern aus JDialogs, modalen Dialogen, wenn Sie den Programmablauf im Hauptfenster anhalten möchten Das Unterfenster wird angezeigt oder nicht modal, wenn dies nicht der Fall ist.
Verwandte Themen