(Java)Jak odwoa sie z Class do odpowiedniego pola na formie

0

Mam cos takiego

/*

  • NewJFrame.java
  • Created on 13 czerwiec 2006, 16:20
    */
    package javaapplication4;

import java.awt.;
import java.applet.
;
import java.sql.*;
import java.util.Properties;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List;
import Lib.Lib;

public class NewJFrame extends javax.swing.JFrame {

public NewJFrame() {
    initComponents();
} 

private void xxx(java.awt.event.MouseEvent evt) {                     
  new Lib().configConnection("select * from dzialy");
  jTextField1.setText("23"); 
  Table.setValueAt("123",1,0);
}                    

 /**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify
private javax.swing.JTable Table;
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextField1;
// End of variables declaration

}

package Lib;

import java.sql.*;
import java.util.Properties;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import javax.swing.JTextField;

public class Lib {
protected Connection con;
protected String driverName;
Statement stmt = null;
ResultSet result = null;
Integer i;
public Connection getCon() {
return con;
}

public void setCon(Connection con) {
	this.con = con;
}
   
public void configConnection(String selectSQL) {
        i = 1;
         try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        
        try { 
            String url = "jdbc:mysql://localhost/Agencja reklamowa";
            Properties prop = new Properties();
        prop.setProperty("user","");
        prop.setProperty("password","");                   
            this.con = DriverManager.getConnection(url, prop);
            stmt = this.con.createStatement();
            ResultSet res = stmt.executeQuery(selectSQL);
           
        while (res.next()){
          jTextField1.setText("23");       
          Table.setValueAt(res.getObject(1),i,0); 
          Table.setValueAt(res.getObject(2),i,1); 
          Table.setValueAt(res.getObject(3),i,2);
          i++;
       }
       con.close();
       stmt.close();
       res.close();
       } catch (SQLException ex) {
            ex.printStackTrace();
       }                   
   }    

}

Rzecz w tym że chciałbym się odwołać do pola jTextField1 i Table (jTextField1.setText("23");
Table.setValueAt(res.getObject(1),i,0);
Table.setValueAt(res.getObject(2),i,1);
Table.setValueAt(res.getObject(3),i,2);)
z package Lib ale nie działa, wywala błąd. Czy wie ktoś jak to poprawić ?

0
slawek635 napisał(a)

Rzecz w tym że chciałbym się odwołać do pola jTextField1 i Table

Jeśli z 1 klasy chcesz się odwołać do innej to pierwszą musisz poinfomować gdzie znajduje się druga. Najłatwiejsze rozwiązanie to zadeklarwanie wewnętrznych obiektów jTextField1 i Table w klasie Lib, i przekazanie ich przez konstruktor, lub przez metody set. Możliwe są też inne metody przekazywania obiektów, ale to chyba temet na tutka ;).

0

hmm... no wiec ja proponuje zrobic jeszcze inaczej niz kolega wyzej ale mysle ze lepiej (ale to oznacza tez troszke wiecej roboty) oto co powinienes zrobic...:

  1. po pierwsze proponuje ci utworzyc klase Dzial a w niej atrybuty taki ejak masz w bazie danych w tabeli dzialy czyli np int id_dzialu, String nazwa_dzialu itd
  2. gdy juz mamy ta klase zmienimy ta czesc z klasy lib

while (res.next()){
jTextField1.setText("23");
Table.setValueAt(res.getObject(1),i,0);
Table.setValueAt(res.getObject(2),i,1);
Table.setValueAt(res.getObject(3),i,2);
i++;
}

tak by na podstawie wyciagnietego resultu robil nam obiekt klasy Dzial i wrzucal go do kolekcji czyli cos w stylu

Collection dzialy = new ArrayList();

while (res.next()){

          int id_dzialu = res.getInt(i++);   
          Table.setValueAt(res.getObject(1),i,0); 
          Table.setValueAt(res.getObject(2),i,1); 
          Table.setValueAt(res.getObject(3),i,2);
          i++;
       }
0

czy dobrze rozumiem ze chcesz wypisac (w tabeli) wszystkie dzialy z bazy danych?

0
tesg napisał(a)

hmm... no wiec ja proponuje zrobic jeszcze inaczej niz kolega wyzej ale mysle ze lepiej

W pewnym sensie masz rację, że lepiej, ale Twoja odpowiedź nie dotyka problemu i jest niepełna. Należało napisać tak:
Prawidłowym rozwiązaniem jest odwołanie się do danych z klasy GUI do klasy, która operuje na danych.

tesg napisał(a)
  1. po pierwsze proponuje ci utworzyc klase Dzial a w niej atrybuty taki ejak masz w bazie danych w tabeli dzialy czyli np int id_dzialu, String nazwa_dzialu itd
  2. gdy juz mamy ta klase zmienimy ta czesc z klasy lib
    ...

tak by na podstawie wyciagnietego resultu robil nam obiekt klasy Dzial i wrzucal go do kolekcji czyli cos w stylu

Collection dzialy = new ArrayList();

Do tego momentu jest wszystko ok. Teraz chciałeś napisać:
while (res.next()){
Dzial dzial = new Dzial(res.getInt(1),res.getObject(1),res.getObject(3));
dzialy.add(dzial)
}
Po odczycie danych należy odwołać się do utworzonej listy. Podsumowując:

  • podejście Javy do danych to budowa klas będących odwzorowaniem danych z bazy
  • odczyt danych to utworzenie obiektów
  • to GUI ma się odwoływać do odczytu obiektów a nie odczyt do GUI
0

qrcze sorka po prostu ja to pisalem a pozniej pewnie przez przypadek wzialem publikuj i sie dodalo nie cale bo mialem zamiar w ogóle nie napisac.. no ale skro tak t moze jeszcze raz to napisze bo gdzies to tutaj mialem...

hmm... no wiec ja proponuje zrobic jeszcze inaczej niz kolega wyzej ale mysle ze lepiej (ale to oznacza tez troszke wiecej roboty) oto co powinienes zrobic...:

  1. po pierwsze proponuje ci utworzyc klase Dzial a w niej atrybuty taki ejak masz w bazie danych w tabeli dzialy czyli np int id_dzialu, String nazwa_dzialu itd
  2. gdy juz mamy ta klase zmienimy ta czesc z klasy lib

while (res.next()){
jTextField1.setText("23");
Table.setValueAt(res.getObject(1),i,0);
Table.setValueAt(res.getObject(2),i,1);
Table.setValueAt(res.getObject(3),i,2);
i++;
}

tak by na podstawie wyciagnietego resultu robil nam obiekt klasy Dzial i wrzucal go do kolekcji czyli cos w stylu

Collection dzialy = new ArrayList();

while (res.next()){
int i = 1;
int id_dzialu = res.getInt(i++);
String nazwa_dzialu = res.getString(i++);
Dzial d = new Dzial(id_dzialu, nazwa_dzialu);
dzialy.add(d);
}

na koniec zwracamy kolekcje... czyli trzeba pamietac o zmianie tego co jest zwracane przez metode (Collection) i w klasie NewJFrame w metodzie xxx zmienic linie

new Lib().configConnection("select * from dzialy");

na np Collection c = new Lib().configConnection("select * from dzialy");

---------tyle mialem w notatniki to co ponizej dopisze teraz----------

krok ostatni to iterowanie po kolekcji podpisywanie kazdy obiekt jako Dzial to mniej wiecej bedzie wygladalo tak (pisze na czuja nie chce mi sie zagladac ani tego szukac)

Iterator i = c.iterator();
while (i.hasNext()){
Dzial d = (Dzial)i.next();
}

i w tej petli mozesz sobie wtedy tworzyc wlasnie pola w tabeli wstawiajac dane albo robic co ci sie tam podoba...
podsumowanie mozna przeczytac w poscie powyzej:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1