# Suche großes vollständiges Swing GUI Beispiel nach MVC Model



## WurzelSeppel (29. Apr 2008)

Hallo,

ich suche ein großes vollständiges Swing-GUI Beispiel, an dem ich lernen kann, wie man richtig nach Modell-View-Controller (MVC) Vorschrift programmiert.

Das Problem ist, daß ich zwar hier viele einfach Beispiel finde zu Menus und Menubars,

aber ich weiß noch nicht genau, wie "man es richtig macht", wenn man zum Beispiel nach dem Klicken auf den ABOUT Eintrag im Menu ein einfaches About-Fenster anzeigen will....

Ok meintewegen hab ich hier die Actionabfrage, aber meistens ist sie gleich mit THIS im "Hauptprogramm" zu finden, bei den meisten Beispielen hier.


```
public void actionPerformed(ActionEvent e){
      String buttonPressed = e.getActionCommand();
...

   if (buttonPressed == "About"){
          
          JFrame about = new JFrame("About");
                   
          JPanel p1 = new JPanel();
          p1.setLayout(new BorderLayout());
          about.getContentPane().add(p1);
          
         // about.setUndecorated(true);
          about.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          about.pack();
          about.setSize(640, 480);
          about.setVisible(true);
       }
```

So habe ich es mal probiert und gleich an Ort und Stelle einfach ein neues Fenster aufmachen wollen, wo
ein bischen was über ABOUT steht.
So klappt das nicht, so kann es nicht sein.

Genauso brauche ich ja ein Option-Fenster. Das wird ein neues JFrame sein mit einer JTabbedPane drauf, daß ist mir schon klar. Aber mir ist nicht klar, wo ich das dann aufbaue und anzeigen lasse.

Am liebsten wäre mir ein BEISPIEL. Die MVC Theorie bei Sun hab ich angelesen und immer wieder gelesen,
nützt nichts, zäh wie harter Lehm. Die komischen kurzen Codeschnipsel nützen niemand was.
Ich suche ein kompletes Beispiel, daß ich auch kompilieren kann, wo ich SEHE WAS WIE WO GEMACHT wird.

So lernt man doch am einfachsten, indem man was hat , was tut und dann daran rumspielt und was ausprobiert.


----------



## André Uhres (30. Apr 2008)

Vielleicht hilft dieses MVC Beispiel mit Model, View und Controller:

```
package demo;
/*
 * FileTable.java
 */

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.logging.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.text.*;

public final class FileTable {

    private Model model;
    private View view;
    private Controller controller;

    public FileTable() {
        super();
        model = new Model();
        view = new View();
        controller = new Controller();

    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new FileTable().view.createAndShowGUI();
            }
        });
    }

    private final class Model {

        private DefaultTableModel tableModel = new DefaultTableModel(new String[]{"File name", "Size", "Path"}, 0) {

            @Override
            public Class<?> getColumnClass(final int columnIndex) {
                return columnIndex == 1 ? Long.class : String.class;
            }
        };
        private Document textDocument = new PlainDocument();

    }

    private final class View {

        private JFrame frame;
        private JTable table;
        private JTextArea textarea;

        private void createAndShowGUI() {

            frame = new JFrame("File Table");
            table = new JTable(model.tableModel);
            textarea = new JTextArea(model.textDocument);
            JButton btChoose = new JButton(controller.chooseFolder);

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            table.getSelectionModel().addListSelectionListener(controller.selectionListener);

            Container container = frame.getContentPane();
            container.add(new JScrollPane(table), BorderLayout.CENTER);
            JScrollPane textScroller = new JScrollPane();
            textScroller.setPreferredSize(new Dimension(0, 150));
            textScroller.setViewportView(textarea);
            container.add(textScroller, BorderLayout.SOUTH);
            container.add(btChoose, BorderLayout.NORTH);

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

    }

    public final class Controller {

        private Action chooseFolder = new Transaction("chooseFolder", "Choose a file", null, this);
        private ListSelectionListener selectionListener = (ListSelectionListener) EventHandler.create(
                ListSelectionListener.class, this, "rowSelectionChanged", "");

        public void chooseFolder(final ActionEvent e) {
            JFileChooser chooser = new JFileChooser();
            chooser.showOpenDialog(view.frame);
            File dir = chooser.getSelectedFile();
            if (dir == null) {
                return;
            }
            dir = dir.getParentFile();
            File[] filelist = dir.listFiles();
            model.tableModel.setRowCount(0);
            for (int i = 0; i < filelist.length; i++) {
                File file = filelist[i];
                model.tableModel.addRow(new Object[]{file.getName(), file.length(), file.getAbsolutePath()});
            }
        }

        public void rowSelectionChanged(final ListSelectionEvent event) {
            if (event.getValueIsAdjusting()) {
                return;
            }
            BufferedReader reader = null;
            Document doc = model.textDocument;
            try {
                doc.remove(0, model.textDocument.getLength());
                String path = (String) model.tableModel.getValueAt(view.table.getSelectedRow(), 2);
                doc.insertString(0, path + "\n", null);
                File file = new File(path);
                reader = new BufferedReader(new FileReader(file));
                String str = reader.readLine();
                while (str != null) {
                    doc.insertString(doc.getLength(), str + "\n", null);
                    str = reader.readLine();
                }
            } catch (final IOException ex) {
                Logger.getLogger(FileTable.class.getName()).log(Level.SEVERE, null, ex);
            } catch (final BadLocationException ex) {
                Logger.getLogger(FileTable.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    reader.close();
                } catch (final IOException ex) {
                    Logger.getLogger(FileTable.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }

        class Transaction extends AbstractAction {

            private final Object controller;
            private transient Method method;

            public Transaction(final String command, final String name, final Icon icon, final Object controller) {
                super(name, icon);
                this.putValue(Action.ACTION_COMMAND_KEY, command);
                this.controller = controller;
            }

            @Override
            public void actionPerformed(final ActionEvent e) {
                try {
                    if (method == null) {
                        method = controller.getClass().getMethod(
                                (String) getValue(Action.ACTION_COMMAND_KEY), new Class[]{ActionEvent.class});
                    }
                    method.invoke(controller, new Object[]{e});
                } catch (final NoSuchMethodException ex1) {
                    throw new RuntimeException(ex1);
                } catch (final InvocationTargetException ex2) {
                    throw new RuntimeException(ex2.getTargetException());
                } catch (final Exception ex3) {
                    throw new RuntimeException(ex3);
                }
            }
        }
    }
}
```


----------



## Gast (4. Mai 2008)

Nunja, einfach zu kapieren ist das auch nicht grad. Ja, ich weiß, ich hab nach MCV gefragt und es auch bekommen.

Aber lest bitte nochmal oben  mein Problem. Ich will doch nur ein About Fenster aufmachen...

Klar, später kommt noch ein "Hauptthread" dazu, aber ich hab das Gefühl, das Beispiel ist "ungeschickt" und für meine Zwecke zu "aufwendig"


----------



## André Uhres (5. Mai 2008)

Gast hat gesagt.:
			
		

> für meine Zwecke zu "aufwendig"


Da bin ich aber erleichtert, ich dachte schon es wäre zu simpel


----------



## diggaa1984 (2. Jan 2009)

streichen


----------



## diggaa1984 (2. Jan 2009)

ups, total verklickt ... sollte nen eigener Thread werden ^^

zeigt das ich mich der Forensuche bemühe


----------

