buttons über getSelected ansprechen

Status
Nicht offen für weitere Antworten.

schlydi

Mitglied
Hallo,

ich habe eine Klasse, in der ich über eine Funktion mehrere ButtonGroups per Array erstelle in etwa:

Java:
for (int i=0; i<7; i++) {
	    		p2.add(tb = new JToggleButton(cd[i][0] + cd[i][1] + cd[i][2] )); 
	    			tb.addActionListener(cbg3);
	    			tb.setActionCommand(cd[i][2]);
	    			bg1.add(tb);
	    		}
	        }

Jetzt würde ich gerne über einen Decorator bei Klick auf einen bestimmten Button das gleiche Bild haben, nur den ausgewählten Button einfärben und die anderen nicht auswählbar machen.. Mein Problem ist, daß ich zwar über bg1.getSelection() die ausgewählten Buttons kriege, aber als ButtonModel. Wie komme ich vom ButtonModel zum eigentlichen Button? Habe ich da einfach eine Schleife im Hirn? ???:L

Danke schonmal,
schlydi
 
das ButtonModel kennt seinen Button standardmäßig nicht,
da ist eine gewollte Indirekten, die nicht immer schön ist,
z.B. weiß ein TableModel nicht, welche Zeilen/ Zellen aktuell selektiert sind (SelectionModel in JTable)
während ein Model zur ComboBox dagegen das selektierte Element gleich mitverwaltet,
anderseits ist das auch gar nicht immer möglich, z.B. wenn zwei Tabellen das gleiche TableModel verwenden..

genug abgeschweift, vom ButtonModel kommst du nicht an den Button,
entweder baust du dein eigenes Model mit zusätzlicher Funktionalität oder du hast noch eine separate Datenstruktur,
z.B. irgendwo eine Map Model -> Button
 
danke, über eine Map komme ich jetzt an den Button, allerdings klappt mein Vorhaben, das Aussehen über einen Decorator zu verändern nicht wirklich.

Java:
public class TryButton extends JFrame { //zu dekorierende Klasse
		

		public void build(final Container pane) throws IOException {

	        //erstellt ein Panel mit verschiedenen ButtonGroups, normales Aussehen
	    }
		
		public class UpdateList implements ActionListener {
			
			//mit dem ActionListener rufe ich die Klasse Decorator auf und übergebe meine alte Klasse und ein Array mit 3 gespeicherten Buttons
			public void actionPerformed(ActionEvent e) {
				AbstractButton[] asb = showVoice();
				Decorator d = new Decorator(new TryButton("Landtagswahl in Schleswig-Holstein"), asb);
				try {
					d.createAndShow(); //hier sollte dann eigentlich ein neues Fenster mit neuen Eigenschaften kommen, sieht aber genauso aus wie das alte..
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	    
		//zeigt Ergebnis von build() an
	    public void createAndShow() throws IOException {
	        //erstelle neues Objekt TryButton
			TryButton frame = new TryButton("Hallo");
	    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        frame.build(frame.getContentPane());
	        frame.pack();
	        frame.setVisible(true);
	    }
	    
	    
	    public AbstractButton[] showVoice() {
	    	
	    	AbstractButton eins;
			AbstractButton zwei;
			AbstractButton drei;
			AbstractButton[] ab = new AbstractButton[3];
			
			//if (bg3.getSelection()== null) {
				bm1 = bg1.getSelection();
				eins = map.get(bm1);
				bm2 = bg2.getSelection();
	        	zwei = map.get(bm2);
	        	ab[0] = eins;
	        	ab[1] = zwei;
	    	//}
			
			//else {
				bm3 = bg3.getSelection();
				drei = map.get(bm3);
				ab[2] = drei;
			//}

			return ab;
	    }
	    
	    public static void main(String[] args) throws IOException{
	        //rufe Methode createAndShow auf
	    	TryButton show = new TryButton("Hallo");
	    	show.createAndShow();
	    }
}

Meine Decorator-Klasse sieht so aus:
Java:
public class Decorator extends TryButton {
	
	TryButton button;
	AbstractButton[] asb;
	
	public Decorator(TryButton button, AbstractButton[] asb) {
		super("Hallo");
		this.button = button;
		this.asb = asb;
	}
	//Versuch, die build()-Methode zu ergänzen
	public void build() throws IOException {
		
		if (asb[2] == null) {
			button.build(button.getContentPane());
			asb[0].setOpaque(true);
			asb[0].setBackground(Color.red);
			asb[1].setOpaque(true);
			asb[1].setBackground(Color.red);
		}
		else {
			button.build(button.getContentPane());
			asb[2].setOpaque(true);
			asb[2].setBackground(Color.red);
		}
		
		button.build(button.getContentPane());
	}
	
	public void createAndShow() throws IOException {

    	Decorator frame = new Decorator(button, asb);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //hier müßte dann eigentlich das alte Objekt mit den neuen Eigenschaften erstellt werden 
        frame.build(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }
	
}

ich hoffe, mein problem ist verständlich.
 
meine Güte, hast du viele JFrames da,
um das eine Original-Frame mit verrückten Namen TryButton sowie das Decorator-Frame anzuzeigen, werden gleich 5 JFrames erzeugt,
3 davon logischerweise nicht genutzt,

fängt in der main-Methode an: die erzeugt einen TryButton, also ein vollständiges JFrame,
dessen createAndShow()-Methode erzeugt aber selber nochmal einen TryButton, der dann auch angezeigt wird,
wieso nicht sich selber anzeigen? createAndShow() gehört doch bereits zu einem fertigen TryButton

in UpdateList (fast noch verrückterer Name für einen ActionListener)
wird dann das dritte TryButton-Frame erstellt, hätte nicht eines der ersten beiden ausgereicht?

dieses geht an ein Decorator, zusammen mit den Buttons,
die createAndShow()-Methode von Decorator erstellt mal wieder noch ein ganz neues Decorator-Frame,
welchem diesmal immerhin sparsamerweise das schon vorhandene TryButton-Frame übergeben wird,
sowie die Buttons

die build()-Methode wird nicht aufgerufen, mit anderer Parameteranzahl kann sie die build(Container) Methode aus TryButton kaum überschreiben,
auch werden darin die Buttons zwar bearbeitet, aber anscheinend nirgendwo genutzt?

vielleicht reicht es, statt
> frame.build(frame.getContentPane());
nur
frame.build();
aufzurufen


-----

man kann übrigens Componenten nicht mehrmals anzeigen, wenn sie irgendwo neu eingefügt werden,
verschwinden sie bestenfalls aus ihrer alten Position, oder es hagelt Exceptions
 
Die Namen ergeben schon einen Sinn, jedenfalls bei mir.. aber dank Reduktion der JFrames und Angleichen der Parameter funktioniert das jetzt, danke 🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben