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
 
V

vanny

Gast
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());
        }
    }
}
 

ninonino

Mitglied
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 :)
 
V

vanny

Gast
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.
 

bERt0r

Top Contributor
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
 

GUI-Programmer

Top Contributor
... wobei man in so einem Fall dann auch anstatt von
Java:
if (marked == false)
eher
Java:
if (!marked)
nehmen könnte.
 
V

vanny

Gast
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:

ninonino

Mitglied
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
 
V

vanny

Gast
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
 
V

vanny

Gast
Vielleicht noch ne Frage:

Sind die Farbwerte statisch oder sollen sie zur Laufzeit verändert werden?
 

ninonino

Mitglied
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
 

ninonino

Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
F JavaFX Custom Exceptions AWT, Swing, JavaFX & SWT 5
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Gluon Scene Builder Custom AWT, Swing, JavaFX & SWT 0
B JavaFX Custom TextInputControl AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
X Custom Controls AWT, Swing, JavaFX & SWT 5
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
M Swing JColorchooser anpassen - custom style? AWT, Swing, JavaFX & SWT 0
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
B Custom JTabbedPane-Tab-Design AWT, Swing, JavaFX & SWT 2
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
G TitledPane Custom Title AWT, Swing, JavaFX & SWT 6
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
B Swing JTable custom ColumnModel Problem AWT, Swing, JavaFX & SWT 5
W Swing Tag Oder Custom Eintrag AWT, Swing, JavaFX & SWT 7
algorismi Custom JDesktopIcon AWT, Swing, JavaFX & SWT 5
hdi Custom Cursor: Problem mit Größe AWT, Swing, JavaFX & SWT 5
N JComboBox mit Custom Object AWT, Swing, JavaFX & SWT 2
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
Z MessageDialog mit Custom panel erstellen AWT, Swing, JavaFX & SWT 2
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben