Custom JButton Feld aus Parent lesen lassen

ninonino

Mitglied
Hi
ich möchte eigene JButtons erstellen,welche über die Methode setMarked(boolean) verfügen.
Bei Aufruf von setMarked soll der Button eine im übergeordneten Container definierte Farbe welche dort mit
setMyColors() gesetzt wird annehmen.
Nun hat ein Container die setMyColors() methode ja noch nicht - weshalb der Versuch in MyButton eine Farbe mit
getParent().getMyMarkedColor abzurufen scheitert .
Muss wohl irgendwie mit interfaces arbeiten - verstehe aber das Prinzip nicht !
Hier der Container :
Java:
public class FrageInForum extends JPanel
{
private MyButton myButton ;	
private Color myBackgroundColor , myMarkedColor  ;	
	public FrageInForum()
	{
		setMyColors();
		myButton = new MyButton();
		
	}
	private void setMyColors ()
	{
		myBackgroundColor = Color.BLUE ;
		myMarkedColor = Color.RED ;	
	}
	public Color getMyBackgroundColor() {
		return myBackgroundColor;
	}
	public Color getMyMarkedColor() {
		return myMarkedColor;
	}
	
}
Hier der Button :
Java:
public class MyButton extends JButton
{
boolean marked ;
	public MyButton()
	{
		reset();
		setState();
	}
	public void setMarked(boolean marked) {
		this.marked = marked;
	}
	public void reset()				// Init
	{
		this.setBackground(this.getParent().getMyBackgroundColor());
	}
	private void setState()
	{
		if (marked = false)
		{
			this.setBackground(this.getParent().getMyBackgroundColor());
		}
		else
		{
			this.setBackground(this.getParent().getMyMarkedColor());
		}
	}
}
Den Code hab ich nur für die Frage erstellt .
Vielen Dank schonmal im voraus,schönen abend noch,nino
 
Interface wäre wohl auch eine Möglichkeit.
Einfache Referenzierung tut´s aber auch:
Java:
public class FrageInForum extends JPanel
{
private MyButton myButton ; 
private Color myBackgroundColor , myMarkedColor  ;  
    public FrageInForum()
    {
        setMyColors();
        myButton = new MyButton(this);
        
    }
    private void setMyColors ()
    {
        myBackgroundColor = Color.BLUE ;
        myMarkedColor = Color.RED ; 
    }
    public Color getMyBackgroundColor() {
        return myBackgroundColor;
    }
    public Color getMyMarkedColor() {
        return myMarkedColor;
    }
    
}

und

Java:
public class MyButton extends JButton
{
boolean marked ;
private FrageInForum fif;
    public MyButton(FrageInForum fif)
    {
    	this.fif = fif;
        reset();
        setState();
    }
    public void setMarked(boolean marked) {
        this.marked = marked;
    }
    public void reset()             // Init
    {
        this.setBackground(fif.getMyBackgroundColor());
    }
    private void setState()
    {
        if (marked = false)
        {
            this.setBackground(fif.getMyBackgroundColor());
        }
        else
        {
            this.setBackground(fif.getMyMarkedColor());
        }
    }
}
 
Erstmal danke für die Antwort.
Habe mich glaube ich nicht ganz klar ausgedrückt.
Ich möchte eine MyButton Klasse bauen und diese Buttons später auf verschiedenen,teilweise noch garnicht existierenden JPanels einsetzen.
Ich kenne also die Parents noch garnicht.
(( die Farbverwaltung soll später an einer zentralen Stelle erfolgen und die Panels sollen sich jeweils die Farben für Vorder-und Hintergrund holen ))
Bei der Instaziierung der MyButtons könnte ich ihnen zwar dann jeweils die Farben über eine Methode übergeben ,ich fände es nur 'eleganter' wenn das eben nicht nötig wäre sondern sie die Farben automatisch abrufen.
-Ist vielleicht ganz falsch gedacht,ich bin recht neu dabei 🙂
 
Nunja, getParent(); liefert dir ja ein Container-Objekt zurück und das hat von Haus aus keine getMyBackgroundColor()-Methode.
Auch ein cast auf JPanel bringt da aus dem gleichen Grund nichts.

Dann ist ein Interface wahrscheinlich die bessere Variante.
Bin aber grad auf Arbeit und und kann hier keinen Code basteln.
 
Java:
if (marked = false)
Das heisst übersetzt: Setze die Variable marked auf falsch und schau dann nach ob sie wahr ist. Was du vermutlich versuchst ist das hier:
Java:
if (marked == false)
= ... Zuweisung
== ... Vergleich
 
... wobei man in so einem Fall dann auch anstatt von
Java:
if (marked == false)
eher
Java:
if (!marked)
nehmen könnte.
 
so davon mal abgesehn, könnte es so funktionieren:

Java:
public interface ColorBox {
	
	public Color getMyBackGroundColor();

}

Java:
public class MyButton extends JButton {

	public void setMyColor(){
		Object ob = this.getParent();
		ColorBox cb = (ColorBox) ob;
		this.setBackground(cb.getMyBackGroundColor());
	}
	
}

Java:
public class FrageInForum extends JPanel implements ColorBox
{
private MyButton myButton ; 
private Color myBackgroundColor , myMarkedColor  ;  
    public FrageInForum()
    {
        setMyColors();
        myButton = new MyButton();
        this.add(myButton);//ohne das add(); wirds nichts mit nem parent xD
        myButton.setMyColor();
    }
    private void setMyColors ()
    {
        myBackgroundColor = Color.BLUE ;
        myMarkedColor = Color.RED ; 
    }
    
	@Override
	public Color getMyBackGroundColor() {
		return myBackgroundColor;
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(100, 100);
		frame.setLocationRelativeTo(null);
		
		frame.add(new FrageInForum());
		
		frame.setVisible(true);
	}
    
}

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Hi Vanny,
vielen Dank für den Hinweis aber ich komme irgendwie immer noch nicht weiter.
Habe ein kleines Beispiel erstellt und vielleicht sieht ja jemand meinen Fehler .
( 3 Buttons - der angeklickte wird rot )
A - Methoden in der View ---läuft
B - Interface - Methoden im Button ----NullPointerException

BEISPIEL A :
Java:
@SuppressWarnings("serial")
public class MyButton extends JButton {

	MyButton()
	{
				;
	}

 	public void addMarkedListener(ActionListener l)
	{
		this.addActionListener(l);
	} 
	   
}
Java:
@SuppressWarnings("serial")
public class View extends JPanel 
{
private MyButton myButton ;
private MyButton[]myButtons ;
private Color myMarkedColor,defaultBackGround ;
private String buttonInd ;
private int numberOfButtons ;

	public View()
	{
		defaultBackGround = this.getBackground();
		myMarkedColor = Color.RED ;	
		myButtons = new MyButton[3];
		numberOfButtons = myButtons.length;
		for ( int i = 0 ; i < numberOfButtons ; i++)
		{	
		myButton = new MyButton();
		myButtons[i] = this.myButton;
		buttonInd = String.valueOf(i+1);
		this.myButton.setText(buttonInd);
		this.myButton.setActionCommand(buttonInd);		
		this.add(myButton);
		}
		this.setVisible(true);
	}
	public void setIsMarked (JButton thisButton ,boolean isMarked)
	{
		if (isMarked == false)
		{
			thisButton.setBackground(defaultBackGround);
		}
		else
		{
			thisButton.setBackground(myMarkedColor);			
		}
	}
	public void resetButtons()
	{
		for ( int i = 0 ; i < numberOfButtons ; i++)
		{
			myButtons[i].setBackground(defaultBackGround);
		}
	}
	public MyButton[] getMyButtons() {
		return myButtons;
	}
	public int getNumberOfButtons() {
		return numberOfButtons;
	}
}
Java:
public class Controller
{
private View onePanel ;
private int buttonPicked ;

	public Controller()
	{
		onePanel = new View();
		addMarkedListener();
		onePanel.setVisible(true);		
	}
	public void addMarkedListener()
	{
		for (int i = 0 ; i < onePanel.getNumberOfButtons();i++ )
		{
			this.onePanel.getMyButtons()[i].addMarkedListener((new MarkedListener()));
		}
	}
	private class MarkedListener implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			buttonPicked = Integer.parseInt(e.getActionCommand());	
			for (int i = 0;i<onePanel.getNumberOfButtons();i++)
			{
				onePanel.resetButtons();
			}
			onePanel.setIsMarked(onePanel.getMyButtons()[buttonPicked-1],true);	
		}
	}
	public View getOnePanel() {
		return onePanel;
	}
}
Java:
public class Main 
{
JFrame mainFrame ;
View fif ;
Container c ;
	public Main()  
  	{
		mainFrame = new JFrame("Main");
		c = mainFrame.getContentPane();
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setExtendedState(mainFrame.getExtendedState() | mainFrame.MAXIMIZED_BOTH);
		Controller cont = new Controller();
		c.add(cont.getOnePanel());
		mainFrame.setVisible(true);
  	}
	public static void main(String[] args) {
		new Main();

	}
}

BEISPIEL B:
Java:
@SuppressWarnings("serial")
public class MyButton extends JButton {
private Container  ob ;
private ColorBox cb ;
private boolean marked ;

	MyButton()
	{
        ob = this.getParent();
        cb = (ColorBox) ob;	
        marked = false ;
        setMyColor();
	}
    public void reset()         
    {
        this.setBackground(ob.getBackground());
    }
    public void setMarked(boolean marked)
    {
    	this.marked = marked ;
    	this.setMyColor();
    }
    private void setMyColor()
    {
    	if (!marked)
    	{
        this.setBackground(cb.getMyMarkedColor()); //Hier wird Fehler gezeigt***************   		
    	}
    	else
    	{
        this.setBackground(ob.getBackground());    		
    	}
    }
	public void addMarkedListener(ActionListener l)
	{
		this.addActionListener(l);
	} 
}
Java:
public interface ColorBox
{
    public Color getMyMarkedColor();
}
Java:
@SuppressWarnings("serial")
public class View extends JPanel implements ColorBox
{
private MyButton myButton ;
private MyButton[]myButtons ;
private Color myMarkedColor ;
private String buttonInd ;
private int numberOfButtons ;

	public View()
	{
		myMarkedColor = Color.RED ;	
		myButtons = new MyButton[3];
		numberOfButtons = myButtons.length;
		for ( int i = 0 ; i < numberOfButtons ; i++)
		{	
			myButton = new MyButton();
			myButtons[i] = this.myButton;
			buttonInd = String.valueOf(i+1);
			this.myButton.setText(buttonInd);
			this.myButton.setActionCommand(buttonInd);		
			this.add(myButton);
		}
	}
	@Override
	public Color getMyMarkedColor() {
		return 	myMarkedColor;
	}
	public MyButton[] getMyButtons() {
		return myButtons;
	}
	public int getNumberOfButtons() {
		return numberOfButtons;
	}
}
Java:
public class Controller
{
private View onePanel ;
private int buttonPicked ;

	public Controller()
	{
		onePanel = new View();
		onePanel.setVisible(true);
		addMarkedListener();
		onePanel.setVisible(true);
	}
	public void addMarkedListener()
	{
		for (int i = 0 ; i < onePanel.getNumberOfButtons();i++ )
		{
			this.onePanel.getMyButtons()[i].addMarkedListener((new MarkedListener()));
		}
	}
	private class MarkedListener implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			buttonPicked = Integer.parseInt(e.getActionCommand());	
			for (int i = 0;i<onePanel.getNumberOfButtons();i++)
			{
				onePanel.getMyButtons()[i].reset();
			}
				onePanel.getMyButtons()[buttonPicked-1].setMarked(true);
		}
	}
	public View getOnePanel() {
		return onePanel;
	}
}
Java:
public class Main 
{
JFrame mainFrame ;
View fif ;
Container c ;
	public Main()  
  	{
		mainFrame = new JFrame("Main");
		c = mainFrame.getContentPane();
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setExtendedState(mainFrame.getExtendedState() | mainFrame.MAXIMIZED_BOTH);
		Controller cont = new Controller();
		c.add(cont.getOnePanel());
		mainFrame.setVisible(true);
  	}
	public static void main(String[] args) {
		new Main();

	}
}
Freue mich über Jeden Hinweis,einen schönen Sonntag
gruß,Nino
 
NPE is ja auch logisch^^
Du führst die setMyColors(); im Konstruktor von MyButton aus also in dem Moment, wenn der MyButton erzeugt wird. Dann ist getParent() == null weil du den Button ja noch nicht per add(); hinzugefügt hast. (siehe Kommentar in meinem BeispielCode)

Gruß Vanny
 
Vielleicht noch ne Frage:

Sind die Farbwerte statisch oder sollen sie zur Laufzeit verändert werden?
 
Hi,
vielen Danf für deine Mühe !
Ich möchte dem User in einer größeren Applikation die Möglichkeit geben zwischen verschiedenen FarbThemen zu wählen.( also nicht statisch )
Dachte ich käme irgendwie drumrum aber scheine mich wohl doch in Synth einarbeiten zu müssen.
Habe auch nochmal komplett von vorne angefangen und versuche jetzt nach dem test-first-Ansatz mit JUnit vorzugehen.
schönen Tag noch,Nino
 
Zum Abschluss:
Es geht darum dass alle ViewComponenten ein vorbestimmtes Aussehen annehmen und dieses nicht auf jeder einzelnen view neu definiert werden muss.
Entwurfsmuster Strategie
In den Konkreten Strategien würden dann die verschiedenen "looks" für die Komponenten bestimmt.

Strategie (Entwurfsmuster) ? Wikipedia

So könnte es doch gehen ?

gruß,Nino
 

Neue Themen


Zurück
Oben