Portal > Foren > Java > Desktop-Applikationen und Grafik > JTable nach Buttonklick mit Elementen aus ComboBox füllen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 03.03.2006, 00:09 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard JTable nach Buttonklick mit Elementen aus ComboBox füllen

Hallo,
ich würde gerne Folgendes machen.
Ich habe eine ComboBox, wähle einen Eintrag aus und klicke auf einen Button "add". Dann soll automatisch der ausgewählte Eintrag in eine Tabelle (JTable) übernommen werden.
Da es sich bei den ComboBox-Einträgen um Objekte handelt sollte es doch eigentlich möglich sein, dann auch in der Tabelle Informationen aus den Objekten zusätzlich zum Namen darzustellen, nicht wahr?
Gut. *g*

Mein Problem liegt jetzt darin, dass ich nicht weiß, wie ich das konstruiere. Mir ist diese Seite und im Speziellen dieser Abschnitt hier bekannt:
http://java.sun.com/docs/books/tutor...able.html#data

Aber irgendwie .. finde ich den Ansatz nicht. Also wie ich das mit dem TableModel mache bzw. wie ich damit umgehe, was ich selbst schreiben muss etc. etc.

Vielleicht liegt es auch vor mir und ich sehe es nicht. Kann heute durchaus sein
Würde mich freuen, wenn mir vielleicht jemand einen Ansatz sagen könnte. Bestenfalls natürlich an einem kleinen Schnipsel oder von mir aus auch an den Sun-Beispielen zu diesem Thema erklärt.

Danke im Voraus.
Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2006, 01:25 Nach oben    #2
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 576
Standard

Ich kann dir nicht ganz folgen.
Was ist denn in der ComboBox genau zu sehen?
Und wie soll der Inhalt in die Darstellung der Tabelle einfließen?

Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2006, 01:34 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Also in der ComboBox steht bislang nur der Name der Klasse. Schau auch mal hier:
http://forum.developers-guide.net/sh...2228#post22228

Jut. In der Tabelle soll dann eigentlich stehen
Code:
Name - Info1 - Info2
Die Informationen sind Standardsachen aus der Klasse, die dann ja jedes Objekt von dem Typen hat.

Ich möchte nämlich gerne in der Tabelle dann z.B. Info1 von einem Standardwert in einen beliebigen Wert ändern. Dazu habe ich mir schon das hier angeschaut:
http://java.sun.com/docs/books/tutor....html#combobox

Das wäre passend .
Jut. Wenn ich die Tabelle dann mit Sachen aus der ComboBox gefüllt habe möchte ich die einzelnen Objekte dann nutzen. Im Endeffekt sind das Hindernisse, die ich dann ins Spielfeld zeichne, allerdings ist das wohl erst mal nicht so wichtig (denke ich mir ).

Ich mache das mit ComboBox und Tabelle, weil es möglich sein soll mehrere Hindernisse gleicher Art in der Tabelle zu verwalten. Dies füge ich dann durch den Button hinzu.

Hoffe, dass ich das einigermaßen verständlich rübergebracht habe .

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2006, 21:03 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

*schubs* .. Weiß niemand Rat? Habe ich eventuell doch zu schlecht erklärt, was ich haben will?
Fragt nach, wenn es Unklarheiten gibt.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2006, 22:28 Nach oben    #5
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

java Code:
  1. public class ClassTableModel extends AbstractTableModel {
  2.     private List data;
  3.    
  4.     public ClassTableModel() {
  5.         data = new ArrayList();
  6.     }
  7.  
  8.     public String getColumnName(int col) {
  9.         switch(col) {
  10.             case 0: return "Name";
  11.             case 1: return "Info 1";
  12.             case 2: return "Info 2";
  13.         }
  14.     }
  15.     public int getRowCount() { return data.size(); }
  16.     public int getColumnCount() { return 3; }
  17.     public Object getValueAt(int row, int col) {
  18.         Class clazz = data.get(row);
  19.         switch(col) {
  20.             // ClassData ist hier irgendwas, wo die Infos für die Klasse drinstehen
  21.             // - irgendne Map wahrscheinlich
  22.             case 0: return ClassData.getClassName(clazz);
  23.             case 1: return ClassData.getInfo1(clazz);
  24.             case 2: return ClassData.getInfo2(clazz);
  25.         }
  26.     }
  27.     public boolean isCellEditable(int row, int col) { return false; }
  28.     public void setValueAt(Object value, int row, int col) {}
  29.    
  30.     public void addClass(Class clazz) {
  31.         data.add(clazz);
  32.         fireIrgendwasMitInsert(this, ...);
  33.     }
  34. }

Falls dir das was hilft, weil so richtig hab ich nicht verstanden, wo dein Problem ist...
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 06:23 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Also ich habe nun wirklich lange an dem Kram gesessen aber es hängt noch. Ich muss gestehen, dass ich auch nicht so ganz weiß, was ich noch besser erklären könnte.

Es geht darum, dass ich eine ComboBox habe. In dieser stehen derzeit die Einträge "Hindernis1" und "Hindernis2" (mal als Beispiel). Das sind nicht nur Strings, sondern ich fülle die ComboBox so
Java Code:
  1. final JComboBox barricadeChooser = new JComboBox();
  2. barricadeChooser.addItem(Hindernis1.class);
  3. barricadeChooser.addItem(Hindernis2.class);
Das habe ich von hier.

Jut. Ich klicke jetzt also auf den Button und dann habe ich erstmal das Problem hier (es geht dort ums Prinzip, bitte nichts in dieses Probleme hineininterpretieren, was ich hier nicht sage!) . Gut. Ist das gelöst würde das Problem entstehen, dass ich nicht weiß, wie ich denn jetzt die von Dir erstellte Methode addClass(..) aufrufe. Jou, per Objekt und normalem Methodenzugriff. Supi .. .. aber wo und wie und was ist das mit dem fireGedöhns(this, ..)?

Ich habe in der API nachgeschaut und einige fire-Methoden gefunden, allerdings weiß ich jetzt als "Noobi" gerade nicht, was ich damit anfangen soll.
Liegt allerdings wohl daran, dass ich gerade den Gesamtablauf nicht so ganz verstanden habe .. also wie das mit dem Füllen einer Tabelle eigentlich so geht. .


Also am Ende möchte ich es eben gerne so haben, dass ich auf den Button klicke und dann Informationen der Klasse, welches in der ComboBox ausgewählt wurde in der Table angezeigt werden.

Beispiel:
Ich wähle "Hindernis1" in der ComboBox aus und klicke auf "hinzufügen". Nun soll in der Table angezeigt werden ..
--> Tabellenkopf(steht immer drin) Name - Info1 - Info2
Und dadrunter: Hindernis1 - rot - 23

"rot" und "23" sind dann Standardwerte, die in der Klasse Hindernis1 hinterlegt sind und die dann ausgelesen werden, damit man sie nachträglich für das Objekt in der Tabelle editieren kann.

Ist das besser erklärt?


[EDIT]
Ich habe vor allem noch ein Problemchen, welches sich gerade so in meine Richtung schiebt . Ist mir zu Beginn gar nicht als solches aufgefallen.

Wenn ich das hier schreibe
Java Code:
  1. Class c = ((Class)barricadeChooser.getSelectedItem());
  2. Barricade b = (Barricade)c.newInstance();
erhalte ich natürlich eine InstantiationException, weil Barricade ja ein Interface ist.
Hmpf.

Was machen wir denn nun?

[EDIT]
Könnte man das eventuell mit der hier angedeuteten HashMap lösen?
Ich will ja gar nicht nerven *leibguck*, aber meine Zeit .. sie rennt *gg*

Geändert von Ben (06.03.2006 um 09:37 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 10:14 Nach oben    #7
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Ähm... nö. Wenn in dem ComboBoxListModel nur die Class-Objekte von "richtigen" Klassen sind, dann nicht...

Dadurch wird die Zeile der Tabelle hinzugefügt (das View, d.h. die JTable, weiß dadurch, dass sich das Model geändert hat).

Wenn der Button gedrückt wird, machst du folgendes:
Code:
tableModel.addClass(((Class)barricadeChooser.getSelectedItem()).newInstance());
Das Model musst du etwas anpassen:

Code:
public class BarricadeTableModel extends AbstractTableModel {
    private List data;

    public BarricadeTableModel() {
        data = new ArrayList();
    }

    public String getColumnName(int col) {
        switch(col) {
            case 0: return "Name";
            case 1: return "Farbe";
            case 2: return "Größe";
        }
    }

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

    public int getColumnCount() { return 3; }

    public Object getValueAt(int row, int col) {
        Barricade bar = (Barricade)data.get(row);
        switch(col) {
            case 0: return bar.getDisplayString();
            case 1: return bar.getColor();
            case 2: return bar.getSize();
        }
        return null;
    }

    public boolean isCellEditable(int row, int col) { return col != 1; /* alle außer der ersten sind editierbar */ }
    public void setValueAt(Object value, int row, int col) {
        Barricade bar = (Barricade)data.get(row);
        if(col == 1) bar.setColor((Color)value);
        else if(col == 2) bar.setSize((Integer)value);
    }
    
    public void add(Barricade bar) {
        data.add(bar);
        fireTableRowsInserted(data.size(), data.size());
    }
}
Ich schreib nachher noch nen Text dazu... erstmal frühstücken...
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 10:39 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Jou, dank Dir .
Ich habe noch gar nicht alle Änderungen durchgeführt, aber Fakt ist, dass er mir diese Zeilen hier nicht durchgehen lässt
Java Code:
  1. buttonAddBarricade.addActionListener(new ActionListener() {
  2.     public void actionPerformed(ActionEvent event) {
  3.          try {
  4.               tableModel.addBarricadeToTable(((Class)barricadeChooser.getSelectedItem()).getInstance());
  5.          }
  6.          catch(InstantiationException ex) {
  7.               ex.printStackTrace();
  8.          }
  9.          catch(IllegalAccessException ex) {
  10.               ex.printStackTrace();
  11.          }
  12.     }
  13. });
Meldung ist
[code]The method getInstance() is undefined for type Class.[/quote]
was ja auch stimmt.

Problem ist halt nur .. wie gesagt .. wenn ich da noch ein Barricade reinfriemel erhalte ich die Exception aufgrund des Interfaces .

Das mit der Tabelle sieht aber logisch aus. Danke natürlich dafür .

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 10:48 Nach oben    #9
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Nicht "getInstance", sondern "newInstance".

In der ComboBox sind doch Class-Objekte vom Typ "BorderBarricade" u.ä., oder? Dann ist das absolut kein Problem. Du darfst nur nicht "Barricade.class" oder ne abstrakte Klasse da reinstecken.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 11:04 Nach oben    #10
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Zitat:
Zitat von pago
Nicht "getInstance", sondern "newInstance".
Ah. ... *Augen reib* *gähn* .. *jammjamm*. Okay.

Wenn ich das dann so mache erhalte ich wieder die InstantiationException.
Vor der gewissen Zeile habe ich mal ein
Code:
System.out.println((Class)barricadeChooser.getSelectedItem());
eingefügt. Da kommt dann - in meinem Fall - "class RectangleBarricade" raus.

In der Meldung steht noch
Code:
...
at java.lang.Class.newInstance(Unknown Source)
falls das weiterhelfen sollte.

Zitat:
Zitat von pago
In der ComboBox sind doch Class-Objekte vom Typ "BorderBarricade" u.ä., oder?
Jou. Da sind RectangleBarricade und TriangleBarricade drin. Die entsprechende Codezeile zum Einfügen findet man etwas weiter oben.

Zitat:
Zitat von pago
Du darfst nur nicht "Barricade.class" oder ne abstrakte Klasse da reinstecken.
Habsch auch nicht.

*grübel*
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 11:40 Nach oben    #11
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Tust mir den Gefallen und postet den Anfang des StackTraces?

RectangleBarricade ist eine "richtige" Klasse, oder? Also weder ein Interface noch abstract?
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 11:47 Nach oben    #12
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Juppi. Ich geb Dir mal eine Implementierung des Interfaces Barricade.

Die Klasse "TriangleBarricade"
PHP-Code:
import java.awt.Color;
import java.awt.Polygon;

public class 
TriangleBarricade extends Polygon 
                            
implements BarricadeBumper {
    

    
    private 
Color color = new Color(255255255);
    private 
String displayName  "Dreieck"
                   
colorName    "schwarz";
    private 
Float acceleration = new Float(2.0f);
    
    
    public 
TriangleBarricade(Ball ball) {
    }
    
    
    public 
void determineNewDirection() {
    }
    
    public 
String getDisplayName() {
        return 
this.displayName;
    }
    
    
    public 
void setColor(Color color) {
        
this.color color;
    }
    
    public 
Color getColor() {
        return 
this.color;
    }

    public 
String getColorName() {
        return 
this.colorName;
    }
    
    public 
Float getAcceleration() {
        return 
this.acceleration;
    }    


und der Konstruktor der Klasse ConfigurationPanel
PHP-Code:
    public ConfigurationPanel(FlipperPanel flipperPanel) {
        
super(new GridBagLayout());
        
        
this.= new EGBConstraints();
        
this.c.installRowGap(this
                             
"pref, 5, pref, 10, pref, 5, pref, 5, pref, 5, pref, 5, pref");
        
        
/*
         * ComboBox
         */
        
final JComboBox barricadeChooser = new JComboBox();
        
barricadeChooser.addItem(RectangleBarricade.class);
        
barricadeChooser.addItem(TriangleBarricade.class);
        
        
BarricadeComboBoxRenderer renderer = new BarricadeComboBoxRenderer();
        
        
renderer.setPreferredSize(new Dimension(23050));
        
barricadeChooser.setRenderer(renderer);
        
barricadeChooser.setMaximumRowCount(5);
        
        
add(barricadeChooserthis.c.xy(1,1"anchor: page_start"));  
        
        
        
/*
         * Label über der Tabelle
         */
        
add(new JLabel("anzuzeigende Hindernisse"), this.c.xy(1,5));
        
        
/*
         * Tabelle zur Anzeige der Hindernisse
         */        
        
JTable table = new JTable(this.tableModel);   
        
table.setPreferredScrollableViewportSize(new Dimension(230300));
        
JScrollPane scrollPane = new JScrollPane(table);
        
add(scrollPanethis.c.xy(1,7));          
        
        
/*
         * Add-Button
         */
        
JButton buttonAddBarricade = new JButton("Hindernis hinzufügen");
        
buttonAddBarricade.setEnabled(true);

                
        
/*
         * Listener für Add-Button
         */
        
buttonAddBarricade.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent event) {
                
                try {   
                    
System.out.println((Class)barricadeChooser.getSelectedItem());
                    
tableModel.addBarricadeToTable(((Class)barricadeChooser.getSelectedItem()).newInstance());                 
                } catch(
InstantiationException ex) {
                    
ex.printStackTrace();
                } catch(
IllegalAccessException ex) {
                    
ex.printStackTrace();
                }
            }
        });
        
        
add(buttonAddBarricadethis.c.xy(1,3));  
        

        
// "weiter zum Spiel"-Button
        
this.next = new JButton("weiter");
        
add(nextthis.c.xy(1,13));
    } 
Letztlich der Output (inklusive der Testausgabe von (Class)barricadeChooser.getSelectedItem())
Code:
class RectangleBarricade

java.lang.InstantiationException: RectangleBarricade
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at ConfigurationPanel$1.actionPerformed(ConfigurationPanel.java:94)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Hoffe, dass das hilft .
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 11:59 Nach oben    #13
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Ne... komm ich nicht klar mit. Macht absolut keinen Sinn...

Code:
public class DynamicInstantiation {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Blubb blubb = Blabb.class.newInstance();
		blubb.doSomething();
	}
	
	public static interface Blubb {
		void doSomething();
	}
	
	public static class Blabb implements Blubb {
		public void doSomething() {
			System.out.println("Printing something!");
		}
	}
}
Klappt bei mir einwandfrei... und was anderes machst du auch nicht.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.03.2006, 13:07 Nach oben    #14
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Wenn ich genau diesen Quelltext abtipper, dann melde mir Eclipse beim Objekt blubb
Code:
Type mismatch: cannot convert from Object too DemoStart.Blubb
DemoStart ist die Klasse "DynamicInstantiation". Sonst ist alles gleich .. :-/

Verdammt. Mit NetBeans 4.0 (hab hier lokal an der FH gerade nix Anderes) läuft das. WT