Adrian_S Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 Hallo ! Zur Übung wollte ich ein kleines Programm schreiben mit einer Benutzeroberfläche .... bis ich auf folgendes Problem stieß: Ich erzeuge in meiner main ein JFrame und in diesem JFrame habe ich ein Container in dem ein Panel sitzt. so weit so gut .... nun hab ich noch ein JMenuBar mit einem JMenu in dem 2 JRadioMenuItems gruppiert sind. Wenn ich nun eins der JRadioMenuItems aktiviere soll ein anderes Panel in den Container rein. Ich glaube das mein Problem jetzt hoffentlich klar ist ... da das alles im Konstruktor passiert ändert sich das Panel während der Laufzeit nicht. kann sein das ich da irgendwas nicht verstehe. Wenn eins der JRadioMenuItems aktiviert ist durch .isSelected(true) funktionierts. habe es schon mit Actionlistenern probiert aber das haut auch nicht hin. Ich brauche irgendeine Methode die das komplette Fenster schließt und neustart damit die komplette Oberfläche neufgebaut wird und zwar abhängig vom selektierten JRadioMenuItem. Es sei denn ihr habt nen besseren vorschlag wie man sowas machen kann. JFrame Konstruktor: CounterFrame() { setBackground(Color.BLACK); setTitle("Counter"); setSize(240,280); setResizable(false); JMenuBar jbar = new JMenuBar(); JMenu modus = new JMenu("Modus"); JRadioButtonMenuItem gfx_modus = new JRadioButtonMenuItem("GFX Modus"); JRadioButtonMenuItem txt_modus = new JRadioButtonMenuItem("TXT Modus"); jbar.add(modus); modus.add(gfx_modus); modus.add(txt_modus); ButtonGroup modus_gruppe = new ButtonGroup(); modus_gruppe.add(gfx_modus); modus_gruppe.add(txt_modus); gfx_modus.setSelected(true); setJMenuBar(jbar); Container content = getContentPane(); CounterControlPanel control_panel = new CounterControlPanel(); setLayout(new BorderLayout()); if (gfx_modus.isSelected()) { GFXCounterPanel counter_panel = new GFXCounterPanel(); content.add(counter_panel, BorderLayout.CENTER); content.add(control_panel, BorderLayout.SOUTH); } else { if (txt_modus.isSelected()) { LABELCounterPanel counter_panel = new LABELCounterPanel(); content.add(counter_panel, BorderLayout.CENTER); content.add(control_panel, BorderLayout.SOUTH); } } } Hoffe das ich das problem einigermaßen verständlich formuliert hab. Ich danke für jede Antwort. Gruß Adrian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 Hmm?? Es muß doch möglich sein, zur Laufzeit herauszufinden, welcher RadioButton aktiv ist. Da gibt's garantiert 'nen Listener für. Und dann einfach austauschen... Ich geh' mal schauen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whatever Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 So kann das schonmal nicht gehen. Die if(...isSelcted) werden ja direkt im Konstruktor geprüft, und da sind sie natürlich noch nicht aktiv. 1.) Deine Klasse muss als erstes mal die Abstrakte Klasse ActionListener implementieren ( class Gui externs JFrame implements ActionListener { ... ) 2.) Nun muss du noch die Methode actionPerformed() implementieren (wenn du eine vollwertige IDE wie Eclipse benutzt, wird er dir das auch mitteilen). Dazu baust du einfach diesen Code ein: void actionPerformed(ActionEvent e) { //siehe Punkt 3 } 3.) Jetzt musst der ActionListener noch zwischen den beiden Radiobuttons unterscheiden lernen, dazu brauchst du Code in dieser Art (innerhalb von actionPerformed() ): String cmd = e.getActionCommand(); if(cmd == "Gfx") { //foo } else if(cmd == "Txt) { //bar } Man könnte natürlich auch nen Switchblock benutzen, muss man aber nicht. 4.) Die Buttons brauchen einen Actioncommand. Das machst du mit: gfx_modus.setActionCommand("Gfx"); //für den anderen auch 5.) Jetzt müssen die Buttons noch wissen, an wen sie ihren NAchrichten schicken sollen. Da die Klasse in diesem Fall selbst der ActionListener ist, brauchst du nur ein: gfx_modus.addActionListener(this); //für den anderen auch Eigentlich ganz einfach Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 11. November 2005 Autor Teilen Geschrieben 11. November 2005 Es muß doch möglich sein, zur Laufzeit herauszufinden, welcher RadioButton aktiv ist. Da gibt's garantiert 'nen Listener für. Ja das ist möglich --> .isSelected(); Danke für die Antwort nur leider war nicht das die Problemstellung. Ich möchte nicht wissen welcher selektiert ist, sonder das je nach dem welcher von den RadioButtons selektiert ist, die Oberfläche sich ändert. in dem fall ein anderes Panel einem Container geaddet wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 11. November 2005 Autor Teilen Geschrieben 11. November 2005 Danke für die schnellen antworten ! nur leider auch nicht das was mir helfen könnte so hatte ich das auch schon gehabt mit den Actionlistenern: String cmd = e.getActionCommand(); if(cmd == "Gfx") { //foo } else if(cmd == "Txt) { //bar } ... nur wußt ich dann nicht wie ich meinem programm mitteilen soll das er das fenster neuaufbauen muß und dem container "content" das panel added , das (mittels dem JRadioButton) gewählt wurde. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 Mit content.remove() die eine Component entfernen und mit content.add() die andere dazufügen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 11. November 2005 Autor Teilen Geschrieben 11. November 2005 Danke ! Das mit content.remove(gfx_counter_panel); war gut Jetzt hab ich das Panel mittels ActionListener entfernt nur leider krieg ich kein neues Panel geadded Ich platz irgendwann , das kann doch net so schwer sein hier nochmal mein modifizierter code schnipsel (Frame Kontruktor und der ActionListener): public class CounterFrame extends JFrame { private String path = "Counter/Digitals/"; private int number; private GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel(); private TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel(); private CounterControlPanel control_panel = new CounterControlPanel(); private Container content = getContentPane(); CounterFrame() { setBackground(Color.BLACK); setTitle("Counter"); setSize(240,280); setResizable(false); setLayout(new BorderLayout()); content.add(gfx_counter_panel, BorderLayout.CENTER); content.add(control_panel, BorderLayout.SOUTH); JMenuBar jbar = new JMenuBar(); JMenu modus = new JMenu("Modus"); JRadioButtonMenuItem gfx_modus = new JRadioButtonMenuItem("GFX Modus"); JRadioButtonMenuItem txt_modus = new JRadioButtonMenuItem("TXT Modus"); jbar.add(modus); modus.add(gfx_modus); gfx_modus.setSelected(true); gfx_modus.addActionListener(new JRadioButtonListener()); modus.add(txt_modus); txt_modus.addActionListener(new JRadioButtonListener()); ButtonGroup modus_gruppe = new ButtonGroup(); modus_gruppe.add(gfx_modus); modus_gruppe.add(txt_modus); setJMenuBar(jbar); } public class JRadioButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if(command == "GFX Modus") { content.remove(txt_counter_panel); GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel(); content.add(gfx_counter_panel, BorderLayout.CENTER); repaint(); } else { if(command == "TXT Modus") { content.remove(gfx_counter_panel); TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel(); content.add(txt_counter_panel, BorderLayout.CENTER); repaint(); } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 Strings vergleicht man mit strA.equals(strB); if(command.equals("GFX Modus")) { content.remove(txt_counter_panel); GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel(); content.add(gfx_counter_panel, BorderLayout.CENTER); repaint(); } else if(command.equals("TXT Modus")) { content.remove(gfx_counter_panel); TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel(); content.add(txt_counter_panel, BorderLayout.CENTER); repaint(); } } lies dir mal einpaar tutorials durch... javabuch u.s.w. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 11. November 2005 Autor Teilen Geschrieben 11. November 2005 danke für deinen Tip ... ich weiß auch nicht genau warum ich den Vergleichoperator für die Strings verwendet hab .... Es funktioniert trotzdem nicht. Das Programm entfernt bei auswahl das Panel fügt dann aber kein neues hinzu. ich glaub ich kapier da was nicht... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 11. November 2005 Teilen Geschrieben 11. November 2005 So wie ich das sehe hast du jetzt 2 Klassen. Zum einen den CounterFrame und dann den JRadioButtonListener. In dem JRadioButtonListener benutzt du content. Das ist aber ein private attribute aus der Frame Klasse. Außerdem erstellst du im ActionListener neue Instanzen der Klassen TXT_CounterPanel bzw. GFX_CounterPanel. Die sind dann aber wiederum nur in der JRadioButtonListener Klasse bekannt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 12. November 2005 Teilen Geschrieben 12. November 2005 So wie ich das sehe hast du jetzt 2 Klassen. Zum einen den CounterFrame und dann den JRadioButtonListener. In dem JRadioButtonListener benutzt du content. Das ist aber ein private attribute aus der Frame Klasse. Außerdem erstellst du im ActionListener neue Instanzen der Klassen TXT_CounterPanel bzw. GFX_CounterPanel. Die sind dann aber wiederum nur in der JRadioButtonListener Klasse bekannt Genau. Naja. Fast. So wie ich das sehe, ist JRadioButtonListener eine innere Klasse und kann so auf die Attribute der äußeren Klasse zugreifen. Mit content.remove(txt_counter_panel) entfernst Du korrekt das vorher hinzugefügte Panel. Mit content.add() fügst Du in Deinem Code aber ein neu initialisiertes (und somit leeres) Panel hinzu. Dazu verdeckst Du mit der Variablendeklaration die Variable der Klasse CounterFrame. Um es auf einen Punkt zu bringen: if(command == "GFX Modus") { content.remove(txt_counter_panel); content.add(gfx_counter_panel, BorderLayout.CENTER); repaint(); } else if(command == "TXT Modus") { content.remove(gfx_counter_panel); content.add(txt_counter_panel, BorderLayout.CENTER); repaint(); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 12. November 2005 Autor Teilen Geschrieben 12. November 2005 Danke Newlukai ! Ich glaub somit ist mein Problem gelöst Hab das eben auch schon probiert ! Vielen dank für die vielen Antworten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 13. November 2005 Teilen Geschrieben 13. November 2005 Und was lernen wir daraus? Schau' Dir noch einmal die Grundlagen der OOP an. Denn an denen kommst Du nicht vorbei. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 13. November 2005 Autor Teilen Geschrieben 13. November 2005 Hi, ich nochmal Mit den OOP´s bin ich eigentlich vertraut, ich hab halt nicht so viel Zeit zu üben. Bin im ziemlichen stress, in letzter zeit Schreibe ein haufen Klausuren und das nicht nur in JAVA. Ich hoffe das geht in ordnung wenn ich euch mit meinem Problem, wenn auch (im nachhinein) bißchen überflüssigen, bombardiert hab Danke an alle die geantwortet haben !:beagolisc Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 14. November 2005 Teilen Geschrieben 14. November 2005 auch sehr hilfreich: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTabbedPane.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 15. November 2005 Teilen Geschrieben 15. November 2005 den OOP´s nicht schlecht. Ich will Dir ja nichts vorwerfen. Ich wollte Dich nur darauf stoßen, daß es damit wohl noch etwas hapert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.