JTable, DefaultTableModel, zwei Zahlen multiplizieren.

IlikeJava

Mitglied
Hallo,

ich (Java-Anfänger) möchte JTable benutzen, um zwei Zahlen (als zwei Zellen ) zu multiplizieren und das Resultat in einer anderen Zelle auszugeben, indem ich auf den Button "calc" klicke.
Mein Programm liefert jeoch errors. Warum?

[CODE lang="java" title="Multiplikation"]import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Multiplication{
public static void main( String[] args ){

String[] titles = new String[]{ "Number1", "Number2", "Result"};

final DefaultTableModel model = new DefaultTableModel( titles, 1 );


JTable table = new JTable( model );


final JButton calc = new JButton( "calc" );








JFrame frame = new JFrame( "Multiplication" );

Container content = frame.getContentPane();

content.add( new JScrollPane( table ), BorderLayout.CENTER );
content.add( calc, BorderLayout.NORTH );


frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.pack();
frame.setVisible( true );

calc.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
int a=(Integer) model.getValueAt( 0, 0);
int b =(Integer) model.getValueAt( 0, 1);
int c=a*b;
table.setValueAt(c, 0, 2);



}
});

}
}







[/CODE]
 
Zuletzt bearbeitet:
Du solltest uns auch mitteilen, was für einen Error du bekommst, nämlich
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Du kannst nicht einfach einen String zu einem int (oder Integer) casten, wie du es versuchst in
Java:
int a=(Integer)model.getValueAt( 0, 0);
Du musst sattdessen Integer.parseInt(String s) aufrufen.
 
Ich bekomme nur errors, wenn ich auf button "calc" klicke, sonst keine.


Die errors sind (den von dir angegebenen error finde ich dort nicht):

xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Multiplication$1.actionPerformed(Multiplication.java:47)
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.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(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)
 
Ich führe das Programm aus. Dann erscheint das Fenster "Multiplication" und in der Konsole wird
null
null

angezeigt.
Dann gebe ich im Fenster zwei Zahlen per Tastatur ein und klicke auf "calc" , wonach die errors erscheinen.
 
Wann gibst du die Werte aus?
Du sollst schreiben:
Java:
        calc.addActionListener( new ActionListener(){
            public void actionPerformed(ActionEvent e) {
               System.out.println(model.getValueAt(0, 0));
               System.out.println(model.getValueAt(0, 1));
 
Es ist tatsächlich vom Typ String; probiere doch einmal:
Java:
int a = Integer.parseInt((String)model.getValueAt(0, 0));
 
Sehr schön!

Nun hast du nur noch das Problem, dass du damit umgehen musst, dass der Benutzer deines Programms falsche (oder keine) Eingaben macht.
Und die Frage ist auch, ob du wirklich eine Tabelle mit nur einer Zeile für die Eingaben und die Ausgabe nutzen willst (eine Tabelle mit nur einer Zeile ist eigentlich sinnlos).

EDIT: Oder noch allgemeiner gesagt: Am besten trennst du die "Oberfläche" von der "Logik". Auch wenn die "Logik" hier nur daraus besteht, zwei Zahlen miteinander zu multiplizieren, gehört sie eigentlich nicht in die "Oberfläche".
 
Zuletzt bearbeitet:
Eigentlich möchte ich ein komplexeres Programm schreiben. Jedoch , solange man keine einfache Programme schreiben kann, wird es wahrscheinlich mit komplexeren schwierig...
Das "Multiplikation"-Programm ist quasi ein Testprogramm für mich, ob ich mit den Begriffen JTable, DefaultTableModel schon auf einer einfacheren Ebene umgehen kann.
 
Dann ist doch der nächste Schritt, eine Klasse "Multiplikation" zu schreiben, die die "komplizierte Logik" ausführt.
Und es ist die Frage, an welcher Stelle man Fehleingaben des Benutzers abfangen will (der Benutzer gibt nicht "3" sondern "xyz" in ein Tabellenfeld ein).
 
Ich möchte eigentlich eine Art Astrologie-Programm schreiben, was kaum etwas nur mit Multiplikation zu tun hat 🙂 (Jedoch , es werden dort schon mathematische Rechenoperationen wie +, -,*,/ stattfinden) .
Dabei möchte ich JTable benutzen.
Die Tabelle besteht aus 6 Spalten und unbestimmter Anzahl von Zeilen (d.h die Anzahl von Zeilen hängt davon ab, wieviele Planeten ich aufnehmen möchte).
In den ersten 5 Spalten wird Input stehen und in der 6 Spalte Output.
Nachdem man Input eingegeben hat, sollte per Klick auf ein Button die 6 Spalte Output (für jede Zeile) liefern.

Das Prinzip vom "Multiplikationsprogramm" ist dasselbe: Man hat Input , Output und ein Button.


Klar ist, daß man Falscheingaben berücksichtigen soll. Das wäre dann das nächste Level der Implementierung .
Ich gehe erstmal davon aus, daß keine falschen Angaben passieren werden, um das ganze Problem zuerst mal einfacher zu halten.
 
Zuletzt bearbeitet:
Hallo,
Screenshot (22).png
ich habe in der Zeit das Programm schon geschrieben. Nun möchte ich eine Ergänzung zum Programm schreiben (Die Ergänzung besteht aus der Möglichkeit per Klick auf Button, Bild zu öffnen).

Konkret geht es um folgendes Problem(siehe Bild) : Die letzte Spalte besteht aus JButtons.
Ich mache Input in die ersten 4 Spalten.
In der 5 Spalte werden dann, nach dem Drücken von "calculate"-Button (ganz unten), Zahlen erscheinen .
Nun , abhängig davon, was in der jeweiligen Zeile bzgl. der 4 und 5 Spalte steht, soll der JButton in der jeweiligen Zeile (und 6 Spalte) per actionListener etwas "machen" . Genauer: wenn z.B in der Zeile 1 , Spalte 4 und 5 zwei Zahlen 11 und 5 stehen, dann soll der JButton in Zeile 1 und Spalte 6 folgendes machen: Beim Klick darauf öffnet sich ein neues Fenster mit einem Bild Namens " 11,5" .

Mir ist aber nicht klar, wie ich auf ein bestimmtes JButton zugreifen kann.
 
Zuletzt bearbeitet:
Ich habe es nicht verstanden, wie dort auf Buttons zugegriffen wird. Über e.getSource und e.getActionCommand?

Nebenbei habe ich mir überlegt, Buttons außerhalb von jtable zu platzieren, dann wäre Zugriff einfacher.
Jedoch , ich würde versuchen , es innerhalb von JTable zu machen.
 
Wozu sind die Buttons überhaupt nützlich? Wenn in eine Zelle etwas eingegeben wurde, dann kann der neue Wert doch auch sofort errechnet und in einer anderen Zelle angezeigt werden. Ein Button ist dafür nicht notwendig.
 
Ich habe geschrieben, daß per Button ein Bild in einem neuen Fenster geöffnet werden soll. Es gibt 360 Bilder, und es wird dasjenige Bild geöffnet, das den errechneten Werten entspricht.
 
Ich würde EINEN Button außerhalb der Tabelle erstellen, der dann auf die markierte Zeile zugreift.
Buttons in den Zeilen sind ziemlich mühsam.

Erstelle auf keinen Fall einen eigenen eigenen JButton pro Zeile, der Button darf nicht Teil der Daten sein.

Was du brauchst, ist erst mal ein CellRenderer, der dir einen Button anzeigt (dieser hat keine Logik, wird nur für die grafische Darstellung des Buttons verwendet)
Jetzt gibt's verschiedene Varianten, wie du auf Eingabe reagierst.
In einem MouseListener könntest du z.B. auswerten, ob auf eine Spalte mit einem Button geklickt wurde und dann dein Bild für die entsprechende Zeile anzeigen lassen.
Eine Alternative wäre ein TableCellEditor für diese Spalte, der dann bei Aktivierung das Bild anzeigen lässt.

Im schlimmsten Fall hast du 2 Button-Objekte (es geht auch mit einem), egal wie viele Zeilen deine Tabelle hat.
 
Ich dachte, wenn man es mit den Buttons außerhalb der Tabelle macht , dann wird es ähnlich dem Button "calculate" ( der auch außerhalb von der Tabelle platziert ist). Beim "calculate" habe ich keine Renderer oder Editoren gebraucht.
Ich dachte eigentlich an folgende Implementierung von den Buttons :
Jedem Button füge ich ActionListener hinzu und in der actionPerformedMethode würde ( für den Fall bzgl. erster Zeile) stehen: model.getValueAt(0,3) und model.getValueAt(0,4).Und die beiden Werte würden die Stelle im Array ( Inhalt vom Array sind die Bilder) liefern, wo das gewünschte Bild abgespeichert ist.
Ich muss nur wissen welcher Button zu welcher Zeile gehört. Man könnte z.B die Buttons nummerieren und die Zeilen auch.
Zumindest hört sich es für mich ziemlich einfach an (ist aber wahrscheinlich nicht so qualitativ/bequem/effizient).

Aber du meinst wahrscheinlich, ich soll nicht zuviele Buttons machen. Ich wollte eigentlich ca. 20 Stück machen. Ist nicht schön, aber endlich soll das Ding funktionieren ! 🙂

Ich habe nicht verstanden, wie du es mit nur einem Button meinst: "... ob auf eine Spalte mit einem Button geklickt wurde..."
 
Zuletzt bearbeitet:
Richtig, wenn der Button sich nicht in der Tabelle befindet, sparst du dir das alles.

Kompliziert wird's erst, wenn sich die Buttons in der Tabelle befinden sollen. Wenn du fix 20 haben willst, dann musst du ja auch fix 20 Datensätze haben, hier fängt's schon an.

Jeder Tabellen-Event innerhalb der Tabelle weiß, welche Zeile und welche Spalte betroffen ist, da musst du nichts durchnumerieren.
Für einen Mausklick-Event gibt's Methoden, um anhand der Koordinaten auf der Tabelle bestimmen zu lassen, auf welche Zeile/Spalte geklickt wurde.
 

Neue Themen


Zurück
Oben