Best Practice JTable in MVC Pattern

cyb0rg

Aktives Mitglied
Hallo Zusammen,
ich arbeite gerade an folgenden Code:
Code:
public class mainGUIController {
    private ch.becit.m2o.views.mainGUIView mainGUIView;
    private ch.becit.m2o.models.mainGUIModel mainGUIModel;

    private JTable table;

    public mainGUIController(mainGUIView mainGUIView, mainGUIModel mainGUIModel) {
        this.mainGUIView = mainGUIView;
        this.mainGUIModel = mainGUIModel;
        this.mainGUIModel.setTitle("m2o");

        this.mainGUIView.setTitle(this.mainGUIModel.getTitle());

        setTable();

        // Add Action Listener
        this.mainGUIView.addActionListenerjMenuItemSettings(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                settingsView settingsView = new settingsView();
                settingsModel settingsModel = new settingsModel();
                settingsController settingsController = new settingsController(settingsView, settingsModel);
            }
        });

        this.mainGUIView.addActionListenerjMenuItemQuit(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

    }

    public void loadSettings() {
        try {

            Properties properties = new Properties();
            FileInputStream fileInputStream = new FileInputStream(("m2o.config"));

            properties.load(fileInputStream);
            fileInputStream.close();

            this.mainGUIModel.setRootPath(properties.getProperty("rootPath", "Not Set"));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void listFiles(String path){
        try(Stream<Path> paths = Files.walk(Paths.get(path))) {
            paths.forEach((Path filePath) -> {
                if (Files.isRegularFile(filePath)) {
                    //this.mainGUIModel.addData(filePath.toString(),true);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void setTable(){
            this.table = new JTable(this.mainGUIModel.getData(),this.mainGUIModel.getColumnNames());
            JScrollPane scrollPane = new JScrollPane(this.table);
            table.setFillsViewportHeight(true);
            this.mainGUIView.addComponents(scrollPane);
    }
}
Code:
public class mainGUIModel {
    // Frame Settings Variables
    private String title;

    // Table Settings Variables
    private String rootPath;
    private String[] columnNames = {"FileName"};
    private String[] data = {
            "Snowboarding",
            "John",
            "Sue",
            "Jane",
            "Joe"
    };

    private ArrayList<String> dataTemp;

    public mainGUIModel() {
        this.title = "";
    }

    // Getter
    public String getTitle() {
        return this.title;
    }

    public String getRootPath() {
        return rootPath;
    }

    public String[] getData(){
        return this.data;
    }

    public String[] getColumnNames(){
        return this.columnNames;
    }

    // Setter
    public void setTitle(String title) {
        this.title = title;
    }

    public void setRootPath(String rootPath) {
        this.rootPath = rootPath;
    }

    public void addData(String fileName, Boolean value){
        this.dataTemp.add(fileName);
    }
}
Code:
public class mainGUIView extends JFrame {

    private JFrame frame;

    // Menu Object definitions
    private JMenuBar jMenuBar;

    // Table Objects definitions
    /*private String[] columnNames = {"FileName",
            "Choosen"};
    private Object[][] data = {
            {"Snowboarding", true},
            {"John", true},
            {"Sue", false},
            {"Jane" ,true},
            {"Joe",false}
    };*/

    private JTable table;

    // Menu File
    private JMenu jMenuFile;
    private JMenuItem jMenuItemSettings;
    private JMenuItem jMenuItemQuit;


    public mainGUIView() {
        this.frame = new JFrame();
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        buildComponents(this.frame.getContentPane());
    }

    private void buildComponents(Container pane) {

        try {
            settings();

            this.frame.setJMenuBar(this.jMenuBar);


            // Settings for the Frame
            this.frame.setPreferredSize(new Dimension(200, 200));
            this.frame.setVisible(true);
            this.frame.pack();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }


    }

    private void settings() {
        // Build objects
        this.jMenuFile = new JMenu("File");
        this.jMenuBar = new JMenuBar();
        this.jMenuItemSettings = new JMenuItem("Settings");
        this.jMenuItemQuit = new JMenuItem("Quit");


        // add objects
        this.jMenuFile.add(jMenuItemSettings);
        this.jMenuFile.add(jMenuItemQuit);
        this.jMenuBar.add(this.jMenuFile);
    }

    private void table(String[] columnNames, String[][]data){
        // Building Table
        this.table = new JTable(data, columnNames);

    }
    // Add Components
    public void addComponents(Object comp){
        this.frame.getContentPane().add((Component) comp, BorderLayout.CENTER);
        this.frame.pack();
    }

    // Add ActionListeners
    public void addActionListenerjMenuItemSettings(ActionListener actionListener){
        this.jMenuItemSettings.addActionListener(actionListener);
    }
    public void addActionListenerjMenuItemQuit(ActionListener actionListener){
        this.jMenuItemQuit.addActionListener(actionListener);
    }

    // Setter
    // TODO: Unit Tests
    public void setTitle(String title){
        this.frame.setTitle(title);
    }
}

mein Problem bzw Frage lautet:

ich würde jetzt gerne die JTable so implementieren, dass ich die Table über den Controller und Model kontrollieren kann, doch im moment verliere ich mich da. Klar ich könnte jetzt die JTable direkt im View implementieren (wie es zu testzwecken war) doch dann wären ja die Daten nicht im Model und der Controller würde dann wohl nur noch die Listener implementieren, doch ich möchte es richtig machen und habe im moment keine idee mehr wie ich es machen soll / muss. Als ich das Refactoring anfing um es zum Controller bzw Model auszulagern, merkte ich relativ schnell dass da leider nochein paar abhängigkeiten nicht berücksichtigt habe, wie unter anderem... ich muss es ja im Scrollpane hinzufügen, welches ich ja dem frame adden muss, etc.. darauf habe ich aber lediglich über den View zugriff und nicht den controller, wie macht man das? konnte leider auf dem netzt kein praktikables bsp dazu finden.
 

cyb0rg

Aktives Mitglied

vielen dank! das hat mir weitergeholfen! den neuen funktionierende Code poste ich unten, bin gespannt auf feedback :)
Das da ist falsch bzw. unsauber. dein mainGUIView ist ja schon ein JFrame ! Jetzt hast du zwei
vielen dank für den hinweis! habe ich entsprechend entfernt :)

diesmal habe ich lediglich den relevanteren code herausgefiltert.. wird sonst etwas to much..
Code:
public class Table {
    private String filePath;

    // TODO: UnitTests
    public String getFilePath() {
        return filePath;
    }

    // TODO: UnitTests
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

}
Code:
public class TableModel extends AbstractTableModel{
    private List<Table> table = new ArrayList();
    private String[] columnNames = {"Filepath"};


    @Override
    public String getColumnName(int columnName){
        return this.columnNames[columnName];
    }
    @Override
    public int getRowCount() {
        return this.table.size();
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex){
            case 0:
                return this.table.get(rowIndex).getFilePath();
        }
        return null;
    }

    public void addRow(Table table){
        this.table.add(table);
//        fireTableRowsInserted(this.table.size() - 1, this.table.size() -1);
        fireTableDataChanged();
    }

    public void removeValue(Table table){
        this.table.remove(table);
//        fireTableRowsInserted(this.table.size() - 1, this.table.size() -1);
    }
}

Code:
public class mainGUIController {
        setTable();
    }
    public void listFiles(String path) {
        try (Stream<Path> paths = Files.walk(Paths.get(path))) {
            paths.forEach((Path filePath) -> {
                if (Files.isRegularFile(filePath)) {
                    Table f = new Table();
                    f.setFilePath(filePath.toString());
                    this.tableModel.addRow(f);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setTable() {
        this.tableModel = new TableModel();
        this.mainGUIView.setTableModel(tableModel);
    }
}
hier merke ich grad beim posten... eigentlich könnte ich die zwei funktionen private setzen, die brauch ich nähmlich nicht public...
Code:
public class mainGUIView extends JFrame {
    public mainGUIView() {
        super("m2o");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        buildComponents(getContentPane());
    }

    private void buildComponents(Container pane) {

        try {
            settings();
            setJMenuBar(this.jMenuBar);
            this.table = new JTable();
            this.scrollPane = new JScrollPane(this.table);

            this.table.setFillsViewportHeight(true);

//            TableModel tableModel = new TableModel();
//            this.table.setModel(tableModel);
            addComponents(this.scrollPane);

            // Settings for the Frame
            setPreferredSize(new Dimension(200, 200));
            setVisible(true);
            pack();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    private void settings() {
        // Build objects
        this.jMenuFile = new JMenu("File");
        this.jMenuBar = new JMenuBar();
        this.jMenuItemSettings = new JMenuItem("Settings");
        this.jMenuItemQuit = new JMenuItem("Quit");


        // add objects
        this.jMenuFile.add(jMenuItemSettings);
        this.jMenuFile.add(jMenuItemQuit);
        this.jMenuBar.add(this.jMenuFile);
    }
    // Add Components
    public void addComponents(Object comp){
        getContentPane().add((Component) comp, BorderLayout.CENTER);
        pack();
    }
    // Setter
    // TODO: Unit Tests
    public void setTitle(String title){
        setTitle(title);
    }

    public void addScrollpaneComponent(Component component){
        this.scrollPane.add(component);
    }

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

so ich denke das relevanteste ist drinn... da ist sicherlich noch vebesserungspotential, was meint ihr dazu?
 

JStein52

Top Contributor
Ich habe den Code jetzt nur überflogen aber ich frage mich warum du eine eigene Klasse TableModel gemacht hast? Welche zusätzliche Funktionalität bietet diese die z.B. DefaultTableModel nicht hat ? Oder liegt das daran dass man nicht den ganzen Code sieht ?
 

cyb0rg

Aktives Mitglied
Ich habe den Code jetzt nur überflogen aber ich frage mich warum du eine eigene Klasse TableModel gemacht hast? Welche zusätzliche Funktionalität bietet diese die z.B. DefaultTableModel nicht hat ? Oder liegt das daran dass man nicht den ganzen Code sieht ?
da is keine zusätzlich funktionalität nein. Das liegt wohl daran dass ich dies "überlesen" habe.. werds auch mal mit DefaultTableModel testen, danke!
 

JStein52

Top Contributor
Musst du ja nicht. Wenn es so funktioniert ist es ja gut und gehört zur Übung. Ich wollte nur verstehen warum du es so gemacht hast. Alles gut.
 

cyb0rg

Aktives Mitglied
Musst du ja nicht. Wenn es so funktioniert ist es ja gut und gehört zur Übung. Ich wollte nur verstehen warum du es so gemacht hast. Alles gut.
:) werde es so oder so noch anschauen, lerne halt auch gern dazu... aber heute musste / durfte ich mich ein paaar stunden mit JavaFX beschäftigen.. und ich denke in Zukunft werde ich nur noch in die Richtung entwickeln :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
richis-fragen JTable sowohl Spaltennamen wie auch Spaltenbeschriftungen Java Basics - Anfänger-Themen 7
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
J Zelleninhalt einer Jtable löschen Java Basics - Anfänger-Themen 2
E JTable einzelne Zelle färben Java Basics - Anfänger-Themen 2
thobren jtable arraylist Java Basics - Anfänger-Themen 12
thobren JTable Icon Java Basics - Anfänger-Themen 1
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
H Kapselung JProgressBar in JTable, aber getValueAt() greift nicht Java Basics - Anfänger-Themen 7
G JTable, Zeile auswählen und Ergebnis an Schaltfläche übergeben Java Basics - Anfänger-Themen 4
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
J JTable Spalteninhalt löschen Java Basics - Anfänger-Themen 1
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
B jTable Spalte summieren Java Basics - Anfänger-Themen 7
N JTable auslesen Java Basics - Anfänger-Themen 6
O JTable in Excel mit Farben Java Basics - Anfänger-Themen 8
O Kommentar auf JTable Zelle Java Basics - Anfänger-Themen 2
M Jtable Reenderer Java Basics - Anfänger-Themen 0
O Popoup Menü im JTable richtig anzeigen Java Basics - Anfänger-Themen 6
M Jtable änderung updaten Java Basics - Anfänger-Themen 2
O JTable Suchfunktion Java Basics - Anfänger-Themen 2
M jTable bekommt null Java Basics - Anfänger-Themen 1
M JTable an andere Klasse übergeben Java Basics - Anfänger-Themen 2
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Klasse in JTable einfügen Java Basics - Anfänger-Themen 7
S JTable Java Basics - Anfänger-Themen 16
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L JTable Tagebuch Spaltenhöhe verändern Java Basics - Anfänger-Themen 3
S JTable - Filter an anderen Colums Java Basics - Anfänger-Themen 2
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
A zykl. Aktualisierne JTable Java Basics - Anfänger-Themen 9
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Werte aus JTable auslesen Java Basics - Anfänger-Themen 4
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
V JTable welcher Listener ? Java Basics - Anfänger-Themen 7
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
D JTable Zeilen löschen Java Basics - Anfänger-Themen 5
C Klassen JTable wird ohne Header aufgebaut Java Basics - Anfänger-Themen 6
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
B Kniffel JTable Java Basics - Anfänger-Themen 5
N JTable flackert Java Basics - Anfänger-Themen 8
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
J ArrayList wird in JTable falsch angezeigt Java Basics - Anfänger-Themen 0
J Eintragen von Personen in JTable Java Basics - Anfänger-Themen 4
X JTable mit grünen und roten Punkten Java Basics - Anfänger-Themen 2
LexeB4F DEL --> JTable Zelleninhalt Java Basics - Anfänger-Themen 3
R JTable Auslesen Java Basics - Anfänger-Themen 1
Crazynet jTable erste Zeile mit deffinierten Werten Java Basics - Anfänger-Themen 0
K Collections Sortieren nach zweiter Spalte in JTable Java Basics - Anfänger-Themen 18
J JTable Wert gleich überschreiben Java Basics - Anfänger-Themen 6
S Zeile entfernen aus JTable Java Basics - Anfänger-Themen 15
S JTable clonen Java Basics - Anfänger-Themen 5
H Best Practice PDF JTable Java Basics - Anfänger-Themen 4
S In JTable Zeile selektieren mit Mausklick Java Basics - Anfänger-Themen 16
D JTable Probleme beim Sortieren von Zahlen. Java Basics - Anfänger-Themen 6
M JTable mit XML datei befüllen Java Basics - Anfänger-Themen 1
F Zeile bei JTable hinzufügen Java Basics - Anfänger-Themen 6
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
M [JTable] getValue throws ArrayOutOfBoundException Java Basics - Anfänger-Themen 1
B JTable - Highlighter ??? Java Basics - Anfänger-Themen 3
S JTable LinkedList <Objekt> befüllen Java Basics - Anfänger-Themen 1
S JTable dynamisch mit Datenbankinhalten füllen Java Basics - Anfänger-Themen 6
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
O JScrollPane zu gross für JTable Java Basics - Anfänger-Themen 2
L JTable Row selected -> fireTableDataChange do nothing. Java Basics - Anfänger-Themen 3
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
O java.lang.IndexOutOfBoundsException JTable autoSort Java Basics - Anfänger-Themen 5
F JTable adding Row Java Basics - Anfänger-Themen 5
P jTable getColumnClass, mit unterschiedlichen Klassen in einer Column? Java Basics - Anfänger-Themen 5
M Eingabe in JTable bei Eingabe korrigieren Java Basics - Anfänger-Themen 2
Z jtable problem (das tausendste??) Java Basics - Anfänger-Themen 12
J JTable Java Basics - Anfänger-Themen 7
T JTable Java Basics - Anfänger-Themen 2
T JTable einzelne Zeilen löschen Java Basics - Anfänger-Themen 3
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
Uzi21 jTable / Inhalt speichern Java Basics - Anfänger-Themen 2
M Problem mit JTable und Model Java Basics - Anfänger-Themen 3
F Methoden JTable + 2 For-Schleifen Java Basics - Anfänger-Themen 4
C jtextfield und jtable Java Basics - Anfänger-Themen 34
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
G JTable: SelectionListener Problem Java Basics - Anfänger-Themen 2
G JTable: Werte in Tabelle direkt ansprechen Java Basics - Anfänger-Themen 3
S Icons in JTable per ResultSet Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
M Zelle von JTable mit Rahmen versehen Java Basics - Anfänger-Themen 4
G JTable: Inhalt einer selektierten Zeile speichern Java Basics - Anfänger-Themen 2
G JTable: mehrzeilige Zellen erstellen Java Basics - Anfänger-Themen 2
W Problem JTable Java Basics - Anfänger-Themen 5
M JTable wird nicht aktualisiert Java Basics - Anfänger-Themen 4
D jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist... Java Basics - Anfänger-Themen 5
S Warum wird JTable nicht angezeigt Java Basics - Anfänger-Themen 2
D jtable renderer und sortieren kombinieren Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben