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:
Das besagt JPanel beinhaltet jetzt eine ScrollPane und eine JTabbedPane, wobei sich in der JTabbedPane ein JTree befindet und in der TabbedPane zwei FileChooser:
Der ScrollTree ergibt sich aus:
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.
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
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