Button Attribute setzen

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Hallo,


ich hätte eine Frage zu den JButtons und zwar kann ihc mit den ganzen Methoden (setBackground, setText, setForeground, setActionCommand usw) das aussehen bzw die Funktion der Button beeinflussen. die ganzen Attribute eines Buttons müssen ja irgendwo geschpeichert werden.
Meine Frage wäre jetzt, ob ich einen direkten Zugriff zu den Attributen der Button habe, sodass ich einmal meine Defaulteinstellungen für einen Button setze und dann eben immer das Attribut, welches ich verändern will.

oder gibts da vielleicht schon einen Buttondesigner irgendwo, dem ich eine ArrayList übergebe, und dann je nach den Einträgen der ArrayList mein Button aussieht?

Vielen Dank für Eure Antworten,

lg
Michl
 
Die zugehörigen Attribute sind aber privat.

Vorschlag: Mach dir eine eigene Klasse.

Code:
class MyButton extends JButton {
  public MyButton(String name) {
    this(name);
    setFont(getFont().deriveFont(10.0f));
    // ...
  }
}
 
du könntest ja theoretisch eine eigene Methode schreiben die eine ArrayList als parameter übergeben bekommt und dann den Button dem entsprechend designed...

ist eigentlich kein großer aufwand
 
Leroy, wie meinst du, die zugehörigen Attribute sind privat? kann ich auf die zugreifen (über getter- Methoden oder sonst irgendwie) (was ist eigentlich deriveFont)
gibts da nicht auch schon was fertiges, das wird ja, könnte ich mir vorstellen, öfter benötigt, für Visualisierungen und so weiter,


eine 2. Frage hätte ich auch noch.
und zwar sieht meine Konfigurationsdatei für die Buttons oben so aus (wei unten), kann ich das irgendwie mit properties.load oder sonst irgendwie definiert einlesen, sodass ich immer alle Einträge zwischen buttonX.state[x] und
buttonX.state[x].ende einlesen kann und im Programm in eine ArrayList speichere und diese Arraylist dann dem Konstruktor "MyButton" übergebe, und dieser mir die Attribute des Buttons setzt. wenn im Programm ein neuer State auftritt, dann hole ich mir eben z.B. state[1] und setzt den Button so, wies zwischen buttonX.state[1] und buttonX.state[1].ende drinnensteht.

Ist das ein ordentliches Konzept oder kann man das eleganter (mit weniger aufwand, weniger Zeilen Code) lösen.

Vielen Dank für Eure Vorschläge (sind immer sehr hilfreich)

lg
Michl



Code:
button1.Begin
   button1.state[0] 
      beschriftung = Ein
      font = Arial
      schriftGroesse = 12
      hintergrundFarbe = gruen
   button1.state[0].ende
   button1.state[1]
      beschriftung = Aus
      hintergrundFarbe = rot
   button1.state[1].ende
   button1.state[2]
   .....
   button1.state[2].ende
buttton1.End
 
Ist das ein ordentliches Konzept oder kann man das eleganter (mit weniger aufwand, weniger Zeilen Code) lösen.

ich würd die states für die buttons in ner xml datei speichern, da kannst es auch sehr bequem auslesen
 
das ist aber zu aufwendig, oder. mit den properties kann ich das ja machen mit der XML- Datei (hab ich gelesen) aber kann ich die XML- Datei auch so wie oben beschrieben, auslesen, und wie würde das gehen und... kann ich die XML-Datei auch so erzeugen, ich möchte nämlich, wenn ich mit dem fertig bin, einen Designer programmieren?
ich hab noch nie etwas mit XML gemacht, bin also um jeden Tip in diese Richtung dankbar.


Vielen DANK

lg
 
Michael1234 hat gesagt.:
was ist eigentlich deriveFont

deriveFont leitet einen Font von einem gegeben ab.

Ich benutze das um z.B. einfach nur die Schriftgröße
zu ändern ohne die anderen Einstellungen (Font-Familie, ...)
ändern/angeben zu müssen.
 
ah super, danke. und kann ich irgendwie auf alle Attribute zugreifen, bzw. gibts da wasoder muss ich mir das selber programmieren?
lg
 
Welche Attribute meinst du denn?

Es gibt entsprechende setter-Methoden:
Code:
setFont, setBorder, setColor, ...
 
ja, ich weiß, aber ich möchte das gleich in einer Wurscht übergeben, in einer ArrayList z.B., eben von einer Konfigurationsdatei die Attribute lesen (wie ich oben geschrieben habe) und dann ebe übergeben.
gibts da vielleicht schon was? und wie würde das mit XML gehen (kann ich das von einer XML- Datei so einlesen, wie oben beschrieben?)

lg
 
Das mußt du schon mit einer HashMap selbst machen:

Code:
	HashMap<String, Object> attribs = new HashMap<String, Object>();
	attribs.put("Color", Color.RED);
	attribs.put("Size", 42.0f);
	for (Map.Entry<String,Object> attrib : attribs.entrySet())
		if (attrib.getKey().equals("Color"))
			setColor((Color) attrib.getValue());
		else if (attrib.getKey().equals("Size"))
			setFont(getFont().deriveFont(((Float) attrib.getValue()).floatValue()));
                        ...

Mir persönlich wäre das viel zu aufregend 😎
 
kann ich das mit XML so mache, wie oben angegeben, óder gibts da eine bessere Methode und gibts da vielleicht eine Link oderso wo ich das nachlesen könnte?

lg
 
:lol: :lol: :lol: geht jetz vorbei an deiner ursprünglichen frage, ABER:

falls du das mit XML machen möchtest, hier kriegst du JDOM
http://www.jdom.org/dist/binary/
das benötigst du, um die xml dateien komfortabel auslesen/speichern zu können 😉

(einfach die jdom-1.0 runterladen, build ausführen und die jdom.jar im build ordner deinem projekt hinzufügen)




hab hier mal was geschrieben, soll nur als beispiel dienen und ist natürlich beliebig erweiterbar (und bestimmt verbesserbar 😉 )

habs jetz nich kommentiert, denke es erklärt sich von alleine ( das auslesen aus der XML is auch sehr einfach, wenn du es net gleich verstehst schau dir vielleicht mal die api davon an (www.jdom.org)

ich hab ne klasse für die states eines elements:

Code:
package org.jf;

import java.awt.Color;

public class State {
	
	int elementNr=0;
	int stateNr=0;
	
	// mit standardwerten belegen
	String type="Button";
	String beschriftung="Ein Button";
	String font="Monospaced";
	int fontSize=12;
	int fontStyle=0;
	Color bgColor=Color.WHITE;
	//...
	
	public State() {
	}
	public void setStateNr( int n ) {
		stateNr = n;
	}
	public void setElementNr( int n ) {
		elementNr = n;
	}
	
	public void setBeschriftung( String s ) {
		beschriftung = s;
	}
	public void setFont( String s ) {
		font = s;
	}
	public void setFontStyle( int n ) {
		fontStyle = n;
	}
	public void setFontSize( int n ) {
		fontSize = n;
	}
	public void setBgColor( int r, int g, int b ) {
		bgColor = new Color ( r, g, b);
	}

	public void setType(String s) {
		type = s;
	}
	
	public String toString() {
		return "Element: "+ elementNr + " State: "+ stateNr +": \n\t"+ type + ", "+beschriftung+", ("+ font +", "+ fontSize +", "+ fontStyle +"), "+ bgColor.toString();
	}
	
}

und ne testklasse wo es ne funktion gibt die aus ner datei die states ausliest und in nem vector speichert

Code:
package org.jf;

import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class Main {
	
	Vector<State> states;
	
	public Main() {
		try {
			states = readStates( "prefs.xml" );
			
			for ( int i=0; i<states.size(); i++) {
				System.out.println( states.get(i).toString() );
			}
		}
		catch ( JDOMException e) {}
		catch ( IOException e) {}
		
	}
	
	public static void main( String[] args ) {
		new Main();
	}
	
	public Vector<State> readStates( String xmlFile ) throws JDOMException, IOException {

		Vector<State> vStates= new Vector<State>();
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build( xmlFile );
		
		Element root = doc.getRootElement();
		
		Iterator iElements = root.getChildren("Element").iterator();
		while ( iElements.hasNext() ) {
			// element[i]  (zb button1 bei dir)
			Element element = (Element) iElements.next();
			Iterator iStates = element.getChildren("State").iterator();
			while ( iStates.hasNext() ) {
				State newState = new State();
				newState.setType( element.getAttributeValue("type") );
				newState.setElementNr( Integer.valueOf(element.getAttributeValue("id")).intValue() );

				// states für element[i]  (zb button1.state[0] bei dir)
				Element states = (Element) iStates.next();
				newState.setStateNr ( Integer.valueOf(states.getAttributeValue("id")).intValue() );
				Iterator iPrefs = states.getChildren().iterator();
				while ( iPrefs.hasNext() ) {
					Element state = (Element) iPrefs.next();
					if ( state.getName().equals("beschriftung") )
						newState.setBeschriftung(state.getText());
					else if ( state.getName().equals("font") )
						newState.setFont(state.getText());
					else if ( state.getName().equals("schriftGroesse") )
						newState.setFontSize( Integer.valueOf(state.getText()).intValue());
					else if ( state.getName().equals("hintergrundfarbe") ) {
						newState.setBgColor( 
								Integer.valueOf(state.getChild("r").getText()).intValue(),
								Integer.valueOf(state.getChild("g").getText()).intValue(),
								Integer.valueOf(state.getChild("b").getText()).intValue());
					}
					else {
						//....
					}
				}
				vStates.add( newState );
			}
		}
		
		return vStates;
	}

}

hoffe kommst klar damit 🙂


edit: achso, so könnte dann zb eine passende datei zum auslesen aussehen:

Code:
<Preferences>
	<Element type="Button" id="0">
		<State id="0">
			<beschriftung>Ein</beschriftung>
			<font>Arial</font>
			<schriftGroesse>12</schriftGroesse>
			<hintergrundfarbe>
				<r>0</r>
				<g>255</g>
				[b]0[/b]
			</hintergrundfarbe>
		</State>
		<State id="1">
			<beschriftung>Aus</beschriftung>
			<hintergrundfarbe>
				<r>255</r>
				<g>0</g>
				[b]0[/b]
			</hintergrundfarbe>
		</State>
	</Element>
	<Element type="Button" id="1">
		<State id="0">
			<beschriftung>Button2</beschriftung>
			<font>Verdana</font>
		</State>
	</Element>
	<Element type="Button" id="2">
		<State id="0">
			<beschriftung>Button3</beschriftung>
			<font>Arial</font>
			<schriftGroesse>30</schriftGroesse>
			<hintergrundfarbe>
				<r>200</r>
				<g>200</g>
				[b]200[/b]
			</hintergrundfarbe>
		</State>
	</Element>	
</Preferences>
 
Hallo nochmal,


könntest Du/könntet Ihr mir vielleicht kurz den Zusammenhang der zwei oberen Klassen beschreiben, Vor allem komme ich bei diesem Statement: Vector<State> vStates= new Vector<State>(); nicht mit, was bedeutet das. Ich kenne das nur con C++ (das ist ja in C++ ein TypeCast oder so etwas!?)

Vielen Dank für Eure hilfe!!

lg
Michl
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben