Marv04 Geschrieben 4. Mai 2014 Geschrieben 4. Mai 2014 Moin Leute, und zwar habe ich eine frage an euch und zwar möchte ich durch einen Klick auf einen Button das jetzige Layout schließen und durch ein neues ersetzten, aber ich weiß nicht wie, damit habe ich noch nie gearbeitet, hatte sozusagen immer nur single Layouts.. Hier einmal meine Mainframe, das ist jetzt nur ein Projektbeispiel, und zwar soll jetzt durch klick auf den Button der Zweite Quelltext angezeigt werden und der Button soll verschwinden. MainFrame Code import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class mainFrame extends JFrame implements ActionListener { //Objekt der klasse Test angelegt test t = new test(); //Button anlegen private JButton btntest = new JButton("New Layout"); Container cp = getContentPane(); public mainFrame(){ cp.setLayout(null); btntest.setBounds(100, 50, 100, 30); cp.add(btntest); setTitle(""); setSize(300,300); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); add(t, BorderLayout.CENTER); btntest.addActionListener(this); } public static void main(String[] args) { // TODO Auto-generated method stub new mainFrame(); } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if (arg0.getSource() == btntest) { cp.setVisible(false); t.setVisible(true); } } } Und hier das test layout was nachdem klick angezeigt werden soll.. import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; public class test extends JPanel { private JTextField txt1 = new JTextField(); private JTextField txt2 = new JTextField(); private JButton reset = new JButton("Zurücksetzten"); public test(){ setLayout(new BorderLayout(10,10)); add(txt1); add(txt2); add(reset); } } Die frage ist halt nun, wie kriege ich das hin ? Zitieren
Genodi Geschrieben 13. Mai 2014 Geschrieben 13. Mai 2014 Hi, also bitte nur vorab: Schreibe dir Klassen immer mit einem großen Anfangsbuchstaben. Es funktioniert zwar auch so, aber es wird nicht empfohlen, Klassen mit kleinen Buchstaben anzufangen. Nun zu deinem Problem: Ein JFrame kannst du dir im Grund als Fenster vorstellen. Ich würde jetzt versuchen einfach zwei JPanels zu machen, einmal mit dem Button und einen mit der zweiten Ansicht. Im Constructor vom JFrame kannst du dann den JPanel mit dem Button adden. Hier würde ich auch nicht unbedingt mit visible arbeiten. In der Action würde ich dann ein removeAll(); vom JFrame aufrufen und ein add für den zweiten JPanel. Zitieren
Gast KnapsackSolver Geschrieben 14. Mai 2014 Geschrieben 14. Mai 2014 Eigentlich ist deine Frage ganz einfach, wenn ich sie richtig verstanden habe. Du erzeugst einfach ein JFRAME und legst darauf ein Panel mit deinem Button etc... Wenn du nun auf den Button klickst, erzeugst du ein neues Panel und löschst dein alter. Jetzt musst du das neue Panel dem Frame übergeben und alles wieder neu zeichnen. So müsste dein Problem gelöst werden können. Zitieren
Marv04 Geschrieben 25. Mai 2014 Autor Geschrieben 25. Mai 2014 Sorry Jungs.. im Prüfungsstress Total vergessen hier wieder vorbei zu schauen.. Ich versteh was ihr meint bzw was ich machen soll.. mir fehlt aber die zündende idee das umzusetzten.. habt ihr da ein beispiel Code oder wisst wo ich das nachschlagen kann ? Im Constructor vom JFrame kannst du dann den JPanel mit dem Button adden. Hier würde ich auch nicht unbedingt mit visible arbeiten. In der Action würde ich dann ein removeAll(); vom JFrame aufrufen und ein add für den zweiten JPanel. Du meinst also ich solle die Buttons in ein JPanel auslagern ? habe ich jetzt gemacht (habe eine Mainframe und ein Startpanel mit den Buttons und drei weitere Panels die auf Button klick aufgerufen werden sollen), bin auch nun soweit das ich durch klick die verschiedenen Panels aufrufen kann, bin aber damit absolut nicht zufrieden.. ich kann es posten weiß aber nicht ob es eventuell zu viel ist. Zitieren
Gast KnapsackSolver Geschrieben 26. Mai 2014 Geschrieben 26. Mai 2014 Marv04, was passt dir denn dann noch nicht ? Also das eigentliche Problem ist jetzt gelöst ? und was willst du jetzt weiterhin verändern ? Du kannst natürlich auch einfach einige Komponenten ausblenden wenn du die für den Moment dann nicht mehr benötigst ... Zitieren
Marv04 Geschrieben 27. Mai 2014 Autor Geschrieben 27. Mai 2014 Hey SakulRelda, ja das eigentliche Problem ist gelöst, aber ich glaube es ist nicht Optimal gelöst. Ich Poste mal mein Startpanel wo sich das ganze abspielt. package view; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JPanel; public class Startpanel extends JPanel implements ActionListener{ private panelabc test1 = new test1(); private panel123 test2 = new test2(); private panelpic test3 = new test3(); private JButton btn1 = new JButton("Test1"); private JButton btn2 = new JButton("Test2"); private JButton btn3 = new JButton("Test3"); private JPanel AllBtn = new JPanel(); public Startpanel(){ AllBtn.add(Test1); AllBtn.add(Test2); AllBtn.add(Test3); Test1.addActionListener(this); Test2.addActionListener(this); Test3.addActionListener(this); setLayout(new BorderLayout(10,10)); add(AllBtn, BorderLayout.NORTH); //Test1 Panel hinzufügen add(Test1, BorderLayout.CENTER); Test1.setVisible(false); //Test2 Panel hinzufügen add(Test2, BorderLayout.WEST); Test2.setVisible(false); // Panel Test3 hinzufügen add(Test3, BorderLayout.EAST); Test3.setVisible(false); } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub if (arg0.getSource() == Test1) { AllBtn.setVisible(false); Test1.setVisible(true); } if (arg0.getSource() == Test2) { AllBtn.setVisible(false); Test2.setVisible(true); } if (arg0.getSource() == Test3) { AllBtn.setVisible(false); Test3.setVisible(true); } } } Es sieht jetzt so aus das sobald ich auf einen Button klicke das entsprechende Panel erscheint.. Das Problem ist aber noch das ich das ganze nicht Zentriert angezeigt bekomme, sobald ich bei allen drei Panels Borderlayout.Center stehen habe werden sie nach einem Klick nicht angezeigt. Erst sobald ich es so mache wie es jetzt zu sehen ist kriege ich die Panels angezeigt. :confused: Zitieren
Gast KnapsackSolver Geschrieben 27. Mai 2014 Geschrieben 27. Mai 2014 Ja du könntest auch mit Repaint oder Validate arbeiten. Laut API-Doc: public void repaint() : Repaints this component. public void validate() : Ensures that this component has a valid layout. This method is primarily intended to operate on instances of Container. Wenn du Layout veränderst, also irgendwelche Komponenten hinzufügst/entfernst, musst du dem Layoutmamager sagen, dass er sich bemühen muss -> (re)validate() (=neuberechnen) aufrufen das ruft auch repaint() auf Wenn du nur "zeichentechnisch" was änderst, ohne das Layout zu verändern, dann repaint() (=neuzeichnen) > Ich hoffe ich konnte dir damit ein neuen Ansatz zeigen Also du kannst im Prinzip dein Layout verändern und danach einfach die validate-methode aufrufen, so wird dann die Änderung angezegit Zitieren
Gast KnapsackSolver Geschrieben 27. Mai 2014 Geschrieben 27. Mai 2014 Ansonsten musst du ja immer mit setVisible arbeiten Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.