Announcement

Collapse
No announcement yet.

Werte aus SQL Datenbank in Swingobjekt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Werte aus SQL Datenbank in Swingobjekt

    Hallo,

    ich möchte aus einer SQL Abfrage die Daten in einem Swing Objekt anzeigen lassen und habe dazu bis jetzt folgenden Code:

    Code:
    package components;
    
    /*
     * SimpleTableDemo.java requires no other files.
     */
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    
    
    public class QueryDBtest extends JPanel {
        
    
    	private boolean DEBUG = false;
    
        JTextField testfield; // Textfeld
        
        /**
     	* Runs a test by creating a table, adding a value, showing the table contents, and
     	* removing the table. 
     	**/
        public static void runTest() throws SQLException, IOException
    	{
        	Connection conn = getConnection();
    		
        	
    		try
    		{
    			Statement stat = conn.createStatement();
    		
    			ResultSet result = stat.executeQuery("SHOW TABLES");
    			int count = 0;
    			while (result.next())
    				count++;	
    			System.out.println("Es gibt " + count + " Tabellen.");
    			result.close();
    			
    			String query = "SELECT * FROM gratulation";
    			ResultSet res = stat.executeQuery(query);
    			 
    			while(res.next()) {
    				System.out.println(res.getString(1));
    				
    			}
    			res.close();
    		}
    		
    		finally
    		{
    			conn.close();
    		}	
    	}
        
        public QueryDBtest() {
            super(new GridLayout(1,0));
    
            String[] columnNames = {"First Name",
                                    "Last Name",
                                    "Sport",
                                    "# of Years",
                                    "Vegetarian"};
    
            Object[][] data = {
    	    {"Kathy", "Smith",
    	     "Snowboarding", new Integer(5), new Boolean(false)},
    	    {"John", "Doe",
    	     "Rowing", new Integer(3), new Boolean(true)},
    	    {"Sue", "Black",
    	     "Knitting", new Integer(2), new Boolean(false)},
    	    {"Jane", "White",
    	     "Speed reading", new Integer(20), new Boolean(true)},
    	    {"Joe", "Brown",
    	     "Pool", new Integer(10), new Boolean(false)}
            };
            
            
            testfield = new JTextField();
    		testfield.setVisible(true);
    		testfield.setText("Hallo");
    		testfield.setSize(50, 500);
    		testfield.setBackground(Color.cyan);
    		
    		
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 150));
            table.setFillsViewportHeight(true);
            
    
            if (DEBUG) {
                table.addMouseListener(new MouseAdapter() {
                    public void mouseClicked(MouseEvent e) {
                        printDebugData(table);
                    }
                });
            }
    
            table.add(testfield);
            
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
    
            //Add the scroll pane to this panel.
            add(scrollPane);
            
        }
    
        private void printDebugData(JTable table) {
            int numRows = table.getRowCount();
            int numCols = table.getColumnCount();
            javax.swing.table.TableModel model = table.getModel();
    
            System.out.println("Value of data: ");
            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + model.getValueAt(i, j));
                }
                System.out.println();
                
            }
            System.out.println("--------------------------");
        }
    
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("SimpleTableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Create and set up the content pane.
            QueryDBtest newContentPane = new QueryDBtest();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
    
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
            
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
                
            });
            
            try
    		{
    			runTest();
    		}
    		catch (SQLException ex)
    		{
    			for (Throwable t: ex)
    				t.printStackTrace();
    		}
    		catch (IOException ex)
    		{
    			ex.printStackTrace();
    		}
            
        }
        
        
        
    
    	/**
    	 * Gets a connection from the properties specified in the file database properties
    	 * @return the database connection
    	 **/
    
    	public static Connection getConnection() throws SQLException, IOException
    	{
    	
    		String drivers = "com.mysql.jdbc.Driver";
    		if(drivers != null) System.setProperty("jdbc.drivers", drivers);
    		String url = "jdbc:mysql://localhost:3306/corejava";
    		String username = "Benutzer";
    		String password = "Passwort";
    	
    		return DriverManager.getConnection(url, username, password);
    	
    	}
        
    }
    Gerade die Übergabe der Daten aus einer Abfrage der SQL Datenbank in ein Swing Objekt macht mir Probleme....!

  • #2
    Was kann man sich unter der Frage vorstellen?
    Was für ein Objekt?
    Was ist der Fehler? Laufzeitfehler?
    Christian

    Comment


    • #3
      Es besteht an sich gar kein Fehler, nur weiß ich nicht, wie ich aus der SQL Abfrage die DAten in ein Swing Objekt hole und anzeigen lassen kann.
      Ich dachte hier vor allem bei diesem TEil des Codes:
      Code:
      String query = "SELECT * FROM gratulation";
      			ResultSet res = stat.executeQuery(query);
      			 
      			while(res.next()) {
      				System.out.println(res.getString(1));
      				
      			}
      			res.close();
      Hier anstatt die Inhalte auf der Konsole auszugeben dann in ein neues Swing OBjekt in demn dem Frame unten auszugeben - zb in nem Textfeld oder Textarea oder wie auch immer....!

      Comment


      • #4
        Nun, in dem man die Daten da reinschreibt

        Textfeld -> setText(..)
        TextArea -> setText(..)
        JTable -> DefaultTableModel -> setValue

        Da du ja nicht OOP nutzt, sondern alles statische Methoden sind und du ebenfalls deinen Code nicht in Klassen gliederst, musst du hier in deinem Fall alle Elemente in die du was reinschreiben willst, als Klassenvariablen definieren "private static DefaultTableModel ......, private static JTextfield ......". Dann kannst du von jeder statischen Methode darauf zugreifen

        Allerdings würde ich empfehlen, bevor du etwas mit Swing oder Datenbanken machst, mal die OOP zu erlernen

        JTextField testfield; -> hier felht der Modifizierer
        private boolean DEBUG = false; -> Wozu könnte das dienen? Worin könnte der Sinn sein, einen Listener nur im "DEBUG" anzubinden?
        Wie schon erwähnt ist das wegdrücken der Exceptions und keine Fehlerbehandlung wenig sinnvoll
        u.v.m

        Empfehle mal

        http://netbeans.org/

        http://netbeans.org/features/java/swing.html

        Dort wird dir wenigsten die Oberfläche im OOP Stil erstellt
        Christian

        Comment


        • #5
          Ok dank dir werd ich ansehen!

          Comment


          • #6
            Also ich benutz gar kein Netbeans sondern Eclipse...!

            Ich will erstmal alles ausprobieren wie es funktioniert bevor ich Klassen für alles mögliche schreiben - daher benutz ich die vorhandenen Klassen.

            Ich such da jetzt erstmal eine Lösung, wie ich die Daten in ein Swing-Objekt geben und anzeigen lassen kann........!

            Comment


            • #7
              Also ich benutz gar kein Netbeans sondern Eclipse...!
              Ja, Netbeans wäre einfacher
              Ich will erstmal alles ausprobieren wie es funktioniert bevor ich Klassen für alles mögliche schreiben - daher benutz ich die vorhandenen Klassen.
              Es ist nicht zielführend "in der Mitte" anzufangen, ohne die Grundlagen. Auch nur zum Test ist das dann schlechtes Design der Anwendung. Auch machst du es dir unnötig schwer.
              Ich such da jetzt erstmal eine Lösung, wie ich die Daten in ein Swing-Objekt geben und anzeigen lassen kann........!
              Habe ich geschrieben: statische Objekte benutzen
              Wenn du

              private static JTextField testfield;

              schreibst, steht das Textfeld in deinen statischen Methoden zur Verfügung und du kannst

              while(res.next()) {
              testfield.setText(res.getString(1));
              }

              schreiben.
              Christian

              Comment


              • #8
                Danke, werd ich ausprobieren! :-)

                Comment


                • #9
                  Mal ein Beispiel, welches auf Druck auf den Button das Textfeld mit einem String aus der DB füllt -> Es dürfte ersichtlich sein, wo du das auf deine DB anpassen musst

                  GUI-Klasse
                  Code:
                  public class DBDemo extends javax.swing.JFrame
                  {
                  private javax.swing.JButton jButton1;
                  private javax.swing.JTextField jTextField1;
                  
                  public DBDemo()
                  {
                  initComponents();
                  DBManager.getInstance().createConnection();
                  }
                  
                  @SuppressWarnings("unchecked")
                  private void initComponents() {
                  
                  jButton1 = new javax.swing.JButton();
                  jTextField1 = new javax.swing.JTextField();
                  
                  setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);
                  getContentPane().setLayout(null);
                  
                  jButton1.setText("jButton1");
                  jButton1.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton1ActionPerformed(evt);
                  }
                  });
                  getContentPane().add(jButton1);
                  jButton1.setBounds(10, 10, 79, 25);
                  
                  jTextField1.setText("jTextField1");
                  getContentPane().add(jTextField1);
                  jTextField1.setBounds(100, 10, 280, 22);
                  
                  java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize ();
                  setBounds((screenSize.width-418)/2, (screenSize.height-141)/2, 418, 141);
                  }
                  
                  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
                  {
                  String ergebnis=DBManager.getInstance().fillTextfeld();
                  if(ergebnis!=null)
                  {
                  jTextField1.setText(ergebnis);
                  }
                  else
                  {
                  jTextField1.setText("Kein Ergebnis");
                  }
                  }
                  
                  @Override
                  public void dispose()
                  {
                  DBManager.getInstance().closeConnection();
                  super.dispose();
                  }
                  
                  public static void main(String args[])
                  {
                  java.awt.EventQueue.invokeLater(new Runnable()
                  {
                  @Override
                  public void run()
                  {
                  new DBDemo().setVisible(true);
                  }
                  
                  });
                  }
                  
                  }
                  DB-Zugriffe
                  Code:
                  public class DBManager
                  {
                  private static DBManager instance;
                  private Connection connection=null;
                  
                  private DBManager()
                  {
                  }
                  
                  public synchronized static DBManager getInstance()
                  {
                  if(instance==null)
                  {
                  instance=new DBManager();
                  }
                  return instance;
                  }
                  
                  public void createConnection()
                  {
                  try
                  {
                  Class.forName("com.mysql.jdbc.Driver");
                  connection=DriverManager.getConnection("jdbc:mysql ://localhost:3306/myDatabaseName","user","passwort");
                  }
                  catch(SQLException ex)
                  {
                  System.out.println("SQL-Exception beim anlegen der Connection:"+ex.getMessage());
                  }
                  catch(ClassNotFoundException ex)
                  {
                  System.out.println("ClassNotFoundException beim anlegen der Connection:"+ex.getMessage());
                  }
                  }
                  
                  public void closeConnection()
                  {
                  if(connection!=null)
                  {
                  try
                  {
                  connection.close();
                  }
                  catch(SQLException ex)
                  {
                  System.out.println("SQL-Exception beim schliessen der Connection: "+ex.getMessage());
                  }
                  }
                  }
                  
                  public String fillTextfeld()
                  {
                  String result=null;
                  if(connection==null)
                  {
                  System.out.println("Abfrage nicht möglich, Connection ist null");
                  return result;
                  }
                  try
                  {
                  Statement statement=connection.createStatement();
                  ResultSet resultSet=statement.executeQuery("select from irgendwas was ein eindeutiges Ergebnis (1 Zeile) ergibt, da ja nur 1 String zurückgegeben werden soll");
                  if(resultSet.next())
                  {
                  result=resultSet.getString(1);
                  }
                  resultSet.close();
                  statement.close();
                  }
                  catch(SQLException ex)
                  {
                  System.out.println("SQL-Exception bei der Abfrage: "+ex.getMessage());
                  }
                  return result;
                  }
                  
                  }
                  Zuletzt editiert von Christian Marquardt; 21.01.2021, 17:45.
                  Christian

                  Comment


                  • #10
                    Das ist sehr gut besten Dank!

                    Ich bekomms allerdings nicht zum Laufen........... ich hab noch import java.sql.*; oben eingefügt, den connector in das projekt eingefügt und die DAten zur Datenbank geändert sowie die SELECT Abfrage formuliert...

                    In der Console bekomm ich nen langen Text in der Art ausgeliefert:
                    <ConnectionProperties>
                    <PropertyCategory name="Connection/Authentication">
                    <Property name="user" required="No" default="" sortOrder="-2147483647" since="all versions">
                    The user to connect as
                    </Property>
                    <Property name="password" required="No" default="" sortOrder="-2147483646" since="all versions">
                    The password to use when connecting
                    </Property>
                    <Property name="socketFactory" required="No" default="com.mysql.jdbc.StandardSocketFactory" sortOrder="4" since="3.0.3">
                    The name of the class that the driver should use for creating socket connections to the server. This class must implement the interface 'com.mysql.jdbc.SocketFactory' and have public no-args constructor.
                    </Property>
                    <Property name="connectTimeout" required="No" default="0" sortOrder="9" since="3.0.1">
                    Timeout for socket connect (in milliseconds), with 0 being no timeout. Only works on JDK-1.4 or newer. Defaults to '0'.
                    </Property>
                    Fehlermeldungen direkt kommen oder erscheinen keine...!

                    Comment


                    • #11
                      den connector in das projekt eingefügt
                      Wie hast du das gemacht?
                      Wo liegt die DB?
                      Zeige mal den ConnectionString

                      Wo steigt das Programm aus, wenn du debuggst?
                      Zuletzt editiert von Christian Marquardt; 02.06.2012, 19:30.
                      Christian

                      Comment


                      • #12
                        Den Connector hab ich mit Rechtsklick auf das Projekt -> Configure Build Path -> Java Build Path und Tabreiter Libraries, dort das Menü "Add External JARs genommen und die SQL COnnector Datei ausgewählt.
                        Dadurch sind einige Fehlermeldungen auch weggegangen...!

                        Die Datenbank liegt - naja keine Ahnung, die zeigt es bei der Anmeldung mit dem angegebenen Benutzernamen bei SQL an. Wo die Datei physisch zu finden ist kann ich so nicht sagen...!

                        ConnectionString?
                        Mit dem Debugger hab ich noch keine Erfahrung...!
                        Aber genau diese Dinge interessieren mich, wie ich vorgehe um auf das Problem zu kommen - damit kann ich dann selbst immer vorgehen....!

                        Danke

                        Comment


                        • #13
                          Den Connector hab ich mit Rechtsklick auf das Projekt -> Configure Build Path -> Java Build Path und Tabreiter Libraries, dort das Menü "Add External JARs genommen und die SQL COnnector Datei ausgewählt.
                          Dadurch sind einige Fehlermeldungen auch weggegangen...!
                          Solange es sich um JDBC Driver for MySQL handelt


                          Die Datenbank liegt - naja keine Ahnung, die zeigt es bei der Anmeldung mit dem angegebenen Benutzernamen bei SQL an. Wo die Datei physisch zu finden ist kann ich so nicht sagen...!
                          Was könnte "bei SQL" sein? Liegt die Datei auf deinem Rechner? Im Internet? Keiner sitzt an deinem Computer, somit weiss keiner was du meinst

                          ConnectionString?
                          ist das:
                          connection=DriverManager.getConnection("jdbc:mysql ://localhost:3306/myDatabaseName","user","passwort");


                          debuggen
                          Zuletzt editiert von Christian Marquardt; 03.06.2012, 08:10.
                          Christian

                          Comment


                          • #14
                            Super jetzt klappt es!
                            Hab das geändert und in zwei Dateien untergebracht...! ;-)

                            Super, daran seh ich jetzt die Aufbau und die ABfolge des Programms, wie das ineinander funktioniert....!

                            Langer Weg bis ich komplette Tabellen einer Datenbank in einem Swing Objekt laden und bearbeiten kann.... ;-)!
                            Aber so langsam taste ich mich da vor....!


                            Die Hilfe ist übrigens super - besten Dank das freut mich sehr dass es Leute gibt die noch was erklären! ;-)

                            Comment


                            • #15
                              Hab das geändert und in zwei Dateien untergebracht...! ;-)
                              So war es gedacht.....
                              Christian

                              Comment

                              Working...
                              X