JList oder JTable?

Status
Nicht offen für weitere Antworten.

Dit_

Bekanntes Mitglied
Hallo zusammen!

follgendes Problem.

Gegeben ist eine Liste mit Daten
zB

HTML:
Slot | Name | Punkte | Ping
---------------------------
1      Dit      10000     15
4      pls      443       11

usw...

diese daten bekomme ich von einem Spielserver in einem 1sek-takt. Jetzt aber weiss ich nicht wie ich diese sich ständig ändernde Daten darstellen soll. Das problem ist ich brauche noch "Rechtsklick-Funktion" so dass ich auf einen der Spieler mit der rechten Maustaste klicken kann und dann bestimmte funktionen aktivieren...


Was soll ich benutzen JList oder JTable ?


P.S. bei JTable kann ich setEditable(false) nicht nutzen 🙁

danke schonmal 🙂
gruss
 
Hallo Danke erstmal 🙂

Java:
{
				TableModel model1 = new DefaultTableModel(alliesDaten, spaltenNamen); 
				tabelleAllies = new JTable();
				tabelleAllies.setModel(model1);
				tabelleAllies.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
				tabelleAllies.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);				
				tabelleAllies.setColumnSelectionAllowed(false);
				tabelleAllies.setRowSelectionAllowed(true);
				tabelleAllies.setBackground(new java.awt.Color(128, 128, 255)); //blau
				//tabelleAllies.setShowHorizontalLines(false);
				//tabelleAllies.setShowVerticalLines(false);
				

				TableColumn slot = tabelleAllies.getColumnModel().getColumn(0);
				TableColumn name = tabelleAllies.getColumnModel().getColumn(1);
				TableColumn xp = tabelleAllies.getColumnModel().getColumn(2);
				TableColumn ping = tabelleAllies.getColumnModel().getColumn(3);

				slot.setPreferredWidth(25);
				name.setPreferredWidth(170);
				xp.setPreferredWidth(55);
				ping.setPreferredWidth(35);

			}

ich habe also die Hintegrundfarbe gesetzt, aber es funktioniert irgendwie nicht so richtig, es wird zwar blau, nicht aber die ganze tabelle... nur der bereich in dem Zeilen vorhanden sind. In meinem Fall habe ich 2 Tabellen neben einander die eine soll Team A (Rot) die andere Team B (Blau) darstellen, wenn ich in team A 10 spieler habe und in Team B 8, dann ist das ganze ungleich gefärbt 🙁
Weiss jem wie ich das beheben kann ?
 
Die Tabelle ist nur so groß wie ihre Zellen. Das was Du noch grau siehst ist nicht die Tabelle, sondern der JViewport auf dem sie liegt. Der Quelltext wo das rein muss fehlt jetzt oben, in etwa so geht's:
Java:
final JScrollPane sp = new JScrollPane(tabelleAlias);
sp.getViewport().setBackground(YOURCOLOR);
someContainer.add(sp);
Ebenius
 
hallo nochmal, wollte nicht neues Thema starten...

wie mache ich denn eine leere Zeile nicht auswählbar ?
Problem ist ja, dass wenn ich Programm starte, braucht ja mein "AbstractTableModel"
anzahl der Zeilen und Spalten, deswegen muss ich am Anfang der Klasse

Java:
private String[][] axisDaten 			 = new String[16][4];
deklarieren, sonst gibt es Null-Fehler... Jetzt passiert follgendes, wenn in dem Team nur 10 spieler sind, dann sind die restlichen 6 Zeilen leer... hässlich..

was mir halt einfällt, die leeren Zeile zu deaktivieren soweit das möglich ist...


Java:
tableModelAxis = new AbstractTableModel() {

					public String getColumnName(int col) {
						return spaltenNamen[col].toString();
					}

					@Override
					public Object getValueAt(int rowIndex, int columnIndex) {
						return axisDaten[rowIndex][columnIndex];
					}

					@Override
					public int getRowCount() {
						return axisDaten.length;
					}

					@Override
					public int getColumnCount() {
						return spaltenNamen.length;
					}

					@Override
					public boolean isCellEditable(int row, int col) {
						return false;
					}

					@Override
					public void setValueAt(Object value, int row, int col) {
						axisDaten[row][col] = (String) value;
						fireTableCellUpdated(row, col);
					}

				};

gruss
 
Ich würde gleich von dem Ansatz mit dem Daten-Array weggehen. Mach dir ne Liste und verwende die. Dann ist dein Table voll dynamisch und du hast auch nicht mehr Zeilen als Spieler in der Tabelle.

Java:
class MyTableModel extends AbstractTableModel{

     private List<YourData> data;
 
     public MyTableModel(){
           data = new ArrayList<YourData>();
     }

     public void addData(YourData newData){
           data.add(newData);
           fireTableDataChanged();
     }

     // die restlichen Methoden überschreiben, wie du es davor gemacht hast, 
     // aber dann halt die Liste verwenden. Also zB:

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

und dann erzeugst du eine Instanz dieses Models, befüllst es mit der addData()-Methode und fertig
 
Hi
eigentlich arbeite ich die ganze Zeit mir zB
Java:
ArrayList<SpielerInfo> axisListe

konnte aber nicht rausfinden wie man die tabelle mit daten aus dieser liste füllt. Deswegen konvertierte ich im letzten Schritt ArryList zu String[][] 😳

hier ist meine tableModel definition:


Java:
// AXIS//
			{
				tableModelAxis = new AbstractTableModel() {

					public String getColumnName(int col) {
						return SPALTEN[col].toString();
					}

					@Override
					public Object getValueAt(int rowIndex, int columnIndex) {
						return axisDaten[rowIndex][columnIndex];
					}

					@Override
					public int getRowCount() {
						return axisDaten.length;
					}

					@Override
					public int getColumnCount() {
						return SPALTEN.length;
					}

					@Override
					public boolean isCellEditable(int row, int col) {
						return false;
					}

					@Override
					public void setValueAt(Object value, int row, int col) {
						axisDaten[row][col] = (String) value;
						fireTableCellUpdated(row, col);
					}

				};


und dann später methode aktualisiere();

Java:
for (int zeileAxis = 0; zeileAxis < axisListe.size(); zeileAxis++){
			tableModelAxis.setValueAt(axisListe.get(zeileAxis).getSlot(),zeileAxis, 0);
			tableModelAxis.setValueAt(axisListe.get(zeileAxis).getName(),zeileAxis, 1);
			tableModelAxis.setValueAt(axisListe.get(zeileAxis).getXP(),zeileAxis, 2);
			tableModelAxis.setValueAt(axisListe.get(zeileAxis).getPing(),zeileAxis, 3);
		}

wie kann ich die daten direkt aus der Liste nehmen, mit setValue geht ja nicht ???:L

muss ich dann für alle Tabellen neue TableModelKlasse erstellen ? und dann so vorgehen wie du beschrieben hast ?
 
Hi, ich hoffe ich bin hier nicht ganz auf einem falschen Dampfer, aber mit remove(Obj o); kannst du aus der Liste die Daten raus nehmen, du kannst die List auch iterieren und iterator.remove(); damit nimmt man alles raus!
Hoffe nur(Ohne alles durch zu lesen) dass, es zum Thema passt!
MFG
 
Hmmm...
wenn ich mit ArrayList arbeite wie soll ich dann
Java:
 @Override
                    public Object getValueAt(int rowIndex, int columnIndex) {
                        return axisDaten[rowIndex][columnIndex];
                    }

umschreiben ? Ich kann doch jetzt nicht mehr mit
Java:
int rowIndex, int columnIndex
auf die daten zugreifen?

@ Java@home
mir gehts mehr darum die daten zu aktualisieren ohne sie vorher zu löschen 🙂
 
Also das ist ganz einfach. Du musst dir eigene add/remove/change Methoden schreiben, die entsprechendes mit den Daten in der Liste machen, und danach ein passendes Event feuern, sodass der Table (die View) sich aktualisiert.

Natürlich kannst du noch mit rowIndex und modelIndex arbeiten, aber es geht halt jetzt nicht mehr "direkt". Aber:

Java:
 @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
                YourData theData = data.get(rowIndex);
                switch(columnIndex){
                     case 0: return theData.getName();
                     case 1 : return theData.getIP();
                     // ...
                     default: return null;
                 }
         }

Damit sich keine Fehler einschleichen würde ich mir für die Spalten-Indices in der Klasse noch Konstanten erstellen. Also

Java:
public static final int NAME = 0;
public static final int IP= 1;

und dann halt

Java:
  @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
                YourData theData = data.get(rowIndex);
                switch(columnIndex){
                     case NAME: return theData.getName();
                     case IP : return theData.getIP();
                     // ...
                     default: return null;
                 }
         }
 
Danke sehr!
mache mich sofort an die Arbeit 🙂


P.S. Danke hdi funktioniert alles wunderbar! 🙂
 
Zuletzt bearbeitet:
Nächste Frage 🙂

Soll ich für meine Tabelle extra Klasse (als GUI Komponent) anlegen? Wenn ja, wie soll ich dann diese Tabelle aktualisieren? Ich meine, wer macht das dann modell, kontroller, oder meine "GUI-Oberklasse".
Ist es eigentlich OK wenn ich für meine GUI nur eine Klasse verwende?

Danke schon mal...
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben