Objektorientierung

ballibum

Aktives Mitglied
Hallo Forum,
ich versuche mein Programm der Objektorientierung deutlich näher zu bringen, bei einfachen Funktionen/Objekten gelingt mir das zu meist auch ganz gut. Nun möchte ich jedoch eigentlich ein Objekt über ein anderes Objekt manipulieren. Aber am besten erklärt sich die Geschichte am Programmcode.

Ich habe eine GUI erzeugt die in einen Hauptcontainer ein JPanel (davon gibt es verschiedene meine Frage betrifft aber nur ein Panel) integriert:

Java:
public class HauptContainer extends JFrame{
	private SystemInfo ordner = new SystemInfo();
	public HauptContainer() {
		setTitle("Oberfläche");
		//WindowOJ muss noch zwingend angepasst werden
		addWindowListener(new WindowOJ(){});
		setResizable(false);
		
		JPanel mPane = new JPanel();
		JMenuBar JMBar = new MenueBar(mPane).getMenueBar();
		setJMenuBar(JMBar);
		setSize(890,599);
		mPane.setBorder(UIManager.getBorder(BorderFactory.createEmptyBorder()));
		mPane.setSize(890, 599);
		mPane.setLayout(new CardLayout(0, 0));
		
		//füllen:
		JPanel sim = new SimSeite (mPane.getWidth(),mPane.getHeight()).getSimPanel();
		mPane.add(sim,"panel_sim");
		add(mPane);
	}
}

Das besagt JPanel beinhaltet jetzt eine ScrollPane und eine JTabbedPane, wobei sich in der JTabbedPane ein JTree befindet und in der TabbedPane zwei FileChooser:

Java:
public class SimSeite extends JPanel{
	
	JPanel simPanel;
	JScrollPane scrolltree;
	JTabbedPane tabbedPane;

	public JPanel getSimPanel() {
		return simPanel;
	}
	
	
	public SimSeite(int width, int height)
	{
		
		simPanel = new JPanel();
		simPanel.setSize(width, height);
		simPanel.setBorder(BorderFactory.createTitledBorder(UIManager.getBorder("TitledBorder.border"),"Simulation"));
		simPanel.setLayout(null);
		
		//Auswahlmenü zum Hinzufügen von Start und Folgegenerationen
		tabbedPane = new SimTabbedPane().getTabbedPane();
		tabbedPane.addTab("Startgeneration", null, new StartgenerationPanel().getPanelStart(), "Einspielen der Daten");
		
		//(Scroll-)Feld für den Datei-Baum  => Tree
		scrolltree = new SimScrollTree().getScrollTree();
		
		simPanel.add(tabbedPane);
		simPanel.add(scrolltree);	
	}
}

Der ScrollTree ergibt sich aus:
Java:
public class SimScrollTree extends JScrollPane{

	JScrollPane scrollTree;
	
	public SimScrollTree() {
		
		
		JTree tree = new JTree();
		tree.setModel(new SimTreeModel().getTreemodel());
		scrollTree = new JScrollPane(tree);
		scrollTree.setBounds(10, 15, 180, 345);
	}
	

	public JScrollPane getScrollTree() {
		return scrollTree;
	}
	
}
und der dazugehörigen class:

public class SimTreeModel {

	DefaultTreeModel treemodel;
	
	 public SimTreeModel() {
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Simulation"); 
		DefaultMutableTreeNode node_start = new DefaultMutableTreeNode("erster Block");
		root.add(node_start);
		DefaultMutableTreeNode node_fallen = new DefaultMutableTreeNode("Datei 1A");
		DefaultMutableTreeNode node_mais = new DefaultMutableTreeNode("Datei 1B");
		node_start.add(node_fallen);
		node_start.add(node_mais);
		DefaultMutableTreeNode node_fallen_blatt = new DefaultMutableTreeNode("leer");
		DefaultMutableTreeNode node_mais_blatt = new DefaultMutableTreeNode("leer");
		node_fallen.add(node_fallen_blatt);
		node_mais.add(node_mais_blatt);
		treemodel = new DefaultTreeModel(root);
	}

	public DefaultTreeModel getTreemodel() {
		return treemodel;
	}
}

und über eine JPanel welches in der TabbedPane integriert ist kann ich eben DateiURLs in Textfelder speichern und möchte diese nun anstelle des "leer" im Tree anzeigen lassen (von der Idee hat das schon einmal geklappt, doch da hatte ich alles in einer Klasse und das brachte mich in Schwulitäten beim Anpassen und Korrigieren.
Java:
public class StartgenerationPanel extends JPanel{
	
	JPanel panelStart;
	private static String pfad="";
	
	public StartgenerationPanel() {
		
		panelStart = new JPanel();
		panelStart.setBackground(SystemColor.lightGray);
		panelStart.setLayout(null);
		SystemInfo sysInfo = new SystemInfo();
		
		
		//Felder und Buttons für das einlesen der entsprechenden Dateien
		JButton btnFileMais = new JButton("");
		btnFileMais.setBackground(panelStart.getBackground());
		btnFileMais.setIcon(new ImageIcon(sysInfo.getImagepfad()+"addFile.png"));
		btnFileMais.setBounds(620,5,25,25);
		
		JButton btnFileFallen = new JButton("");
		btnFileFallen.setBackground(panelStart.getBackground());
		btnFileFallen.setIcon(new ImageIcon(sysInfo.getImagepfad()+"addFile.png"));
		btnFileFallen.setBounds(620,35,25,25);
		
		final JTextField txtPfadMais = new JTextField();
		txtPfadMais.setEditable(false);
		txtPfadMais.setText("Maisfl\u00E4chen");
		txtPfadMais.setBounds(5,5,600,25);
		
		final JTextField txtPfadFallen = new JTextField();
		txtPfadFallen.setEditable(false);
		txtPfadFallen.setText("Fallen");
		txtPfadFallen.setBounds(5, 35, 600, 25);
		
		panelStart.add(txtPfadMais);
		panelStart.add(btnFileMais);
		addOpenDialog(btnFileMais,txtPfadMais);
		
		panelStart.add(txtPfadFallen);
		panelStart.add(btnFileFallen);
		addOpenDialog(btnFileFallen,txtPfadFallen);
		
		//Buttons zum Speichern der entsprechenden Dateien
		JButton btnStartSpeichern = new JButton("Speichern");
		btnStartSpeichern.setBackground(panelStart.getBackground());
		btnStartSpeichern.setBounds(5,65,100,25);
		
		//mit dieser Funktion wird der Tree manipuliert
		btnStartSpeichern.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//tree.clearSelection();
				if(txtPfadFallen.getText().contains(".shp") && txtPfadMais.getText().contains(".shp"))
				{
					DefaultMutableTreeNode modellstruktur = (DefaultMutableTreeNode)treemodel.getRoot();
					((DefaultMutableTreeNode) modellstruktur.getRoot().getChildAt(0).getChildAt(0).getChildAt(0)).setUserObject(txtPfadFallen.getText());
					((DefaultMutableTreeNode) modellstruktur.getRoot().getChildAt(0).getChildAt(1).getChildAt(0)).setUserObject(txtPfadMais.getText());
					System.out.println("Dateiablage erfolgreich");
					treemodel.reload();
				}
				else
				{
					System.out.println("Keine oder nur eine Datei angegeben");
				}
			}
		});
		panelStart.add(btnStartSpeichern);
	}

	public JPanel getPanelStart() {
		return panelStart;
	}
	
	//Funktion die die Dateipfade auf Buttonklick ausliest und im entsprechenden Textfeld ausgibt
	public static void addOpenDialog(final JButton button, final JTextField textfield){
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fc = new JFileChooser(pfad);
				fc.setDialogTitle("Datei auswählen");
				fc.setFileFilter(new FileFilter() {
	                public boolean accept(File f) {
	                    return f.getName().toLowerCase().endsWith(".shp") || f.isDirectory();
	                }
	                public String getDescription() {
	                    return "Shapefiles(*.shp)";
	                }
	            });
				if (e.getSource() == button) {
			        int returnVal = fc.showOpenDialog(button.getParent());
			        if (returnVal == JFileChooser.APPROVE_OPTION) {
			            File file = fc.getSelectedFile();
			            //This is where a real application would open the file.
			            textfield.setText(file.getPath());
			            pfad = file.getPath();
			        } 
			   }
			}
		});
	}

Das Problem ist mit Sicherheit, das Objekt StartgenerationPanel das Treemodel nicht kennt. Ich hätte nun jedoch gerne Hilfe, wie ich die Bearbeitbarkeit des Trees doch gewährleisten kann.

mit freundlichem Gruß
Balli
 
S

SlaterB

Gast
wieso erbt StartgenerationPanel von JPanel?
wenn du intern noch ein JPanel-Objekt hast, dann ist so eine Vererbung gefährlich

bei SimScrollTree genauso
SimTreeModel erbt immerhin nicht von DefaultTreeModel..,

du kannst natürlich die Vererbund passend zum Namen jeweils belassen/ einführen,
dann mehr mit dem Objekt selber arbeiten, kein separates JPanel & Co. erstellen

----

grundsätzlich musst du nur die Objekte untereinander bekannt machen,

SimSeite braucht ja auch scrollTree, welches zunächst nur in SimScrollTree bekannt ist,
dort schaffst du es, scrollTree per get-Methode rauszuholen und woanders zu verwenden, ist ja auch nicht schwer

nun nur ein paar Schritte weiter, SimSeite gelangt auch an das treeModel, welches ebenfalls als Attribut abgelegt und über get geholt werden kann,

und dann etwas als Neuerung übergibt SimSeite dieses treeModel an StartgenerationPanel, entweder im Konstruktor oder später per set-Methode,
im letzteren Fall dann das StartgenerationPanel mindestens in einer lokalen Variable ablegen,

in StartgenerationPanel in einem Attribut merken,
alles Standard-Vorgänge, wie man sie in den aller ersten Programmen eigentlich kennenlernen sollte,
erkenne die Einfachheit, bedenkliche Frage bei komplizierten Programmen wie GUI
 

ballibum

Aktives Mitglied
Okay, danke für die Antwort.
Also ich habe erstmal die Vererbungen weggemacht.
Nun meinst du also ich muss über mehrer Getters und Setters den Baum übergeben, dass werde ich jetzt einfach mal machen und schauen ob es funktioniert wie ich es mir vorstelle.
Ich dachte nur erst es gäbe eventuell einen "eleganteren" Weg.

mfg
Balli

p.s. hoffentlich erleben wir die Meisterschaft des FCHs noch
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
L Einführung Objektorientierung Java Basics - Anfänger-Themen 8
L Einstieg Objektorientierung Java Basics - Anfänger-Themen 10
H Wie geht eigentlich Objektorientierung? Java Basics - Anfänger-Themen 14
L Objektorientierung Java Basics - Anfänger-Themen 6
B Objektorientierung Java Basics - Anfänger-Themen 1
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
T Objektorientierung-Kurze Frage Java Basics - Anfänger-Themen 5
L Hilfe! Objektorientierung Java Basics - Anfänger-Themen 3
S OOP Zusammenhang von Objektorientierung und Ausnahmebehandlungen Java Basics - Anfänger-Themen 6
C Objektorientierung? Java Basics - Anfänger-Themen 5
G Designfrage/Objektorientierung Java Basics - Anfänger-Themen 19
S Methoden Aufgabe zu ""Methoden" und "Objektorientierung" Java Basics - Anfänger-Themen 3
B OOP Programm zur Verdeutlichung von Objektorientierung Java Basics - Anfänger-Themen 7
T Initialisierungen der einzelnen Klassen - Objektorientierung Java Basics - Anfänger-Themen 4
W Einstieg Objektorientierung Java Basics - Anfänger-Themen 4
X Objektorientierung Einführung Java Basics - Anfänger-Themen 2
A Objektorientierung Klassen Java Basics - Anfänger-Themen 4
D Objektorientierung / Polymorphismus Java Basics - Anfänger-Themen 8
Spin Objektorientierung . Konzept Java Basics - Anfänger-Themen 4
M Objektorientierung Java Basics - Anfänger-Themen 3
M Objektorientierung - wie macht man's richtig? Java Basics - Anfänger-Themen 3
R ObjektOrientierung Java Basics - Anfänger-Themen 18
D Objektorientierung ? Java Basics - Anfänger-Themen 4
D Objektorientierung Listen Java Basics - Anfänger-Themen 2
J objektorientierung und uml Java Basics - Anfänger-Themen 5
D Objektorientierung - wie konsequent sollte man sein ? Java Basics - Anfänger-Themen 30
D Zuerst Objektorientierung oder GUI ? Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben