Announcement

Collapse
No announcement yet.

Layout zur Laufzeit Radiobutton-gesteuert ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Layout zur Laufzeit Radiobutton-gesteuert ändern

    Hallo zusammen,

    habe folgende ("Newbie"-)Frage: Es soll zur Laufzeit das Layout eines inneren Panels geändert werden können (über Radiobuttons, die heißen im untenstehenden Listing heißen flowLayout, borderLayout und gridLayout).

    Ich habe mir nachfolgende (wohl zu) simple Lösung (hier: Fragment) überlegt, aber das funktioniert nicht.

    Eigentlich dachte ich, dass über die Fallunterscheidungen in der Methode "panelVeraendern()" die entsprechenden Layouts bei der Wahl eines Radiobuttons dann auch angezeigt werden. Es passiert aber nichts.
    Hingegen funktioniert der erste Aufruf aus dem Konstruktor heraus (wenn die Oberfläche angelegt wird) einwandfrei (also die Zeile "JPanel veraenderbaresPanel = panelVeraendern(0);". Wenn man hier die 0 durch 1 oder 2 ersetzt, reagiert die Methode richtig.)
    Scheint also irgendwie mit den Radiobuttons zu tun zu haben.

    Ich würde mich über einen Hinweis freuen, was ich falsch mache.
    Vielen Dank!
    Schrdro



    -----------------------------------------------------------------------------------------------------------
    Code:
    public class LayoutGUI_V1 extends JFrame {
    
    …..
    	
    //Methode, um ein Panel anzulegen, dessen Layout sich gesteuert durch Radiobuttons verändern kann
    // Die Methode wird mit Parameterwert 0, 1 oder 2 aufgerufen, hierüber soll das Layout gesteuert werden
    		private JPanel panelVeraendern(int val) {
    				JPanel tempPanel = new JPanel();
    				if (val == 0) 
    				tempPanel.setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
    				if (val == 1) 
    				tempPanel.setLayout(new FlowLayout(FlowLayout.RIGHT,10,10));
    				if (val == 2) 
    				tempPanel.setLayout(new GridLayout(0,3));
    		
    		//Labels für das Panel mit dem variablen Layout
    		text1 = new JLabel("Text1");
    		text2 = new JLabel("Text2");
    		text3 = new JLabel("Text3");
    		text4 = new JLabel("Text4");
    		
    		tempPanel.add(text1);
    		tempPanel.add(text2);
    		tempPanel.add(text3);
    		tempPanel.add(text4);
    		
    		tempPanel.setBorder(new TitledBorder("Panel mit veränderbarem Layout"));
    		return tempPanel;
    	}
    …
    
    //Der Itemlistener soll je nachdem, welcher Radiobutton gewählt ist, den Parameterwert 0, 1 oder 2 
    //setzen und dann die Methode panelVeraendern() aufrufen. In dieser Methode wird dann abhängig 
    //vom Wert 0, 1 0der 2 das Layout ausgewählt.		
    	//Innere Klasse für den ItemListener (reagiert auf Betätigung Radiobuttons)
    		class MeinListener implements ItemListener {
    			@Override
    			public void itemStateChanged(ItemEvent e) {
    			if(flowLayout.isSelected() == true)	
    			panelVeraendern(0);
    				
    		if(borderLayout.isSelected() == true)	
    			panelVeraendern(1);	
    		
    		if(gridLayout.isSelected() == true)	
    			panelVeraendern(2);
    			}
    		}
    	
    	//Konstruktor - hier werden die Unterpanel angelegt
    	public LayoutGUI_V1 (String titel) {
    		
    		super(titel);
    		JPanel auswahlpanel = panelZurAuswahl();
    		JPanel veraenderbaresPanel = panelVeraendern(0);
    		setSize(600,200);
    		setLayout(new GridLayout(0,2));
    		add(auswahlpanel);
    		add(veraenderbaresPanel);
    		//Listener für die Radiobuttons verbinden
    		MeinListener listener = new MeinListener();
    		flowLayout.addItemListener(listener);
    		borderLayout.addItemListener(listener);
    		gridLayout.addItemListener(listener);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setResizable(false);
    		//pack();
    		setVisible(true);
    	}}

  • #2
    schon mal ein
    tempPanel.validate()
    (bzw. auf den Parent des Panels) gemacht? Ob du in panelVeraendern(int val) landest wirst du ja wohl schon durch debuggen festgestellt haben. Des Weiteren fällt auf, dass die Methode ein Panel zurückgibt, diese Rückgabe aber nicht ausgewertet wird (das neue Panel hat dann wen als Parent?)
    Zuletzt editiert von Christian Marquardt; 11.09.2013, 16:48.
    Christian

    Comment


    • #3
      Hallo Christian,
      vielen Dank für den Hinweis mit der nicht ausgewerteten Rückgabe! Insgesamt scheint mir die Lösung nicht sehr sinnvoll zu sein, weil das Panel ja imer wieder neu angelegt will, obwohl man ja eigentlich nur das Layout ändern will. Ich habe noch einen zweiten Lösungsversuch gemacht (siehe unten), der dieses Problem (hoffentlich) vermeidet, d.h. hier wird das zu verändernde Panel nur einmal (am Anfang) angelegt. Geht aber auch nicht.
      In diesem 2. Entwurf wird am Anfang für das Panel, das geändert werden soll, eine Instanzenvariable ("veraenderbaresPanel") vereinbart. Hierauf greift nun der Listener mit "veraenderbaresPanel.setLayout(new ...)" direkt zu.
      Die Bedingungen im Listener werden bei Betätigung der Radiobuttons korrekt ausgewertet, aber auch hier wird die zugeordnete Aktion nicht umgesetzt.
      Vielen Dank ... ! Olaf

      Code:
      …
      
      public class LayoutGUI_V2 extends JFrame {
      …
      private JRadioButton flowLayout, borderLayout, gridLayout;
      		
      	private JLabel text1, text2, text3, text4;
      	
      	private JPanel veraenderbaresPanel;
      …
      	//In dieser Lösung wird das veränderliche Panel einmal angelegt, also nicht
      // jedes Mal wieder neu.
      	private JPanel veraenderbaresPanelAnlegen() {
      		JPanel tempPanel = new JPanel();
      		//Labels für das Panel mit dem variablen Layout
      		text1 = new JLabel("Text1");
      		text2 = new JLabel("Text2");
      		text3 = new JLabel("Text3");
      		text4 = new JLabel("Text4");
      		
      		tempPanel.add(text1);
      		tempPanel.add(text2);
      		tempPanel.add(text3);
      		tempPanel.add(text4);
      		tempPanel.setBorder(new TitledBorder("Panel mit veränderbarem Layout"));
      		return tempPanel;
      	}
      	
      …..		
      	//Innere Klasse für den ItemListener (reagiert auf Betätigung Radiobuttons)
      		class MeinListener implements ItemListener {
      			@Override
      			public void itemStateChanged(ItemEvent e) {
      				
      			if(flowLayout.isSelected() == true)	
      			veraenderbaresPanel.setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
      			if(borderLayout.isSelected() == true)	
      			veraenderbaresPanel.setLayout(new  FlowLayout(FlowLayout.RIGHT,10,10));
      			if(gridLayout.isSelected() == true)	
      			veraenderbaresPanel.setLayout(new GridLayout(0,3));}
      			}}
      	
      	//Konstruktor - hier werden die Unterpanel angelegt
      	public LayoutGUI_V2 (String titel) {
      		super(titel);
      		JPanel auswahlpanel = panelZurAuswahl();
      		veraenderbaresPanel = veraenderbaresPanelAnlegen();
      		setSize(600,200);
      		//Layout für das Hauptpanel, das nicht verändert wird
      		//2 Spalten, eine für das veränderbare Panel, eine für die Radiobuttons
      		setLayout(new GridLayout(0,2));
      		add(auswahlpanel);
      		add(veraenderbaresPanel);
      		//Listener für die Radiobuttons verbinden
      		MeinListener listener = new MeinListener();
      		flowLayout.addItemListener(listener);
      		borderLayout.addItemListener(listener);
      		gridLayout.addItemListener(listener);
      		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		//Größenveränderung des Hauptpanels verhindern
      		setResizable(false);
      		//pack();
      		setVisible(true);
      	}}

      Comment


      • #4
        Ich kann da keine Änderung sehen

        JPanel tempPanel = new JPanel();

        ist immer noch neu.
        Auch müssten aus dem Panel erstmal die schon vorhandenen Elemente mit remove gelöscht werden, wenn immer ein und das selbe genutzt werden soll.
        Weiterhin muss nach einer Änderung die validate Methode aufgerufen werden. Sowohl für das Parent, was ein neues Kind/Panel bekommt, als auch für das neue Panel selbst.
        Soll ich ein Demo schreiben?
        Christian

        Comment


        • #5
          Hallo Christian,
          das wäre sehr nett!

          Zu Deinem Einwand:
          Ich kann da keine Änderung sehen

          JPanel tempPanel = new JPanel();

          ist immer noch neu.
          Im 2. Listing ist es ja so, dass das "tempPanel" nur einmal angelegt wird, nämlich wenn die Methode "veraenderbaresPanelAnlegen" aus dem Konstruktor heraus augerufen wird. Es wird - im Gegensatz zur ersten Lösung - nicht mit jedem Radiobutton-Klick immer wieder neu erzeugt.
          Aber wie gesagt, erfolgreicher ist der 2. Lösungsversuch auch nicht...
          Olaf

          Comment


          • #6
            Das mit dem validate willst du nicht probieren...
            Christian

            Comment


            • #7
              Doch, bin mir damit nur leider nicht so vertraut

              Comment


              • #8
                veraenderbaresPanel.setLayout(new GridLayout(0,3));
                veraenderbaresPanel.validate();

                analog bei den anderen auch
                Christian

                Comment


                • #9
                  danke

                  Originally posted by Christian Marquardt View Post
                  veraenderbaresPanel.setLayout(new GridLayout(0,3));
                  veraenderbaresPanel.validate();

                  analog bei den anderen auch
                  Klappt, super, herzlichen Dank!!

                  Comment


                  • #10
                    ...Schön :-)
                    Christian

                    Comment

                    Working...
                    X