Προς το περιεχόμενο

JTable στην Java


profitis

Προτεινόμενες αναρτήσεις

Δημοσ.

Θέλω να φτιάξω ένα JTable ωστε να αναπαραστώ δεδομένα μου στην οθόνη.

 

Χρησιμοποιώ μία κλάση που κάνει extend την AbstractTableModel ωστε να συνδέσω τα δεδομένα μου με με το JTable.

 

Yλοποιώ τις μεθόδους

 

>
public int getColumnCount()

public int getRowCount()

public boolean isCellEditable(int row, int column)

public Object getValueAt(int row, int column) 

public void setValueAt(Object value, int row, int column)

 

(αν δεν επιστρέφω false για κάθε τιμή στην isCellEditable καθώς πολλές φορές μου αρκει να τα παρουσιάζω τα δεδομένα ή να κάνω ένα συνδιασμό αυτων των δύο).

 

Θέλω να προσθέσω column headers αλλα ως τώρα δεν έχω βρει καμία μέθοδο απο το API.

Αν το JΤable το προσθέσω σε ένα JScrollPane δημιουργούνται column names(Α Β C etc) όμως δεν έχω καταφέρει να τα αλλάξω...Αν κάποιςο γνωρίζει το πως πραγματικά θα με βοηθήσει πάρα πολύ.

 

>
insert=new JTable(productsInTable);
       
       panel = new JScrollPane(insert);
       panel.setPreferredSize(new Dimension(600,200));
       panel.setColumnHeader(new JViewport());

 

Με το productsInTable να ειναι η κλάση που κάνει extend το asbstractTableModel.

 

Eπίσης,γίνεται με κάποια μέθοδο,σειρές του πίνακα να τις αφαιρώ(να τις κάνω δηλαδή αόρατες) και να τις προσθέτω κατα βούληση χωρίς πάντα να επηρεάζονται τα δεδομένα μου στην RAM;

 

Eυχαριστώ εκ των προτέρων για τον χρόνο σας!

Δημοσ.

Για να βάζεις τίτλους στα column headers θα σου πω δύο τρόπους και επιλέγεις ότι προτιμάς

  • >table.getColumnModel().getColumn(i).setHeaderValue("Title");

  • Αυτός ο τρόπος είναι στην δημιουργία του JTable.Είναι ο κώδικας που παράγει το netbeans και απλά στον κάνω copy/paste

>table.setModel(new javax.swing.table.DefaultTableModel(
           new Object [][] {

           },
           new String [] {
                 "Title1", "Title2"  
             }
       )) ;

Όσο αναφορά το να αφαιρείς και να προσθέτεις γραμμές δυναμικά μπορείς να κάνεις το εξής:

 

> javax.swing.table.DefaultTableModel model=(javax.swing.table.DefaultTableModel)table.getModel();

model.removeRow(index);

Αλλά δυστυχώς , όσο ξέρω εγώ τουλάχιστον, μπορείς να προσθέσεις μόνο στο τέλος σειρά ως εξής:

 

Γεμίζεις πρώτα έναν Vector με τα αρχικά δεδομένα που θα έχει (κατά πάσα πιθανότητα κενά...οπότε γέμισε με κενά στοιχεία) και κάνεις:

 

> model.addRow(vector);

Δημοσ.

Σε ευχαριστώ πάρα πολύ για τις απαντήσεις...Με βοηθάς όσο δεν μπορείς να φανταστείς...

 

status.removeRow(index);

 

To status ειναι τύπου AbstractTableModel,σωστά;

Δημοσ.

Είναι DefaultTableModel αλλά αν δεις το ΑΡΙ κληρονομεί την AbstractTableModel και κατ επέκτασιν μπορείς να πεις ότι είναι και αυτού του τύπου.

 

Συγνώμη κατάλαβα γιατί ρωτάς...είχα κάνει βλακεία στον κώδικα το έχω διορθώσει τώρα.

Αντί για status είναι model :-)

Δημοσ.

Αντι για DefaultTableModel βάζω στο casting ΑbstractTableModel...

 

Τότε μου βγάζει οτι η μέθοδος removeRow ειναι unDefined για την κλάση AbstractTableModel...και λογικό...

 

Εστω οτι στην κλάση που υλοποιώ την σύνδεση των δεδομένων μου με τον πίνακα την κάνω DefaultTableModel που κληρονομεί απο την AbstractTableModel..Τότε μου πετάει NullPointerException στις μεθόδους τις κλάσεις...Δηλαδή σαν να με κρατάει "υποχρεωτικά" στο AbstractTableModel

Δημοσ.

Kαι πάλι σ ευχαριστώ πολύ για την βοήθεια σου! :)

 

>
public class ΤableModel extends AbstractTableModel
{
Vector<Product> data;

public ΤableModel(Vector<Product>  Catalogue)
{
	this.data=Catalogue;
	
}

public int getColumnCount() 
{
	return 5;
}


public int getRowCount() 
{
	return data.size();
}

@Override
public Object getValueAt(int row, int column) 
{
	if (column==0)
		return (Object) ((Product)data.get(row)).getCode();
	else if (column==1)
		return (Object)((Product)data.get(row)).getManufacter();
	else if (column==2)
		return (Object) ((Product)data.get(row)).getModel();
	else if(column==3)
		return (Object) ((Product)data.get(row)).getPrice();
	else if(column==4)
		return (Object) ((Product)data.get(row)).getQuantity();
	return null;
}

public boolean isCellEditable(int row, int column) 
{
	return false;
}

public void setValueAt(Object value, int row, int column) 
{

	String temp;
	Product obj = (Product)data.get(row);
	if(column==0)
	{
		temp=(String)value;
		obj.setCode(Integer.parseInt(temp));
	}
	else if(column==1)
		obj.setManufacter((String)value);
	else if(column==2)
		obj.setModel((String) value);
	else if(column==3)
	{
		temp=(String)value;
		obj.setPrice(Float.parseFloat(temp));
	}
	else if(column==4)
	{
		temp=(String)value;
		obj.setQuantity(Integer.parseInt(temp));
	}
}

}

 

 

Mετά κάπου αλλου κάνω τα εξής

 

>
ΤableModel  productsInTableData=new ΤableModel (Products);
	productsInTable=new JTable(productsInTableData);

 

Aν πάω σ αυτον τον κώδικα δεν μπορώ να εφαρμόσω τα παραπάνω που μου έγραψες...δηλαδή να πάρω τον έλεγχο του table...

Δημοσ.

Σου επισυνάπτω τον κώδικα.

Επειδή δεν έχω τις τάξεις που χρησιμοποιείς στον πίνακα έχω κάνει το JTable να δέχεται απλά String....μπορείς εύκολα να το αλλάξεις σε ότι θέλεις.

 

Έχω φτιάξει και ένα JFrame που έχει δύο κουμπιά που προσθέτουν και αφαιρούν γραμμές από τον πίνακά σου.

 

Αν έχεις κάποια απορία για τον κώδικα μην διστάσεις να ρωτήσεις.

test.zip

Δημοσ.

Ξέχασα να συμπεριλάβω και το πως να βάζεις τίτλους στις στήλες.

Αν θέλεις τα ονόματα να είναι στατικά τότε πολύ απλά βάλε αυτήν την μέθοδο μέσα στο TableModel:

 

 

>public String getColumnName(int col){
       String[] columnNames = { "Column1","Column2","Column3","Column4","Column5" };
       return columnNames[col];
   }

Αν θέλεις να μπορείς να τα αλλάζεις δυναμικά τότε κάνε τον πίνακα columnNames global

και άσε μόνο το return statement μέσα.

 

Τέλος βάλε μία μέθοδο που να αλλάζει το περιεχόμενο αυτού του πίνακα ως εξής:

 

>public void setColumnName(int col,String s){
       columnNames[col] = s;         
   }

Ένα table.updateUI(); για να πάρει τις αλλαγές....και είσαι έτοιμος.:-)

Δημοσ.

Φίλε Αλεξ σ ευχαριστώ πολύ που ασχολήθηκες και το έφτιαξες.

 

Ετσι θα ήταν πραγματικά ακριβώς αλλα απλά θέλω να τα προσθαφαιρώ στην οθόνη...Δηλάδη δίνει την επιλογή απο ένα Combo box 1 και απο ένα άλλο 2 και κατάλληλα εξαφανίζονται ορισμένες εγραφές.Ομως όταν τα ξαναπάω τα Comboboxes ας πούμε στο μηδεν τότε ξαναεμφανίζονται όλα.Δηλάδή κάτι σαν hide.Sorry,έπρεπε να το διευκρινήσω καλύτερα...Βέβαια τώρα προς το τέλος μυο βγήκε να έχω άμεσο access στην RAM απο το JTable.(Το AbstractTableModel που κατασκεύασα κάνει άμεσο access τα δεδομένα μου.)

 

Αυτο που σκέφτομαι ειναι να φτιάξω Listeners για τα δύο comboboxes που θα έχουν διάφορες επιλογές μέσα και να πειράξω την getValues του AbstractTable model.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...