Swing MVC Pattern verstanden, aber Probleme bei der Umsetzung

mavinatic

Bekanntes Mitglied
Hallo,
ich bin gerade einen kleinen TaskManager für mich am schreiben, aber das Problem ist, dass wenn ich Tasks aus einer Datei lade, dann mache ich ein updateData() auf mein JPanel, wo alles gezeichnet ist und repaint() + revalidate() es aber die Daten werden nicht angezeigt :(

Hier mein Quelltext:

Java:
package org.gk.todo.gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

public class MainPanel extends JPanel {
	private JPanel contentPanel = null;
	private JPanel menuPanel = null;
	private JPanel categoryPanel = null;
	private JPanel tablePanel = null;
	
	private JSplitPane splitPane = null;
	private JTable table = null;
	private JTree tree = null;
	private String[] menuButtons = new String[] { "Task anzeigen" ,"Neuer Task", "Task bearbeiten", "Task löschen", "Liste laden", "Liste speichern", "Info"};
	private JButton[] button = new JButton[menuButtons.length];
	private String[] columns = new String[] { "Name", "Priority", "Status"};
	private String[][] data = new String[][] {};
	private DefaultTableModel model = null;
	private ButtonListener listener = null;
	private static final long serialVersionUID = 7239511497188922129L;
	public DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Kategorien");
	
	public MainPanel() {
		this.init();
		this.createMenu();
		this.createContent();
	}
	
	private void init() {
		this.setLayout(new BorderLayout());
		this.listener = new ButtonListener(this);
	}
	
	private void createMenu() {
		this.menuPanel = new JPanel();
		this.menuPanel.setPreferredSize(new Dimension(800,75));
		
		this.menuPanel.setLayout(new GridLayout(1, button.length));
		
		for(int i=0;i<button.length;i++) {
			this.button[i] = new JButton(menuButtons[i]);
			this.button[i].setToolTipText(menuButtons[i]);
			this.button[i].addActionListener(listener);
			this.menuPanel.add(button[i]);
		}
		
		this.add(BorderLayout.NORTH,this.menuPanel);
	}
	
	private void createContent() {
		this.contentPanel = new JPanel();
		this.contentPanel.setLayout(new GridLayout(1,1));
		
		this.categoryPanel = new JPanel();
		this.tablePanel = new JPanel();
		
		this.model = new DefaultTableModel(this.data,this.columns);
		this.tablePanel.setLayout(new GridLayout(1,1));
		this.table = new JTable(this.model);
		this.tablePanel.add(new JScrollPane(this.table));
		
		this.categoryPanel.setLayout(new GridLayout(1,1));
		this.categoryPanel.setPreferredSize(new Dimension(200,200));
		this.tree = new JTree(rootNode);
		this.tree.addTreeSelectionListener(listener);
		this.tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		this.categoryPanel.add(new JScrollPane(this.tree));
		
		this.splitPane = new JSplitPane();
		this.splitPane.setLeftComponent(categoryPanel);
		this.splitPane.setRightComponent(tablePanel);
		
		this.contentPanel.add(this.splitPane);
		this.add(BorderLayout.CENTER,this.contentPanel);
	}
	
	public void updateData(String[][] data) {
		this.data=data;
		this.repaint();
		this.revalidate();
	}
}
Hier mein Actionlistener
Java:
package org.gk.todo.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import org.gk.todo.beans.Task;
import org.gk.todo.model.TaskManager;

public class ButtonListener implements ActionListener, TreeSelectionListener {
	private MainPanel panel = null;
	private TaskManager manager = new TaskManager();
	private JFileChooser fc = new JFileChooser();
	private DefaultMutableTreeNode root = null;
	private ArrayList<Task> taskList = null;
	private ArrayList<Task> tempList = null;
	
	public ButtonListener(MainPanel panel) {
		this.panel = panel;
		this.root = this.panel.rootNode;
	}
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		if(arg0.getActionCommand().equals("Task anzeigen")) {
			TaskWindow newTask = new TaskWindow("Task anzeigen...");
		}
		if(arg0.getActionCommand().equals("Neuer Task")) {
			TaskWindow newTask = new TaskWindow("Neuer Task anlegen...");
		}
		if(arg0.getActionCommand().equals("Task bearbeiten")) {
			TaskWindow newTask = new TaskWindow("Task bearbeiten...");
		}
		if(arg0.getActionCommand().equals("Task löschen")) {
			
		}
		if(arg0.getActionCommand().equals("Liste laden")) {
			try {
				fc.showOpenDialog(panel);
				File f = fc.getSelectedFile();
				if(f!=null) {
					this.taskList = manager.loadData(f.getAbsolutePath());
					
					String[] strings = manager.getCategorys(this.taskList);	
					for(int i =0;i<strings.length;i++) {
						this.root.add(new DefaultMutableTreeNode(strings[i]));
					}
					
					panel.updateData(this.convert(this.taskList));
				}				
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		if(arg0.getActionCommand().equals("Liste speichern")) {
			try {
				fc.showSaveDialog(panel);
				File f = fc.getSelectedFile();
				if(f!=null) {
					this.manager.saveData(this.taskList, f.getAbsolutePath());
					JOptionPane.showMessageDialog(panel, "Ihre Liste wurde erfolgreich gespeichert","Liste gespeichert!", JOptionPane.OK_OPTION);
				}				
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		if(arg0.getActionCommand().equals("Info")) {
			JOptionPane.showMessageDialog(panel, "toDoManager V01.00");
		}
	}
	
	private String[][] convert(ArrayList<Task> taskList) {
		String[][] array = new String[taskList.size()][];
		for(int i=0;i<taskList.size();i++) {
			Task currentTask = taskList.get(i);
			String[] task = new String[] { currentTask.getName(), currentTask.getPriority(), currentTask.getStatus() };
			array[i] = task;
		}
		return array;
	}

	@Override
	public void valueChanged(TreeSelectionEvent e) {
		// TODO Auto-generated method stub
		if(tempList==null || tempList.size()==0) {
			tempList = new ArrayList<Task>();
		} else {
			tempList.clear();
		}
		
		TreePath treepath = e.getNewLeadSelectionPath();
		TreeNode node = (TreeNode) treepath.getLastPathComponent();
		
		if(node.toString().equals("Kategorien")) {
			if(this.taskList != null)
				panel.updateData(this.convert(this.taskList));
		} else {
			if(taskList!=null) {
				for(int i=0;i<taskList.size();i++) {
					if(taskList.get(i).getCategory().equals(node.toString())) {
						tempList.add(taskList.get(i));
					}
				}
			}			
			panel.updateData(this.convert(tempList));
		}
				
		
	}
}

Wäre cool wenn ihr mir erklären könntet warum in der JTable nichts angezeigt wird?! :)

Gruß

George
 

jgh

Top Contributor
da dein Code leider ohne Änderungen nicht für uns kompilierbar ist...würde ich folgendes probieren:

entweder erst validieren und dann repaint aufrufen...oder, das sollte das Problem eigentlich auf alle Fälle lösen: in deiner updateData(String[][] data) ein neues TabelModel setzen:

[java=90]public void updateData(String[][] data) {
this.data = data;
model = new DefaultTableModel(data, columns);
table.setModel(model );
// this.repaint();// wenn, imho erst validieren und dann repainten
// this.revalidate();
}[/code]
 

GUI-Programmer

Top Contributor
Ich denke das Problem besteht darin, dass du in der MainPanel - Klasse weder eine paint(Graphics g) noch eine paintComponent(Graphics g) hast. Daher bewirkt der Aufruf von repaint() in updateData(...) gar nichts. Denn in MainPanel hast du nur Komponenten. Was this.revalidate(); bewirken soll, ist mir selbst auch nicht so ganz klar. Vielleicht können da ja andere weiter helfen :)
 

jgh

Top Contributor
dem würde ich widersprechen...da die Klasse MainPanel von JPanel erbt, besitzt sie sowohl ein paintComponent, als auch eine paint() Methode...ob sie nun überschrieben worden ist, oder nicht ;)
Meine 5 Cent^^
 

ARadauer

Top Contributor
Java ist Call By Value
this.model = new DefaultTableModel(this.data,this.columns);
hier erzeugst du ein DefaultTableModel mit data das zb auf Speicherstelle A zeigt.

public void updateData(String[][] data) {
this.data = data;

jetzt zeigt data auf Speicherstelle B, aber das model schaut immer noch bei A nach. Du musst wie jgh geschrieben hat dein model aktualisieren...
 

mavinatic

Bekanntes Mitglied
Hat geklappt:

Java:
public void updateData(String[][] data) {
		this.model = null;
		this.model = new DefaultTableModel(data,this.columns);
		this.table.setModel(model);
		this.repaint();
		this.revalidate();
	}

Danke an alle :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
B JavaFX Pattern (Aufteilung Zuständigkeiten AWT, Swing, JavaFX & SWT 7
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Cromewell JavaFX MVC-Pattern AWT, Swing, JavaFX & SWT 7
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
3 2D-Grafik BasicStroke dash pattern - Linie zu lang!? AWT, Swing, JavaFX & SWT 1
M Welches Pattern bei GUI Anwendungen? AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
C GUI Entwicklung - welches Pattern? AWT, Swing, JavaFX & SWT 16
J Swing Controller im MVC-Pattern AWT, Swing, JavaFX & SWT 9
G Hilfe! Command Pattern an easy ImageViewer? AWT, Swing, JavaFX & SWT 13
D Wie mehrere Grafiken auf JPanel anzeigen lassen? (Observer pattern?) AWT, Swing, JavaFX & SWT 24
D MVC Pattern in Swing-Applikationen AWT, Swing, JavaFX & SWT 4
hdi Observer-Pattern bei JPanel nicht möglich? AWT, Swing, JavaFX & SWT 7
A MVC-Pattern - Kreuzweise Anwendung? AWT, Swing, JavaFX & SWT 4
J Konzept des ActionListeners nicht verstanden AWT, Swing, JavaFX & SWT 3
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
M Mehrere Frames - hab ich das richtig verstanden AWT, Swing, JavaFX & SWT 4
E Jtablemodelevent habs nicht verstanden. AWT, Swing, JavaFX & SWT 3
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
G JavaFX , Duplicate erzeugt aber ich weis nicht wo AWT, Swing, JavaFX & SWT 4
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
J Warum kann ich die Spaltennummer in der Konsole anzeigen, diese aber nicht speichern ? AWT, Swing, JavaFX & SWT 6
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
X JavaFX Einfache FX Application, aber wie alte Features umgehen? AWT, Swing, JavaFX & SWT 10
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
K Swing Textfeld verstecken aber benutzen AWT, Swing, JavaFX & SWT 15
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
P jtabel Zeilen auswählbar, aber nicht editierbar AWT, Swing, JavaFX & SWT 3
D Passwort [Aber mit 3 Versuchen] Funktioniert nicht wie erwartet AWT, Swing, JavaFX & SWT 4
A Swing Koordinatensystem wird gezeichnet verschwindet aber und die Einteilungen bleiben nicht bestehen AWT, Swing, JavaFX & SWT 5
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
Tom299 JavaFX AnchorPane resizen, aber wie? AWT, Swing, JavaFX & SWT 3
wolfgang63 JavaFX Transparenter Hintergrund aber sichtbare Buttons AWT, Swing, JavaFX & SWT 6
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
X AWT Graphics2D zum LWJGL Display hinzufügen aber wie? AWT, Swing, JavaFX & SWT 4
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
TheJavaKid JFrame defokusieren aber im Vordergrund behalten AWT, Swing, JavaFX & SWT 0
brunothg Swing JTable -> AUTO_RESIZE_OFF aber das Fenster ausfüllen AWT, Swing, JavaFX & SWT 0
J JFrame maximierbar aber nicht resizable AWT, Swing, JavaFX & SWT 6
D JTable markier- aber nicht veränderbar AWT, Swing, JavaFX & SWT 10
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
O getValueAt liefert "", aber es wird was angezeigt AWT, Swing, JavaFX & SWT 12
S JTable Zellinhalt markierbar aber nicht editierbar AWT, Swing, JavaFX & SWT 4
V Swing Wochenplaner in Swing erstellen! Aber wie? AWT, Swing, JavaFX & SWT 13
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
D JDialog alwaysOnTop, aber nur innerhalb der Applikation AWT, Swing, JavaFX & SWT 3
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
L SWT Drop erfolgreich, aber GUI-Aktion abgebrochen AWT, Swing, JavaFX & SWT 4
G Swing resizeable aber nur y-Achse nur wie? AWT, Swing, JavaFX & SWT 5
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing JSpinner mit Datum aber ohne Uhrzeit AWT, Swing, JavaFX & SWT 2
propra Doppelklick von Einzelklick unterscheiden, aber richtig ... AWT, Swing, JavaFX & SWT 10
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
T speichern funktioniert,aber öffnen nicht AWT, Swing, JavaFX & SWT 2
C JFrame ohne Titelleiste, aber mit Borders AWT, Swing, JavaFX & SWT 2
M Fenster aufteilen, aber mit welchem LayoutManager? AWT, Swing, JavaFX & SWT 10
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
S Bilddatei kopieren, aber ohne verluste und ohne zu großen Speicherverbrauch AWT, Swing, JavaFX & SWT 17
J Mehrere JRadioButtons, aber nur 1 darf ausgewählt sein AWT, Swing, JavaFX & SWT 4
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
S Swing Grundprinzip String ausgeben, aber wie? AWT, Swing, JavaFX & SWT 6
J Swing JCheckBox enabled, aber graues Kästchen AWT, Swing, JavaFX & SWT 2
F Bild auf JPanel, aber wie? AWT, Swing, JavaFX & SWT 6
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
G SWT-App läuft nicht unter OSX, unter Win aber problemlos AWT, Swing, JavaFX & SWT 3
F ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog AWT, Swing, JavaFX & SWT 2
L Swing Serverbrowser, aber welche componenten? AWT, Swing, JavaFX & SWT 2
F In Textfeld Kommazahl anzeigen aber ohne Komma eingeben AWT, Swing, JavaFX & SWT 14
T JTable: editieren bei Doppelklick deaktivieren, aber... AWT, Swing, JavaFX & SWT 2
data89 PopUp-Panel bauen - aber wie? AWT, Swing, JavaFX & SWT 2
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3
T JSpinner, 3 JSpinner aber nur ein SpinnerDateModel AWT, Swing, JavaFX & SWT 7
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
O Transparenz mit AWTUtilities aber nur das Fenster nicht die Buttons AWT, Swing, JavaFX & SWT 8
E Layout, aber welches? AWT, Swing, JavaFX & SWT 8
E Starten meiner GUI, aber wie? AWT, Swing, JavaFX & SWT 7
Developer_X Swing IndexOutOfBoundsException, aber warum?! AWT, Swing, JavaFX & SWT 15
Pithecanthropus [gelöst] JTree, aber nicht mit Strings, sondern mit Objects? AWT, Swing, JavaFX & SWT 2
T Choice "gezielt" darstellen aber wie - mit Koordinaten aber wie? AWT, Swing, JavaFX & SWT 6
T [Applet] startet in Eclipse aber nicht im Browser AWT, Swing, JavaFX & SWT 2
T JComboBox 2 Spaltig, aber nur eine Anzeigen AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen

Neue Themen


Oben