Mit JRadioButton Event ein getContentPane ändern?

Klatz

Grünschnabel
Gibt es eine Möglichkeit, wie ich mit einem JRadioButton den Inhalt des Fensters ändere. Konkret habe ich auf der linken Seite eine JRadioButton Auswahl an kleinen Programmen und auf der rechten Seite sieht man das kleine Programm.

Im Falle eines Anklickens eines anderen Programms soll das rechte Programm durch ein anderes Programm ersetzt werden.

Durch

...

Potenzberechnung.addActionListener( this );

...

melde ich es an.

durch

...

Potenzberechnung.setActionCommand( "3" );

...

public void actionPerformed( ActionEvent evt)
{
if ( evt.getActionCommand().equals( "3" ) )
{
xyxy
Potenz();
repaint();
...

sage ich ihm in xyxy was er tun sollte, falls das jeweilige Programm ausgewählt ist. Das klappt auch soweit, wenn ich z.B. die Hintergrundfarbe ändern will. Doch ich versuche das rechte Programm durch ein anderes daduch zu ersetzten. Ich habe das hier ohne Erfolg versucht:

...

if ( evt.getActionCommand().equals( "3" ) )
{
getContentPane().setLayout( new FlowLayout() );
getContentPane().add( ProgrammePanel, BorderLayout.WEST );
getContentPane().add( test2, BorderLayout.EAST );
Potenz();
repaint();
}

...

Doch es hat sich nicht geändert.

1. Darf ich überhaupt getContentPane nachträglich ändern?

2. Gibt es eventuell eine andere Möglichkeit mein Vorhaben zu bewerkstelligen?
 
HuHu..

weiss nicht ob ich genau verstanden habe was du tuen willst: Über Radio Buttons "Programme" (sprich Panels?) austauschen? Sollte eigentlich kein problem sein. Das Problem bei deinem Beispiel ist denke ich mal dass das Repaint keine Wirkund zeigt. Veränder mal deine Größe des Frames, dann sollte es sichtbar sein. Hab mir deinen Code nicht im Detail angesehen, mal Quick and Dirty ging es bei mir:

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSplitPane;

/**
 * @author DD
 */
public class TestFrame {

	public static void main(String[] args) {

		final JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(500,600);
		frame.setLayout(new BorderLayout());
		

		//Radio Buttons
		JPanel buttons = new JPanel();
		JRadioButton r1 = new JRadioButton("Panel 1");
		r1.setActionCommand("1");
		JRadioButton r2 = new JRadioButton("Panel 2");
		r2.setActionCommand("2");
		final ButtonGroup group=new ButtonGroup();
		group.add(r1);
		group.add(r2);
		buttons.add(r1);
		buttons.add(r2);
		

		//Beispiel Panel 1
		final JPanel panel1 = new JPanel();
		panel1.setBackground(Color.white);
		panel1.add(new JLabel("Ich bin Panel1"));

		//Beispiel Panel 2
		final JPanel panel2 = new JPanel();
		panel2.setBackground(Color.yellow);
		panel2.add(new JLabel("Ich bin Panel2"));
		
		
		frame.getContentPane().add(buttons,BorderLayout.WEST);
		frame.setVisible(true);
		
		ActionListener al=new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
			
				String ac=group.getSelection().getActionCommand();
				System.out.println(ac);
				
				//2 Ausbelden und 1 Einblenden (bei dem Layout Manager nötig)
				if (ac.equals("1")) {
					frame.getContentPane().remove(panel2);
					frame.getContentPane().add(panel1,BorderLayout.CENTER);
					panel1.updateUI();
				} else {
					//1 Ausblenden und 2 Einblenden
					frame.getContentPane().remove(panel1);
					frame.getContentPane().add(panel2,BorderLayout.CENTER);
					panel2.updateUI();
				}
			}
			
		};
		
		r1.addActionListener(al);
		r2.addActionListener(al);
	}

}

1. Darf ich überhaupt getContentPane nachträglich ändern?

Eine sehr holperige Formulierung, nur um sicher zu gehen: getContentPane (ist eine Methode die änderst du ja nicht :) ) liefert dir bei deinem Frame ein Panel (quasi das Hauptpanel deines Frames), auf diesem Panel sind deine Elemente.

Anstatt das wie in meinem Beispiel zu machen (ich adde Elemente zum Content Pane, lasse das ContentPane aber ansich bestehen, weil bei mir da auch die Radio Buttons drauf sind) kannst du auch direkt das ContentPane verändern, indem du die verschiedenen Panels als neue ContentPanes deklarierst:

Code:
frame.setcontentPane(panel1);
panel2.updateUI();

in meinem Beispiel verschwinden dann nur die Radio Buttons mit :)

Hoffe behillflich gewesen zu sein
D
 
Du warst mir auf jeden Fall behilflich. Danke

Ich wusste nicht, das ich getContentPane().remove(p1); benutzen muss.

Jetzt kann ich alle Programme in mein "Hauptprogramm" mit einfügen. Zwar gibt er mir eine eigenartige Fehlermeldung aus, wenn ich zum ersten mal das Programm wechsel und man sieht die "Spuren" des alten Programms, falls das neue Panel kleiner als das alte ist, aber das müsste ich schnell beheben können. Falls jemand die Lösung jetzt schon weiß... habe ich das gesamte Programm hier: (Das Programm Primzahlenberechnung hat keine Funktion)
Code:
import java.awt.*; 
import java.awt.event.*;
import javax.swing.*;

public class alleProgramme extends JFrame implements ActionListener

     {
         
                        //INITIALISIERUNGEN ETC.   INITIALISIERUNGEN ETC.   INITIALISIERUNGEN ETC.   INITIALISIERUNGEN ETC.   
                        
                        JButton ok, ok2; 
                        JTextField text, text2, pText1, pText2;
                        JLabel lbl, lbl2, lbl3, lbl4, pErklärung, pMax, pErg, lblZU;
                        JPanel ProgrammePanel, Code, lbs, lbs2, test, test2, test3, test4, n, pAlles, pHaupt, p1, p2;
         
                        JRadioButton Zahlensystemumwandlung, Primzahlenberechnung, Potenzberechnung, Fakultät, ggT_Berechnung, 
                                     Außen_Innen_Tausch, Filius_Bonacci,Textgenerierung,von_Neumann_Simulator,Frohe_Weihnachten;
                        ButtonGroup  Programme;
         
                        String pString = "<html>Geben Sie eine Maximalzahl ein,<br> bis der alle Primzahlen gezählt<br> werden!<br><br></html>";
                        String wandeln_ = "<html>Wandeln Sie eine Dezimalzahl in eine<br>Binärzahl um!<br><br></html>";
                        String Zeilenumbruch = "<html><br></html>";
                        String Zeilenumbruch2 = "<html><br></html>"; 
              
public alleProgramme()

     {
         
//GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI ||| GUI       
         
      //RADIOBUTTONAUSWAHL GUI || RADIOBUTTONAUSWAHL GUI || RADIOBUTTONAUSWAHL GUI   
         
              Zahlensystemumwandlung = new JRadioButton("Zahlensystemumwandlung", true );
              Primzahlenberechnung   = new JRadioButton("Primzahlenberechnung"  , false );              
              Potenzberechnung       = new JRadioButton("Potenzberechnung"      , false );
              Fakultät               = new JRadioButton("Fakultät"              , false );
              ggT_Berechnung         = new JRadioButton("ggT_Berechnung"        , false );
              Außen_Innen_Tausch     = new JRadioButton("Außen_Innen_Tausch"    , false );
              Filius_Bonacci         = new JRadioButton("Filius Bonacci"        , false );
              Textgenerierung        = new JRadioButton("Textgenerierung"       , false );
              von_Neumann_Simulator  = new JRadioButton("von-Neumann-Simulator" , false );
              Frohe_Weihnachten      = new JRadioButton("Frohe Weihnachten"     , false );
              
              Programme = new ButtonGroup();
              Programme.add(Zahlensystemumwandlung );
              Programme.add(Primzahlenberechnung );
              Programme.add(Potenzberechnung );
              Programme.add(Fakultät );
              Programme.add(ggT_Berechnung );
              Programme.add(Außen_Innen_Tausch );
              Programme.add(Filius_Bonacci);
              Programme.add(Textgenerierung );
              Programme.add(von_Neumann_Simulator  );
              Programme.add(Frohe_Weihnachten );
              
              ProgrammePanel = new JPanel();
              ProgrammePanel.setLayout (new BoxLayout(ProgrammePanel , BoxLayout.Y_AXIS));
              ProgrammePanel.add( new JLabel("Programme") );             
              ProgrammePanel.add( Zahlensystemumwandlung );
              ProgrammePanel.add( Primzahlenberechnung );
              ProgrammePanel.add( Potenzberechnung );
              ProgrammePanel.add( Fakultät );
              ProgrammePanel.add( ggT_Berechnung );
              ProgrammePanel.add( Außen_Innen_Tausch );
              ProgrammePanel.add( Filius_Bonacci);
              ProgrammePanel.add( Textgenerierung );
              ProgrammePanel.add( von_Neumann_Simulator  );
              ProgrammePanel.add( Frohe_Weihnachten );
                  
     //PROGRAMME GUI || PROGRAMME GUI || PROGRAMME GUI
                
         //primzahlenberechnung
          
            pErklärung = new JLabel(pString ); 
             
            pMax = new JLabel ("Maximal");
            pText1 = new JTextField(7);
            pErg = new JLabel ("Anzahl");
            pText2 = new JTextField(7);
            lblZU = new JLabel (Zeilenumbruch2);
            ok2 = new JButton ("OK");
            pText2.setEditable    ( false );
                      
            p1 = new JPanel ();   
            p1.setLayout (new BoxLayout(p1, BoxLayout.Y_AXIS));
            p1.add(pErklärung);
            p1.add(pMax);
            p1.add(pText1);
            p1.add(pErg);
            p1.add(pText2);
            p1.add(lblZU);
            p1.add(ok2);
            
         //zahlensystemumwandlung
              
            lbl3   = new JLabel  (wandeln_);
            
            lbl    = new JLabel("Dezimalzahl");
            text   = new JTextField      ( 7 );
            lbl2   = new JLabel  ("Binärzahl");
            text2  = new JTextField      ( 7 );
            lbl4   = new JLabel  (Zeilenumbruch);
            ok     = new JButton        ("OK");
            text2.setEditable    ( false );
                              
            Code = new JPanel();
            Code.setLayout (new BoxLayout(Code , BoxLayout.Y_AXIS));
            Code.add(lbl3);
            Code.add(lbl);
            Code.add(text);
            Code.add(lbl2);
            Code.add(text2);
            Code.add(lbl4); 
            Code.add(ok);
            
     //BILDSCHIRMINHALT || BILDSCHIRMINHALT || BILSSCHIRMINHALT
                      
            getContentPane().setLayout( new FlowLayout() );
            getContentPane().add( ProgrammePanel, BorderLayout.WEST );
            getContentPane().add( Code, BorderLayout.EAST );
            
//LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER ||| LISTENER 
         
              //buttons
              
                ok.addActionListener ( this );
               ok2.addActionListener ( this );
               
              ok.setActionCommand("1");
             ok2.setActionCommand("2");
                
             //programme
                           
               Potenzberechnung.addActionListener( this );
         Zahlensystemumwandlung.addActionListener( this );
           Primzahlenberechnung.addActionListener( this );              
               Potenzberechnung.addActionListener( this );
                       Fakultät.addActionListener( this );
                 ggT_Berechnung.addActionListener( this );
             Außen_Innen_Tausch.addActionListener( this );
                 Filius_Bonacci.addActionListener( this );
                Textgenerierung.addActionListener( this );
          von_Neumann_Simulator.addActionListener( this );
              Frohe_Weihnachten.addActionListener( this );
                        
           Zahlensystemumwandlung.setActionCommand( "1" ); 
             Primzahlenberechnung.setActionCommand( "2" );           
                 Potenzberechnung.setActionCommand( "3" );  
                         Fakultät.setActionCommand( "4" ); 
                   ggT_Berechnung.setActionCommand( "5" ); 
               Außen_Innen_Tausch.setActionCommand( "6" ); 
                   Filius_Bonacci.setActionCommand( "7" ); 
                  Textgenerierung.setActionCommand( "8" ); 
            von_Neumann_Simulator.setActionCommand( "9" ); 
                Frohe_Weihnachten.setActionCommand( "10");
                
     }  //Ende von dec2bin()
     
//ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION ||| ACTION |||             
             
public void actionPerformed( ActionEvent evt)
  {
    if ( evt.getActionCommand().equals( "1" ) )
          {
           getContentPane().remove(p1);
           getContentPane().add(Code,BorderLayout.EAST);
           Code.updateUI(); 
           dec2bin2();
          }
    if ( evt.getActionCommand().equals( "2" ) )  
          {
                    getContentPane().remove(Code);
                    getContentPane().add(p1,BorderLayout.EAST);
                    p1.updateUI();
                    pProgramm();
          }
     if ( evt.getActionCommand().equals( "3" ) )
          {
             
          }
      if ( evt.getActionCommand().equals( "4" ) )
             {
              
             }
       if ( evt.getActionCommand().equals( "5" ) )
             {
            
             }
        if ( evt.getActionCommand().equals( "6" ) )
              {
              
              }
         if ( evt.getActionCommand().equals( "7" ) )
               {
              
               }
          if ( evt.getActionCommand().equals( "8" ) )
               {              
                    
               }
           if ( evt.getActionCommand().equals( "9" ) )
               {
                   
               }
            if ( evt.getActionCommand().equals( "10" ) )
               {
                               
               }
    repaint();  
  }
  
//PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME ||| PROGRAMME |||

    //Zahlensystemumwandlung         
    
         void dec2bin2()
         {
             String name = text.getText();
    
             int Dezimalzahl = Integer.parseInt( name );
    
             String digits = "01";
             String binary = "";
    
             while (Dezimalzahl != 0) 
                {
                  binary = digits.charAt(Dezimalzahl % 2) + binary;
                  Dezimalzahl = Dezimalzahl / 2;
                }
        
             text2.setText( binary + "" );
         }
         
    //Primzahlenberechnung
  
           void pProgramm()
             {
                String name2 = pText1.getText();
                String binary2 = "";
                String digits2 = "01";    
                int Dezimalzahl2 = Integer.parseInt( name2 );
                binary2 = digits2.charAt(Dezimalzahl2 % 2) + binary2;
                pText2.setText( binary2 + "" );
             }
         
     
public static void main(String[] args) 
 
   {
        alleProgramme fenster = new alleProgramme();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(500,300);
        fenster.setVisible(true);
       
   }
}
 
Ich wusste nicht, das ich getContentPane().remove(p1); benutzen muss.

Das musst du nicht! Nur das liegt am verwendeten Layoutmanager. Wenn du ein BorderLayout verwendest, und beim wechsel der Panels das Panel2 dem BorderLayout mit "Center" gibst, stellt er Panel1 und Panel2 nebeneinander dar, und das willst du ja nicht. Bei anderen Layoutmanagern kann das dann anders aus sehen (GridbagLayout z.B)
 
Zwar gibt er mir eine eigenartige Fehlermeldung aus, wenn ich zum ersten mal das Programm wechsel und man sieht die "Spuren" des alten Programms

Das ist keine komische Fehlermeldung :D da steht sogar sehr deutiglich was sein problem ist, kannst deinem Java ruhig glauben:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""

Beim wechseln deiner Panels rufst du direkt die Methode zum umwandeln auf (warum? Der User hat doch noch gar nichts eingegebene, die Methode sollte doch erst nach dem klick auf "ok" aufgerufen werden oder?) Dennoch solltest du deine Eingabe abfangen. Das Problem ist das du "einfach" versuchst das Textfeld als Zahl um zu wandeln, wenn ich da "ssss" eingebe, wird das nicht funktionieren :) bau so was um deinen Cast rum:

Code:
int dezimalzahl=0; //variablen klein schreiben, (finale Variablen NUR GROSS)
		try {
			dezimalzahl = Integer.parseInt(name);
		} catch (NumberFormatException ex) {
			JOptionPane.showMessageDialog(this, "Bitte geben Sie eine gültige Zahl ein");
		}

und bei deinem Actionperform den Methodenaufruf raus nehmen und statt dessen mit den Button verbinden.
 
Hallo zusammen,

So wie ich es sehe köenntest du beide Panels aufeinmal erstellen sie auf einen Panel zusammen führen und mit setVisible(true) bzw. false sichtbar und unsichtbar machen.

VG
Peter
 
Zurück