Guten Morgen,
ich habe in meiner GUI mehrere JTable, welche ich über ActionListener mit Daten aus ArrayListen fülle. Bei einem Table habe ich es ganz gut hinbekomme:
Und das zweite TableModel:
Hier auszüge aus meiner Klasse Benutzeroberfläche:
[Java]
public Benutzeroberflaeche() throws InterruptedException {
final Rohrnetz rohrnetz = new Rohrnetz();
final SchaechteTableModel model = new SchaechteTableModel(); //neues SchaechteTableModel
final HaltungenTableModel model2 = new HaltungenTableModel(); //neuesHaltungenTableModel
[...]
//table ist im scrollPane, das verwendete model ist SchaechteTableModel, das ist der "funktionierende" Table
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 175, 335, 100);
panel.add(scrollPane);
table = new JTable(model);
scrollPane.setViewportView(table);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setEnabled(false); //wird auf true gesetzt, durch eine Methode im aktionListener, funktioniert, hier liegt nicht das Problem, ich habe die Methode ausgelassen.
scrollPane_1.setBounds(10, 145, 335, 100);
panel_1.add(scrollPane_1);
table_1 = new JTable(model2); //hier wird model2 verwendet
table_1.setEnabled(false);
scrollPane_1.setViewportView(table_1);
[...]
[...]
[...]
JButton btnNewButton_1 = new JButton("Schacht erzeugen");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
schachthinzufuegen();
model.addSchacht(rohrnetz.getSchaechte().get(model.getRowCount()));
private void schachthinzufuegen() {
double xKoordinate;
double yKoordinate;
double zKoordinate;
double tiefe;
double durchmesser;
double volumenstrom;
//Hier wird sich auf den Inhalt von Textfeldern auf der Benutzeroberläche bezogen.
xKoordinate = Double.parseDouble(textField.getText());
yKoordinate = Double.parseDouble(textField_1.getText());
zKoordinate = Double.parseDouble(textField_2.getText());
tiefe = Double.parseDouble(textField_3.getText());
durchmesser = Double.parseDouble(textField_4.getText());
volumenstrom = Double.parseDouble(textField_5.getText());
Schacht neuerSchacht = new Schacht(0, 0, 0, 0, 0, 0);
neuerSchacht.setxKoordinate(xKoordinate);
neuerSchacht.setyKoordinate(yKoordinate);
neuerSchacht.setzKoordinate(zKoordinate);
neuerSchacht.setTiefe(tiefe);
neuerSchacht.setDurchmesser(durchmesser);
neuerSchacht.setZulaufmenge(volumenstrom);
//Beim betätigen des Buttons, wird ein neues Objekt der ArrayList schaechte zugefügt.
rohrnetz.getSchaechte().add(neuerSchacht);
}
});
[...]
JButton btnHaltungErzeugen = new JButton("Haltung erzeugen");
btnHaltungErzeugen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
haltungerzeugen();
model2.addHaltung(rohrnetz.getHaltungen().get(model2.getRowCount()));
}
private void haltungerzeugen() {
//hier wird wie bei dem anderen Aktionlistener die ArrayList haltungen mit Objekten gefüllt. Haltung (int anfangsschacht, in endschacht, double durchmesser){
//die Daten werden mit Comboboxen übergeben. Ich habe mit System.out.print() überprüft, ob der ArrayList neue Objekte zugefügt werden und dem ist auch so.
int anfangsschacht;
int endschacht;
double durchmesser;
endschacht = endcombobox.getSelectedIndex();
anfangsschacht = anfangscombobox.getSelectedIndex();
durchmesser = Double.parseDouble(textField_6.getText());
if (anfangsschacht==endschacht)
{
JOptionPane.showMessageDialog(null, "Endschacht kann nicht gleich dem Anfangsschacht sein!");
}
else
{
Haltung neueHaltung = new Haltung(0,0,0);
neueHaltung.setAnfangsschacht(anfangsschacht);
neueHaltung.setEndschacht(endschacht);
neueHaltung.setDurchmesser(durchmesser);
rohrnetz.getHaltungen().add(neueHaltung);
}
}});
btnHaltungErzeugen.setEnabled(false);
btnHaltungErzeugen.setBounds(10, 371, 158, 23);
panel_1.add(btnHaltungErzeugen);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Benutzeroberflaeche frame = new Benutzeroberflaeche();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
[/Java]
Die Berechnungsklasse:
[Java]
public class Berechnungsklasse {
}
public static double berechneGefaelle(ArrayList<Haltung> haltungen,ArrayList<Schacht> schaechte, int nummer){
Haltung haltung =haltungen.get(nummer);
int anfangsnummer = haltung.getAnfangschacht();
int endnummer = haltung.getEndschacht();
Schacht anfangsschacht = Rohrnetz.getSchaechte().get(anfangsnummer); // Hier ist
//Der zweite verweis auf die leereListe, wenn ich den Button betätige. Ich schließe aus, dass es
//an den Indices liegt. Ich habe sehr sehr viel rumprobiert und ich bekomme selbst bei einer
//IndexOutOfBoundsException die size nicht größer als 0.
Schacht endschacht = schaechte.get(endnummer);
double anfangs_tiefe = anfangsschacht.getTiefe();
double end_tiefe = endschacht.getTiefe();
double anfangs_X_koordinate = anfangsschacht.getxKoordinate();
double end_X_koordinate = endschacht.getxKoordinate();
double anfangs_Y_koordinate = anfangsschacht.getyKoordinate();
double end_Y_koodinate = endschacht.getyKoordinate();
double anfangs_Z_koordinate = anfangsschacht.getzKoordinate();
double end_Z_koordinate = endschacht.getzKoordinate();
double X_differenz = anfangs_X_koordinate - end_X_koordinate;
double Y_differenz = anfangs_Y_koordinate - end_Y_koodinate;
double Z_differenz = anfangs_Z_koordinate - anfangs_tiefe
- (end_Z_koordinate - end_tiefe);
double absolutZ_differenz = Math.abs(Z_differenz);
double distanz = Math.sqrt(Math.pow(X_differenz, 2)
+ Math.pow(Y_differenz, 2) + Math.pow(Z_differenz, 2));
double gefaelle = (absolutZ_differenz / distanz) * 100;
return gefaelle;
}
}[/code]
Das ergebnis einer Methode in einem case wiederzugeben funktioniert für mein SchaechteTableModel, wenn ich in der Methode nur auf schaechte zugreife, z.B.
[Java]
public static double gibkoordinate(ArrayList<Schacht> schaechte,int nummer) {
Schacht schacht = schaechte.get(nummer);
double koordinate = schacht.getxKoordinate();
return koordinate;[/code]
dann funktioniert es.
Genauso auch bei HaltungenTableModel für Methoden die auf haltungen zugreife.
Wenn ich auf beides zugreifen will, klappt es nicht.
Ich muss allerdings auf beides zugreifen können, wenn ich die Berechnung so realisieren will, wie ich es mir vorstelle.
Es wäre echt nett, wenn ihr mir helfen könntet, sitze jetzt schon echt lange an diesem Problem und ich dreh mich nur im Kreis.
Viele Grüße
ich habe in meiner GUI mehrere JTable, welche ich über ActionListener mit Daten aus ArrayListen fülle. Bei einem Table habe ich es ganz gut hinbekomme:
Java:
package rohrnetz;
import java.util.ArrayList;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class SchaechteTableModel implements TableModel {
ArrayList<Schacht> schaechte= new ArrayList<Schacht>();
private ArrayList<TableModelListener> listeners = new ArrayList<TableModelListener>();
// Ich muss ehrlich gestehen, dass ich diese Methode nur halb verstehe, sie ist glaube ich dazu dazu da, einen Schacht zum Table hinzuzufügen
public void addSchacht(Schacht schacht) {
int index = schaechte.size();
schaechte.add(schacht);
// Hier werden glaube ich die listener benachrichtigt, wenn sich was im Table ändert. Ich habe es so verstanden, dass das TableModelEvent ist, wenn dem Table Zeilen //eines bestimmten Indeces zugefügt werden.
TableModelEvent e = new TableModelEvent(this, index, index,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
// ich glaub hier werden die listeners benachrichtigt, weiß aber nicht wer diese für das TableModelEvent sind
for (int i = 0, n = listeners.size(); i < n; i++) {
((TableModelListener) listeners.get(i)).tableChanged(e);
}
}
// Die Anzahl der Zeilen ist immer so groß wie die größe der ArrayList schaechte
public int getRowCount() {
return schaechte.size();
}
public int getColumnCount() {
return 4;
}
//Benennt die Spalten
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Nr.";
case 1:
return "Tiefe";
case 2:
return "Durchmesser";
case 3:
return "Volumenstrom";
default:
return null;
}
}
//gibt den Spalten Typen
public Class<?> getColumnClass(int columnIndex)
{
switch (columnIndex)
{
case 0:
return Integer.class;
case 1:
return Double.class;
case 2:
return Double.class;
case 3:
return Double.class;
default:
return null;
}
}
//Table ist nicht editierbar
public boolean isCellEditable (int rowIndex, int columnIndex)
{
return false;
}
public Object getValueAt(int rowIndex,int columnIndex)
{
Schacht schacht = schaechte.get(rowIndex);
switch (columnIndex)
{
case 0:
return rowIndex+1; //1. Spalte nummerierung
case 1:
return schacht.getTiefe(); //2. Spalte Tiefe des jeweiligen Schachtes. Getter der Klasse Schacht
case 2:
return schacht.getDurchmesser(); //3. Der Durchmesser. Getter der Klasse Schacht
case 3:
return schacht.getZulaufmenge(); //3. Zulaufmenge. Getter der Klasse Schacht
default:
return null;
}
}
public void addTableModelListener(TableModelListener l)
{
listeners.add(l);
}
public void removeTableModelListener(TableModelListener l)
{
listeners.remove(l);
}
}
Und das zweite TableModel:
Java:
//Ich habe versucht es so zu machen wie beim ersten Table.
public class HaltungenTableModel implements TableModel {
ArrayList<Haltung> haltungen = new ArrayList<Haltung>();
ArrayList<Schacht> schaechte; //hier habe ich nicht new ArrayList verwendet, weil ich ja //die bereits existierende verwenden möchte. Beides hilft nicht
private ArrayList<TableModelListener> listeners = new ArrayList<TableModelListener>();
public void addHaltung(Haltung haltung) {
int index = haltungen.size();
haltungen.add(haltung);
TableModelEvent e = new TableModelEvent(this, index, index,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
for (int i = 0, n = listeners.size(); i < n; i++) {
((TableModelListener) listeners.get(i)).tableChanged(e);
}
}
// alles ähnlich wie beim anderen tabel
public int getRowCount() {
return haltungen.size();
}
public int getColumnCount() {
return 4;
}
// Die Namen
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Anfangsschacht";
case 1:
return "Endschacht";
case 2:
return "Gefälle";
case 3:
return "Durchmesser";
default:
return null;
}
}
// Die Typen
public Class<?> getColumnClass(int columnIndex)
{
switch (columnIndex) {
case 0:
return Integer.class;
case 1:
return Integer.class;
case 2:
return Double.class;
case 3:
return Double.class;
default:
return null;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
// Hier liegt der unterschied und das Problem. Ich möchte in der 3. Spalte eine Methode //aufrufen, welche sowohl auf schaechte, als auch auf haltungen zugreift. Die Methode habe ich //in
// einer Klasse Berechnungsklasse geschrieben
public Object getValueAt(int rowIndex, int columnIndex) {
Haltung haltung = haltungen.get(rowIndex);
switch (columnIndex) {
case 0:
return haltung.getAnfangschacht() + 1;
case 1:
return haltung.getEndschacht() + 1;
case 2:
//Hier ist immer der verweis auf eine NullPointerException oder auf //java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
// Ich glaube, dass das daran liegt, dass diese Klasse nicht die gefüllte ArrayList schaechte
// kennt
return Berechnungsklasse.berechneGefaelle(haltungen, schaechte, rowIndex);
case 3:
return haltung.getDurchmesser();
default:
return null;
}
}
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
}
Hier auszüge aus meiner Klasse Benutzeroberfläche:
[Java]
public Benutzeroberflaeche() throws InterruptedException {
final Rohrnetz rohrnetz = new Rohrnetz();
final SchaechteTableModel model = new SchaechteTableModel(); //neues SchaechteTableModel
final HaltungenTableModel model2 = new HaltungenTableModel(); //neuesHaltungenTableModel
[...]
//table ist im scrollPane, das verwendete model ist SchaechteTableModel, das ist der "funktionierende" Table
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 175, 335, 100);
panel.add(scrollPane);
table = new JTable(model);
scrollPane.setViewportView(table);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setEnabled(false); //wird auf true gesetzt, durch eine Methode im aktionListener, funktioniert, hier liegt nicht das Problem, ich habe die Methode ausgelassen.
scrollPane_1.setBounds(10, 145, 335, 100);
panel_1.add(scrollPane_1);
table_1 = new JTable(model2); //hier wird model2 verwendet
table_1.setEnabled(false);
scrollPane_1.setViewportView(table_1);
[...]
[...]
[...]
JButton btnNewButton_1 = new JButton("Schacht erzeugen");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
schachthinzufuegen();
model.addSchacht(rohrnetz.getSchaechte().get(model.getRowCount()));
private void schachthinzufuegen() {
double xKoordinate;
double yKoordinate;
double zKoordinate;
double tiefe;
double durchmesser;
double volumenstrom;
//Hier wird sich auf den Inhalt von Textfeldern auf der Benutzeroberläche bezogen.
xKoordinate = Double.parseDouble(textField.getText());
yKoordinate = Double.parseDouble(textField_1.getText());
zKoordinate = Double.parseDouble(textField_2.getText());
tiefe = Double.parseDouble(textField_3.getText());
durchmesser = Double.parseDouble(textField_4.getText());
volumenstrom = Double.parseDouble(textField_5.getText());
Schacht neuerSchacht = new Schacht(0, 0, 0, 0, 0, 0);
neuerSchacht.setxKoordinate(xKoordinate);
neuerSchacht.setyKoordinate(yKoordinate);
neuerSchacht.setzKoordinate(zKoordinate);
neuerSchacht.setTiefe(tiefe);
neuerSchacht.setDurchmesser(durchmesser);
neuerSchacht.setZulaufmenge(volumenstrom);
//Beim betätigen des Buttons, wird ein neues Objekt der ArrayList schaechte zugefügt.
rohrnetz.getSchaechte().add(neuerSchacht);
}
});
[...]
JButton btnHaltungErzeugen = new JButton("Haltung erzeugen");
btnHaltungErzeugen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
haltungerzeugen();
model2.addHaltung(rohrnetz.getHaltungen().get(model2.getRowCount()));
}
private void haltungerzeugen() {
//hier wird wie bei dem anderen Aktionlistener die ArrayList haltungen mit Objekten gefüllt. Haltung (int anfangsschacht, in endschacht, double durchmesser){
//die Daten werden mit Comboboxen übergeben. Ich habe mit System.out.print() überprüft, ob der ArrayList neue Objekte zugefügt werden und dem ist auch so.
int anfangsschacht;
int endschacht;
double durchmesser;
endschacht = endcombobox.getSelectedIndex();
anfangsschacht = anfangscombobox.getSelectedIndex();
durchmesser = Double.parseDouble(textField_6.getText());
if (anfangsschacht==endschacht)
{
JOptionPane.showMessageDialog(null, "Endschacht kann nicht gleich dem Anfangsschacht sein!");
}
else
{
Haltung neueHaltung = new Haltung(0,0,0);
neueHaltung.setAnfangsschacht(anfangsschacht);
neueHaltung.setEndschacht(endschacht);
neueHaltung.setDurchmesser(durchmesser);
rohrnetz.getHaltungen().add(neueHaltung);
}
}});
btnHaltungErzeugen.setEnabled(false);
btnHaltungErzeugen.setBounds(10, 371, 158, 23);
panel_1.add(btnHaltungErzeugen);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Benutzeroberflaeche frame = new Benutzeroberflaeche();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
[/Java]
Die Berechnungsklasse:
[Java]
public class Berechnungsklasse {
}
public static double berechneGefaelle(ArrayList<Haltung> haltungen,ArrayList<Schacht> schaechte, int nummer){
Haltung haltung =haltungen.get(nummer);
int anfangsnummer = haltung.getAnfangschacht();
int endnummer = haltung.getEndschacht();
Schacht anfangsschacht = Rohrnetz.getSchaechte().get(anfangsnummer); // Hier ist
//Der zweite verweis auf die leereListe, wenn ich den Button betätige. Ich schließe aus, dass es
//an den Indices liegt. Ich habe sehr sehr viel rumprobiert und ich bekomme selbst bei einer
//IndexOutOfBoundsException die size nicht größer als 0.
Schacht endschacht = schaechte.get(endnummer);
double anfangs_tiefe = anfangsschacht.getTiefe();
double end_tiefe = endschacht.getTiefe();
double anfangs_X_koordinate = anfangsschacht.getxKoordinate();
double end_X_koordinate = endschacht.getxKoordinate();
double anfangs_Y_koordinate = anfangsschacht.getyKoordinate();
double end_Y_koodinate = endschacht.getyKoordinate();
double anfangs_Z_koordinate = anfangsschacht.getzKoordinate();
double end_Z_koordinate = endschacht.getzKoordinate();
double X_differenz = anfangs_X_koordinate - end_X_koordinate;
double Y_differenz = anfangs_Y_koordinate - end_Y_koodinate;
double Z_differenz = anfangs_Z_koordinate - anfangs_tiefe
- (end_Z_koordinate - end_tiefe);
double absolutZ_differenz = Math.abs(Z_differenz);
double distanz = Math.sqrt(Math.pow(X_differenz, 2)
+ Math.pow(Y_differenz, 2) + Math.pow(Z_differenz, 2));
double gefaelle = (absolutZ_differenz / distanz) * 100;
return gefaelle;
}
}[/code]
Das ergebnis einer Methode in einem case wiederzugeben funktioniert für mein SchaechteTableModel, wenn ich in der Methode nur auf schaechte zugreife, z.B.
[Java]
public static double gibkoordinate(ArrayList<Schacht> schaechte,int nummer) {
Schacht schacht = schaechte.get(nummer);
double koordinate = schacht.getxKoordinate();
return koordinate;[/code]
dann funktioniert es.
Genauso auch bei HaltungenTableModel für Methoden die auf haltungen zugreife.
Wenn ich auf beides zugreifen will, klappt es nicht.
Ich muss allerdings auf beides zugreifen können, wenn ich die Berechnung so realisieren will, wie ich es mir vorstelle.
Es wäre echt nett, wenn ihr mir helfen könntet, sitze jetzt schon echt lange an diesem Problem und ich dreh mich nur im Kreis.
Viele Grüße