Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Datensätze v. SQL-Datenbank i. JTextFields ausgeben/updaten
Für euch Java-Freaks isses sicher kein Problem, aber für mich als Anfänger stellt es schon eines dar. Folgendes: Ich möchte fürs erste einmal Datensätze aus einer Datenbank auslesen und diese in JTextFields ausgeben. Ich kann zumindest schon auf die Datenbank zugreifen und so die Einträge einer Tabelle ausgeben. Leider schaffe ich es nicht zb. die Spalten Vorname/Nachname in zwei verschiedene JTextFields auszugeben. Ich möchte dann anschließend via vorwärts und rückwärts Button durch die IDs scrollen und dem ganzen Grenzen setzen, sprich wenn er bei ID 1 runtergeht er zum letzten vorhandenen Datensatz springt und umgekehrt. Und zu allem Überschuss sollte ich das ganze auch noch updaten können, sprich wenn ich in die JTextFields etwas eintrage und dann auf Update gehe, dass sich in der Datenbank ein neuer Eintrag erstellt mit den Daten.
So nach dieser langen Wurst: Weiß jemand wie das geht, oder kann mir jemand wertvolle Tipps geben? Vergesst nicht, ich bin ein absoluter Anfänger und kann außer die SQL Befehle (was nichts mit Java zu tun hat an sich) nicht wirklich viel in Java.
Damit das ganze funktioniert must du dir die Daten, die du von der Datenbank erhälst in eine "gute" Form zum weiterverarbeiten bringen...
Hier drängt sich sozusagen ein Vector, gefüllt mit Objekten auf.
Ich weiss jetzt nicht wie viel Java und oop du schon verstehst... aber ich erklärs einfach mal kurz...
Also du willst anscheinend etwas mit Personen machen... (wegen nachname, vorname...)
Dann brauchst du also eine Klasse Personen, um dann für jeden Datenbankeintrag ein Objekt Person zu erstellen.
könnte so Aussehen:
Code:
public class Person{
private String name;
private String vorname;
//private, damit man nicht von ausssen darauf zugreiffen kann
public Person(String n, String v){
this.name = n;
this.vorname = v;
}
//Das ist der Konstruktor. Jedesmal, wenn du eine Person erstellen willst must du Name und Vorname mitgeben.
public String getName(){
return name;
}
//Das brauchst du, um vom Objekt Person den Namen zu bekommen
public String getVorname(){
return vorname;
}
//Das brauchst du, um vom Objekt Person den Vornamen zu bekommen
}
So nun kannst du beginnen die SQL Daten abzurufen und ind den Vector zu packen:
Code:
//Verbindung herstellen
Vector person = new Vector();
//Der Vector, in den du die Daten Speicherst
String query = "SELECT Name, Vorname FROM person ORDER BY Name";
try {
stmt = conn.createStatement();
rSet = stmt.executeQuery( query );
while ( rSet.next() )
//wenn eine nächste Zeile vorhanden ist, dann mach das mit ihr:
person.add( new Person( rSet.getString("Name"), rSet.getString("Vorname"));
//person.add fügt dem Vector das Objekt bei,
//mit new Person kreirst du ein neues Objekt und übergibst Name und Vorname
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
// Verbindung beenden
So nun haben wir die gewünschten Daten wunderbar in einem Vector, und die Datenbank wird nicht mehr belastet.
Also nun willst du das ganze mit den Textfields machen... das ist nun nicht mehr schwer...
Code:
//das ganze gui...
//Dann brauchen wir eine Variable, in welcher wir speichern, welchen Kunden wir aktuell geöffnet haben...
private int personenindex = 0; //gleich bei null beginnen
//im action Listener des buttons "weiter" oder wie auch immer sollte nun so etwas stehen:
if (personenindex >= (person.size() -1) ){
//personindex ist unser momentaner standort, fängt mit null an.
//person.size() gibt uns die grösse des Vectors Kunde an (also wieviele objekte sprich Kunden darin Sind)
//-1 müssen wir rechenen weill die grösse von 1 an gezält wird und der index von 0 an
//also wenn der index so gross ist wie die totalgrösse sind wir am ende der Daten und wollen vorne Anfangen.
personenindex = 0;
}
else{
//Sonst zälnen wir dem index einfach eins dazu
personenindex = personenindex + 1;
}
beschriften(person,personenindex);
//nun rufen wir die Funktion beschriften auf, und geben ihr den Vector mit den Daten mit und den Index,
//welchen dantensatz wir ansehen wollen.
//Das ganze kannst du dir ja auch noch umschreiben für einen Button zurück... ;)
public void beschriften(Vector p, int i){
//um diese Funktion aufzurufen müssen die Daten und der Index mitgeliefert werden.
Person pers = (Person)p.get(i);
//Wir erstellen ein neues objekt Person mit name pers und holen dies aus dem Vector p an der Stelle i
Nun brauchen wir nur noch die Textfelder zu beschreiben.
jTextfieldName.setText(k.getName());
jTextfieldVorname.setText(k.getVorname());
}
//Jedesmal wenn also die Funktion beschriften aufgerufen wird füllt er die Textfelder mit den Namen.
Voila funktioniert alles tadellos nehme ich mal an Also jetzt brauchen wir nur das Speichern des Datensatzes in die DB... Das ist ganz einfach!!!
Code:
//DB verbindung herstellen
String query = "INSERT INTO `kunde` ( `Name` , `Vorname` )
VALUES ('"+jTextfieldName.getText+"', '"+jTextfieldVorname.getText+"');";
stmt.executeUpdate( query );
//DB verbindung trennen
Damit du nun den neuen Kunden auch hast musst du halt den Vector personen wieder neu füllen...
Das ganze kannst du natrülich noch beliebig ausweiten und gescheit in Klassen packen, damit das dann auch schön oo wird... Aber ich denke fürs erste sollte dir das mal genügen... [/code]
Hallo! Vielen Dank für die umfassende Hilfe, ich werde das gleich morgen in der Früh probieren und wenn ich noch Fragen haben sollte, hättest du nocheinmal die Zeit mir zu helfen? Bin dir echt dankbar für deine vielen Kommentare in deiner Ausführung, das macht schon sehr viel leichter. Java ist an sich sehr interessant, aber durch das objektorientierte Programmieren etwas schwierig, da ich nicht wirklich vom Programmieren her komme.
/*
* Northwind.java
*
* Created on 07. Juli 2004, 18:41
*/
/**
*
* @author Marek
*/
public class Northwind extends javax.swing.JFrame {
/** Creates new form Northwind */
public Northwind() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
getContentPane().setLayout(new java.awt.GridLayout(2, 3));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jTextField1.setText("jTextField1");
getContentPane().add(jTextField1);
jTextField2.setText("jTextField2");
getContentPane().add(jTextField2);
jTextField3.setText("jTextField3");
getContentPane().add(jTextField3);
jButton1.setText("jButton1");
getContentPane().add(jButton1);
jButton2.setText("jButton2");
getContentPane().add(jButton2);
jButton3.setText("jButton3");
getContentPane().add(jButton3);
pack();
}
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new Northwind().show();
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
// End of variables declaration
}
/*
* Sql.java
*
* Created on 7. Juli 2004, 20:21
*/
package northwind;
/**
*
*
*/
import java.sql.*;
import java.util.*;
public class Sql {
private Connection conn;
private Statement stmt;
private ResultSet rSet;
private int update;
public boolean connect() {
//Verbindung zur DB aufbauen hier wird klar, dass diese funktion einen boolean zurück liefern muss
try {
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
}
catch ( ClassNotFoundException e ) {
System.out.println( "Fehler bei ODBC-JDBC-Bridge" + e );
return false;
//Falls was mit dem Treiber nicht klappt geht er schon hier mit dem false zurück...
}
try
{
String url = "jdbc:odbc:Northwind";
conn = DriverManager.getConnection( url, "mt", "mt" );
}
catch ( SQLException e )
{
System.out.println( "Fehler beim Connecten" + e );
return false;
//Falls was mit der Verbindung nicht klappt geht er hier zurück...
}
return true;
//Falls alles glatt läuft kommt true zurück
}
public ResultSet abfrage(String query){
//Eine Abfrage machen hier kommt ein Result Set zurück
try
{
stmt = conn.createStatement();
rSet = stmt.executeQuery( query );
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
return rSet; //genau hier wirds zurück gegeben.
}
public boolean abfrageende(){
//Das Abfrage Ende ist separat, da es sonst konflickte mit dem Abfragen gibt
try {
stmt.close();
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
return false;
}
return true;
}
public int update(String query){
//die Updatefunktion unterscheidet sich minim von der Abfragefunktion ;)
try {
stmt = conn.createStatement();
update = stmt.executeUpdate( query );
//Bei der Update Funktion bekommen wir einen Integer zurück für die Anzahl betroffener Datensätze
stmt.close();
}
catch ( SQLException e ) {
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
return update;
//diesen könne wir später zum überprüfen noch gebrauchen.
}
public boolean trennen(){
//last but not least.. ;)
try {
conn.close();
}
catch ( SQLException e ) {
System.out.println( "Fehler bei Tabellenabfrage" + e );
return false;
}
return true;
}
}
package northwind;
/*
* Northwind.java
*
* Created on 07. Juli 2004, 18:41
*/
import java.sql.*;
import java.util.*;
/**
*
* @author Marek
*/
public class Northwind extends javax.swing.JFrame {
public Vector personen;
/** Creates new form Northwind */
public Northwind() {
initComponents();
vectorFüllen();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
getContentPane().setLayout(new java.awt.GridLayout(2, 3));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jTextField1.setText("jTextField1");
getContentPane().add(jTextField1);
jTextField2.setText("jTextField2");
getContentPane().add(jTextField2);
jTextField3.setText("jTextField3");
getContentPane().add(jTextField3);
jButton1.setText("jButton1");
getContentPane().add(jButton1);
jButton2.setText("jButton2");
getContentPane().add(jButton2);
jButton3.setText("jButton3");
getContentPane().add(jButton3);
pack();
}
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new Northwind().show();
}
public void vectorFüllen(){
Sql sql = new Sql();
sql.connect();
String query = "Hier kommt dein Query";
try {
ResultSet rSet = sql.abfrage(query);
while ( rSet.next() )
personen.add( new Person( rSet.getString("Name"), rSet.getString("Vorname") ));
}
catch ( SQLException e ){
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
sql.abfrageende();
sql.trennen();
beschriften(personen, 0);
}
public void beschriften(Vector p, int i){
Person pers = (Person)p.get(i);
jTextField1.setText(pers.getName());
jTextField2.setText(pers.getVorname());
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
// End of variables declaration
}
OK du hast glück... Ich fahre erst in der früh in die ferien...
also hier der code für die Klasse Sql:
Code:
package videothek2;
import java.sql.*;
import java.util.*;
public class Sql {
private Connection conn;
private Statement stmt;
private ResultSet rSet;
private int update;
public boolean connect()
{
try {
Class.forName( "com.mysql.jdbc.Driver" );
}
catch ( ClassNotFoundException e ) {
System.out.println( "Fehler bei ODBC-JDBC-Bridge" + e );
return false;
}
try
{
String url = "jdbc:mysql://localhost/videothek";
conn = DriverManager.getConnection( url, "root", "224181" );
//conn.close();
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
return false;
}
return true;
}
public ResultSet abfrage(String query){
try
{
stmt = conn.createStatement();
String sqlQuery = query;
rSet = stmt.executeQuery( sqlQuery );
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
return rSet;
}
public boolean abfrageende(){
try
{
stmt.close();
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
return false;
}
return true;
}
public int update(String query){
try
{
stmt = conn.createStatement();
String sqlUpdate = query;
update = stmt.executeUpdate( sqlUpdate );
stmt.close();
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
return update;
}
public boolean trennen(){
try
{
conn.close();
}
catch ( SQLException e )
{
System.out.println( "Fehler bei Tabellenabfrage" + e );
return false;
}
return true;
}
}
und hier die Klasse gui
Code:
/*
* gui.java
*
* Created on 8. Juli 2004, 22:09
*/
package northwind;
/*
* Northwind.java
*
* Created on 07. Juli 2004, 18:41
*/
import java.sql.*;
import java.util.*;
/**
*
* @author Marek
*/
public class gui extends javax.swing.JFrame {
public Vector person;
public int personenindex;
private Statement stmt;
private int anzahl;
/** Creates new form gui */
public gui() {
initComponents();
vectorFüllen();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
getContentPane().setLayout(new java.awt.GridLayout(2, 3));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jTextField1.setText("jTextField1");
getContentPane().add(jTextField1);
jTextField2.setText("jTextField2");
getContentPane().add(jTextField2);
jTextField3.setText("jTextField3");
getContentPane().add(jTextField3);
jButton1.setText("<<");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton2.setText(">>");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
getContentPane().add(jButton2);
jButton3.setText("Update");
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
});
getContentPane().add(jButton3);
pack();
}//GEN-END:initComponents
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
Sql sql = new Sql();
sql.connect();
String query = "INSERT INTO `Employees` ( `LastName` , `FirstName` ) VALUES ('"+jTextField1.getText()+"', '"+jTextField2.getText()+"');";
if(sql.update(query)==1){
sql.trennen();
beschriften(person, 0);
person.add( new Person( jTextField1.getText(), jTextField1.getText()));
}
else{
System.out.println( "Fehler beim Speichern des Datensatz in die DB");
}
}//GEN-LAST:event_jButton3ActionPerformed
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
if (personenindex >= (person.size() -1) ){
personenindex = 0;
}
else{
personenindex = personenindex + 1;
}
beschriften(person, personenindex);
}//GEN-LAST:event_jButton2ActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
if (personenindex <= 0 ){
personenindex = person.size() -1;
}
else{
personenindex = personenindex - 1;
}
beschriften(person,personenindex);
}//GEN-LAST:event_jButton1ActionPerformed
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new gui().show();
}
public void vectorFüllen(){
Sql sql = new Sql();
sql.connect();
String query = "SELECT * LastName, FirstName FROM Employees";
try {
ResultSet rSet = sql.abfrage(query);
while ( rSet.next() )
person.add( new Person( rSet.getString("name"), rSet.getString("vorname") ));
}
catch ( SQLException e ){
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
sql.abfrageende();
sql.trennen();
beschriften(person, 0);
}
public void beschriften(Vector p, int i){
Person pers = (Person)p.get(i);
jTextField1.setText(pers.getName());
jTextField2.setText(pers.getVorname());
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
// End of variables declaration//GEN-END:variables
}
und die klasse person hast du ja....
war eigentlich nichts grosses... ein par gross und kleinschreibefehler... flüchtigkeits fehler (z.B. textfeldName.getText() wobei das textfeld so hiess: jTextfield1....) na ja schaus dir genau an...
Hab ausserdem noch ne abfrage zur kontrolle für das update gemacht...
in diesem Stil könntest du jetzt auch die ganzen verbindungen kontrollieren...
Also viel erfolg mit deinem Projekt. Gute Zeit... cu.
/*
* gui.java
*
* Created on 07. Juli 2004, 18:41
*/
import java.sql.*;
import java.util.*;
/**
*
* @author Marek
*/
public class gui extends javax.swing.JFrame {
public Vector personen;
public Vector person;
public int personenindex;
private Statement stmt;
private int anzahl;
/** Creates new form gui */
public gui() {
initComponents();
vectorFüllen();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
getContentPane().setLayout(new java.awt.GridLayout(2, 3));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jTextField1.setText("jTextField1");
getContentPane().add(jTextField1);
jTextField2.setText("jTextField2");
getContentPane().add(jTextField2);
jTextField3.setText("jTextField3");
getContentPane().add(jTextField3);
jButton1.setText("<<");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton2.setText(">>");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
getContentPane().add(jButton2);
jButton3.setText("Update");
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
});
getContentPane().add(jButton3);
pack();
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
Sql sql = new Sql();
sql.connect();
String query = "INSERT INTO `Employees` ( `LastName` , `FirstName` )" +
"VALUES ('"+jTextField1.getText()+"', '"+jTextField2.getText()+"');";
if(sql.update(query)==1){
sql.trennen();
beschriften(person, 0);
person.add( new Person( jTextField1.getText(), jTextField1.getText()));
}
else{
System.out.println( "Fehler beim Speichern des Datensatz in die DB");
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
if (personenindex >= (person.size() -1) ){
personenindex = 0;
}
else{
personenindex = personenindex + 1;
}
beschriften(person,personenindex);
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
if (personenindex <= 0 ){
personenindex = person.size() -1;
}
else{
personenindex = personenindex - 1;
}
beschriften(person,personenindex);
}
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new gui().show();
}
public void vectorFüllen(){
Sql sql = new Sql();
sql.connect();
String query = "SELECT * LastName, FirstName FROM Employees";
try {
ResultSet rSet = sql.abfrage(query);
while ( rSet.next() )
person.add( new Person( rSet.getString("name"), rSet.getString("vorname") ));
}
catch ( SQLException e ){
System.out.println( "Fehler bei Tabellenabfrage" + e );
}
sql.abfrageende();
sql.trennen();
beschriften(person, 0);
}
public void beschriften(Vector p, int i){
Person pers = (Person)p.get(i);
jTextField1.setText(pers.getName());
jTextField2.setText(pers.getVorname());
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
// End of variables declaration
}
Fehlermeldungen:
gui.java [97:1] cannot resolve symbol
symbol : class Person
location: class gui
person.add(new Person( jTextField1.getText(), jTextField1.getText()));
^
gui.java [143:1] cannot resolve symbol
symbol : class Person
location: class gui
person.add( new Person( rSet.getString("name"), rSet.getString("vorname") ));
^
gui.java [154:1] cannot resolve symbol
symbol : class Person
location: class gui
Person pers = (Person)p.get(i);
^
gui.java [154:1] cannot resolve symbol
symbol : class Person
location: class gui
Person pers = (Person)p.get(i);
^
4 errors
Errors compiling gui.