JTable durch ActionEvent befüllen

Hi,

ich bin Netbeans und Java neuling! Ich möchte meine JTable, die DB Daten beinhalten soll befüllen, wenn ein ActionEvent ausgeführt wird.
Mir kommt als Idee nur in der “startButtonActionPerformed” Methode die JTable zu erzeugen, aber dann müßte ich ja auf Netbeans tolle OberflächenEditor verzichten! D.H. die JTable zu fuss implementieren!
Gibts ne andere Möglichkeit die ?

http://www.java-forum.org/awt-swing-swt/85533-jtable-durch-actionevent-befuellen.html#post535354

dachte zweigleisig ist besser;)

Du musst doch die JTable nicht später erzeugen, nur weil die Daten erst später hinzukommen. Du kannst entweder das Modell der JTable setzen, wenn der Button geklickt wird, oder das bestehende Modell verändern. Beides funktioniert super. Hast Du schonmal dieses Tutorial durchgelesen? Sun Java™ Tutorials: How to Use Tables

Ebenius

Hi,

das Tutorial kenn ich!
ich weiß nicht recht wo ich dies machen soll? Etwas konkreter:
Nach dem kompilieren erscheint auf meiner MainWindow.jar dieser JTable und es soll dann über ein neues JDialog StartScenario.jar (mit dem entsprechenden Button) gestartet werden.
Das ist der Quelltext von meinem JTable in MainWindow.jar:


    mainTable.setModel(new javax.swing.table.DefaultTableModel(managerApp.getManagerAlg().getCalculateDuration().calDuration(),
        this.headerMain()) {
        public boolean isCellEditable(int row, int column)
        {
            return false;
        }
    } );

    mainTable.setName("mainTable"); // NOI18N

    jScrollPane1.setViewportView(mainTable);

Wie kann ich Ihm denn, wenn ich ein mainTable.setModel(bla) in StartScenario.jar erzeuge dieses wieder an MainWindow.jar übergeben?

Indem Du in die entsprechende Klasse aus MainWindow eine entsprechende Methode einbaust und diese dann aus der anderen Klasse aufrufst. Zum Beispiel eine setData(Object[][])-Methode oder eine setTableModel(TableModel)-Methode.

Ebenius

Hi,

ich hatte es auch bereits mit get und set Methoden ausprobiert, aber anscheinend mache ich etwas falsch?
In der Klasse CalculateDuration wird die Ausgabe für meine JTable in ein Object[][] gespeichert:

private AlgorithmManagement managerAlg;
private StartScenario startSce;
private Statement stmt;
private Connection con;
private String url = "jdbc:mysql://localhost:3306/";
private String user = "root";
private String pass = "";
private String driver = "com.mysql.jdbc.Driver";
private ResultSet res;
private String db = "modules";
private Object[][] list = null;

public Object[][] calDuration() {
        //Object[][] list = null; 
        
        for (int j = 0; j < managerAlg.getChoosedMod().size(); j++) {
            Object[] z = null;
            int listSize = 0;
            Date date;
            Date date2;
            try {
                Class.forName(driver);
                con = (Connection) DriverManager.getConnection(url + db  , user, pass);
                stmt = (Statement) con.createStatement();

                res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                     "TaskStart, " +
                                                     "TaskEnd, " +
                                                     "Piority, " + 
                                                     "TimeFrame " +
                                                     "FROM " +
                                                     managerAlg.getChoosedMod().elementAt(j) + " " +
                                                     "ORDER BY TaskStart ");
                while (res.next()) {
                    listSize++;
                }
                res.first();

                if (listSize > 0) {
                    list = new Object[listSize][4];
                    for (int i = 0; i < listSize; i++) {
                        date = res.getTime("TaskStart");
                        date2 = res.getTime("TaskEnd");
                        getList()**[0] = res.getString("TaskCommonDim");
                        getList()**[1] = (date2.getTime() - date.getTime())/60000;
                        getList()**[2] = res.getString("Piority");
                        getList()**[3] = res.getString("TimeFrame");

                        res.next();
                    }
                }
                con.close();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
            System.out.println(list);
        }
        return getList();
    }
    
    public void setList(Object[][] list) {
        this.list=list;
    }
    
    public Object[][] getList() {
        return list;
    }```

dieses wir dann in der Klasse mainWindow aufgerufen und angezeigt mit den entsprechenden Header für die JTable.
In der Klasse StartScenario ist ein Kleines Fenster, das über MainWindow gestartet wird und hier soll über den Button "Start" die Tabelle in MainWindow befüllt werden:

```private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
       readData();
       managerAlg.getCalculateDuration().setList(managerAlg.getCalculateDuration().getList()); 
       this.dispose();
                                           

    }```

In readData wird der name der Module ausgelesen und ist eigentlich nicht von belang!

Es wir mir ein NullPointerException bei:


```managerAlg.getCalculateDuration().setList(managerAlg.getCalculateDuration().getList());```
angezeigt!
Was mache ich falsch?
Danke im Voraus!

Wenn bei


managerAlg.getCalculateDuration().setList(managerAlg.getCalculateDuration().getList());

Eine NullPointerException auftritt, gibt es nur zwei Möglichkeiten:

  1. managerAlg ist null
  2. managerAlg.getCalculateDuration() liefert null
    Was der Fall ist kann man leicht durch

System.out.println("managerAlg "+managerAlg);
System.out.println("managerAlg.getCalculateDuration() "+managerAlg.getCalculateDuration());

vor der kritischen Zeile rausfinden.

Insgesamt hab’ ich das mit den JARs und so noch nicht ganz nachvollziehen können. Ganz allgemein: Was in welcher JAR liegt ist nicht relevant. Das entscheidende ist, wie die Klassen interagieren, und wer welche Instanz (welches Objekt) kennt und benutzt.

Hi,

Nun habe ich es anders versucht! Ich muss ja das Tablemodel dort erzeugen, wo mein StartButton ist und diesen dann an meinem Table übergeben.
Zu meiner Struktur:
Ich erzeuge zuerst WindowMain.java und dort wird durch StartScenarioButton StartScenario.java erzeugt.
Wenn ich jetzt in StartScenario.java das TableModel erzeuge und diesen in WindowMain einfüge bekomme ich immer die Meldug:

SCHWERWIEGEND: Application class application.Application failed to launch
java.lang.NullPointerException

in der Zeile: (dies befindet sich in WindowMain.java)


        mainPanel = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        mainTable = this.startSce.getNewTable() ; <- hier

Eigentlich ist es ja logisch, dass er mir die Exception rausgibt, da bis dahin StartScenario.java nicht erzeugt wurde!
Diese beiden Zeilen holen sich die Table und das Model aus StartScenario.java.

mainTable.setModel(this.startSce.getCreateTable() );```
Hier sind die beiden getMethoden, die sich in StartScenario.java befinden. Beiden werden durch den StartButton gestartet.
```public javax.swing.table.DefaultTableModel getCreateTable() {
        return new javax.swing.table.DefaultTableModel(managerApp.getManagerAlg().getCalculateDuration().calDuration(),
    managerApp.getWinMain().headerMain()) {
    public boolean isCellEditable(int row, int column)
        {
            return false;
        }
    };
  
    }
    
   public javax.swing.JTable getNewTable() {
    return  new javax.swing.JTable();
   }```

Wie kann ich Ihm sagen er solle diese Exception nicht beachten und weitermachen, damit ich den "verdammten:grr:" Startknopf betätige?
Ich dachte an die Throws-Anweisung, die ich wegen Netbeans nicht in die InitComponents() einfügen kann!
Ich bin langsam verzweifelt!!!!!!!!!!!

Klingt ein bißchen wirr. Jedenfalls sollte man NIE eine NullPointerException abfangen.

Ganz allgemein ist mir nicht klar, warum StartScenario eine neue JTable erstellen soll.

Wie auch immer. Damit man mal was hat, worüber man reden kann (…) hier ein Codeschnipsel - vielleicht kannst du den auf deinen Fall übertragen, oder genauer sagen, wo die Unterschiede liegen

// For http://forum.byte-welt.de/showthread.php?p=9373#post9373

import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;

public class MainWindowTest
{
    public static void main(String args[])
    {
        MainWindow mainWindow = new MainWindow();
        mainWindow.setVisible(true);

        StartScenario startScenario = new StartScenario();
        startScenario.setVisible(true);

        startScenario.setMainWindow(mainWindow);
    }
}


class MainWindow extends JFrame
{
    private JTable table;

    public MainWindow()
    {
        super("MainWindow");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
        setBounds(0,0,300,300);
    }

    public void setTableModel(TableModel tableModel)
    {
        table.setModel(tableModel);
    }

    private void initComponents()
    {
        table = new JTable();
        getContentPane().add(new JScrollPane(table));
    }
}


class StartScenario extends JFrame implements ActionListener
{
    private MainWindow mainWindow = null;

    public StartScenario()
    {
        super("StartScenario");
        JButton button = new JButton("Start");
        button.addActionListener(this);
        getContentPane().add(button);
        setBounds(300,0,300,300);
    }

    public void setMainWindow(MainWindow mainWindow)
    {
        this.mainWindow = mainWindow;
    }

    public void actionPerformed(ActionEvent e)
    {
        TableModel tableModel = new DefaultTableModel(new String[][]{{"A"}, {"B"}, {"C"}}, new String[]{"A", "B", "C"});
        mainWindow.setTableModel(tableModel);
    }



}

Vielen lieben Dank! Habs nach deinem vorbild gemacht und es funzt! Ich hatte das TableModel gar nicht richtig erstellt!:o

Ne Zusatz frage::o
Wie könnte man beim erneuten klick auf den startButton das ganze in einem Tab anzeigen?

Naja, so "Vorbild"lich war das eigentlich nicht. Normalerweise sollte man es vermeiden, so starke Verbindungen zwischen Klassen herzustellen wie jetzt zwischen MainWindow und dem StartDingens. Also, einfach eine Referenz per “set…” rüberzureichen ist ziemlich hemdsärmelig und sollte in diesem Beispiel nur dem Zweck dienen, deine Frage einzugrenzen - häufig gibt es da schönere Möglichkeiten.

Was heißt bei “erneutem” Klick “das ganze” in einem Tab anzeigen? Man könnte die JTable von vornherein in ein Tab legen…!?

Ich bin ein neuling - ich dachte immer get und set Methoden sei die schöne Variante!?
Wie würde man das ganze den schöner machen?
WindowMain und StartScenario sind ein JDialogs! Wie würde man denn die Verbindung anders herstellen?
Ich werde mal versuchen den JTable auf ein Tab zu legen!
Nur zu erklärung:
Ich rufe ja über WindowMain-Fenster das StartScenario-Fenster auf. Dort rufe ich über eine entsprechende Auswahl der ini Datei (beinhaltet: Tabellen Namen usw. für den Aufruf… erstmal unwichtig) und Betätigung des StartButtons den JTable. Deswegen möchte ich je nach Auswahl der ini-Datei Tabs haben, die JTables beinhaltet.

Naja, „schön“ ist ja nicht absolut. Es gibt ja auch noch „schöner“ und „am schönsten“ :smiley: Es kommt eben darauf an, wie stark die … „Inhaltliche“ Verbindung der beiden Klassen sowieso schon ist. Man KÖNNTE z.B. auch sagen:

  • man bietet im MainWindow eine Methode „getTable“ an
  • man macht diese Methode package-private
  • das StartDingens kriegt NUR eine JTable übergeben:

// Nicht mehr
//startScenario.setMainWindow(mainWindow);
// sondern
startScenario.setTargetTable(mainWindow.getTable());

damit würden die beiden sich nicht mehr direkt kennen (d.h. man könnte dem StartScenario an dieser Stelle ggf. auch irgendeine andere JTable geben, die NICHT im MainWindow liegt). Aber das kann auch andere Nachteile haben. Bevor man jetzt über solche over-engineerten Sachen wie ein „interace TableModelConsumer“ nachdenkt, sollte man im Kopf schon ein genaueres Bild von der Gesamtstruktur haben… (und ich habe das im Moment nicht…).