ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
10694
10694
EMPFEHLEN
-
08.02.05 17:14 #1
- Registriert seit
- Nov 2004
- Beiträge
- 284
So, hier auch mal ein Tipp von mir
:
Die Look & Feel's in Java ermöglichen jedem ein individuelles Aussehen
für sein Programm zu erstellen. Da das aber nicht ganz so einfach hab ich
mal hier eine kleine Erklärung. Folgendes muss für ein eigenes Look & Feel
gemacht werden. (Hab mal ein Programm geschrieben, dass weite Teile der
Arbeit übernimmt). Damit es nicht ganz so kompliziert ist, reicht es mit
einem vorgefertigten Look & Feel anzufangen (sehr gut geeignet ist das Metaltheme)
und dieses nur anzupassen. Dazu folgendes Programm: *
1. Alle untenstehenden Werte anpassen (replaceWhat.. Werte können so gelassen werden)
2. Programm ausführen
Anschließend hat man angegebenen Verzeichnis jede Menge neue Dateien.
Hier die wichtigsten:
- Default...Theme.java (... im Beispiel unten = Test, also DefaultTestTheme.java)
In dieser Klasse werden alle Farben und Schriftarten festgelegt.
Die Schriftarten, Styles und Größen am Anfang des Dokuments (bei der Metal-Vorlage)
Die Farben ab Zeile 96 (bei der Metalvorlage)
Eine berechtigte Frage ist nun, wie soll man wissen, welcher Wert für was verantwortlich ist.
Dazu macht man folgendes:
Nehmen wir mal an, man will zuerst mal die Farben der Scrollbars ändern, mit eines der
wichtigsten Elemente:
Dazu öffnet man die Klasse ...LookAndFeel.java .
Dort sucht man dann die Stelle, an der die Werte für die Scrollbars festgelegt
werden, im Metaltheme wäre das bei Zeile 793.
Beim Hintergrund (Scrollbar.background) wird also der Wert getControl() verwendet.
Nun gibt es folgende Möglichkeiten:
1. Man ersetzt getControl() direkt mit der gewünschten Farbe, z.B. new Color(100,100,100)
2. Man möchte, dass sich alle Komponenten, die diese Farbe haben auch ändern
Beim 2. Punkt macht man folgendes:
1. Die Methode getControl() ausfindig machen (Bei der Metalvorlage 1299)
(Alle die JBuilder benutzen können den Cursor auf getControl() setzen und STRG-Enter drücken)
2. Dort findet man bei der Metalvorlage folgendes vor:
return getCurrentTheme().getControl();
3. Also herausfinden was getCurrenTheme zurückliefert und dort die Methode getControl()
angucken.
4. Dann findet man heraus, das die Methode eine Instanz der Klasse ...Theme zurückgibt, im
Beispiel also TestTheme.
5. In dieser Klasse findet man dann schließlich, das die Methode abstrakte
Methode getPrimary3() zuletzt aufgerufen wird.
6. Eine Implementierung dieser Klasse finden wir aber in Default...Theme.java,
d.h. wir suchen nur noch dort nach getPrimary3(), diese liefert die
ColorUIRessource primary3 zurück, welche nun geändert werden kann.
7. Das wars, ähnlich funktioniert es mit Schriftarten etc.
Nun gibt es noch folgende Möglichkeiten:
- Das komplette Aussehen der Komponenten verändern
Um das zu bewerkstelligen, nehme ich wieder das Beispiel Scrollbar.
Möchte man z.B. die beim Metaltheme vorhanden Punkte auf der Scrollbar entfernen,
macht man folgendes:
1. Man sucht sich in der Klasse ...LookAndFeel.java das Feld uiDefaults[] (Bei Metal Z.180)
Dort sucht man dann den Wert für "ScrollBarUI" im Beispiel testPackageName + "TestScrollBarUI"
D.h. wir suchen die Klasse "TestScrollBarUI.java".
2. In dieser Klasse findet man dann auch relativ schnell die Methode "paintThumb",
welche wohl für das zeichnen des bewegbaren Teiles der Scrollbar verantwortlich ist.
Schaut man sich diese Methode genauer an (und versteht sie
) fallen einem die
Zeilen :
bumps.setBumpArea( thumbBounds.width - 6, thumbBounds.height - 7 );
bumps.paintIcon( c, g, 3, 4 );
auf, denn es bleiben keine anderen für das Zeichnen der Punkte übrig,
da nirgendwo eine Schleife vorhanden ist.
Kommentiert man diese beiden Zeilen aus (noch einmal im else-Teil darunter)
werden die Punkte nicht mehr angezeigt (Die Klasse ...Bumps.java ist für die Punkte verantwortlich)
Will man das Look & Feel nun für sein Programm verwenden, kompiliert man alles und
sorgt dafür, dass das Package im Classpath vorhanden ist.
In eigenen Programm baut man folgende Methode ein:
(Packagenamen anpassen)
private void switchLookAndFeel(Container f) {
try {
UIManager.setLookAndFeel(
"de.tv.testui.test.TestLookAndFeel");
}
catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace(System.out);
}
catch (IllegalAccessException ex) {
ex.printStackTrace(System.out);
}
catch (InstantiationException ex) {
ex.printStackTrace(System.out);
}
catch (ClassNotFoundException ex) {
ex.printStackTrace(System.out);
}
SwingUtilities.updateComponentTreeUI(f);
}
und ruft nach erzeugen des Frames (oder was sonst) die Methode
mit switchLookAndFeel(jFrame1); auf.
Hoffe das klappt so bei mir gings
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
/** * <p>Überschrift: Look & Feel Preparer</p> * <p>Beschreibung: </p> * <p>Copyright: Copyright (c) 2005</p> * <p>Organisation: None</p> * @author Tobias Viehweger * @version 1.0 * */ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class LookAndFeelRename { //Hier ändern ----------------- String pathToFiles = "C:\\Programme\\Java\\j2sdk1.4.2\\src\\javax\\swing\\plaf\\metal"; //Sollte mit package übereinstimmen String outputPath = "C:\\myprojects\\de\\tv\\testui\\test"; //Name des Ursprungs-Look-And-Feel (hier z.B. MetalLookAndFeel.java) String replaceWhat1 = "Metal"; String replaceWhat2 = "metal"; String replaceWhat3 = "METAL"; //Name des neuen Look-And-Feels String replaceWith1 = "Test"; String replaceWith2 = "test"; String replaceWith3 = "TEST"; //Package-Namen (Wichtig Nicht package davorschreiben, und auch das ; weglassen) String oldPackage = "javax.swing.plaf.metal"; String newPackage = "de.tv.testui.test"; //---------------------------- public LookAndFeelRename() { //Dateien kopieren, Variablen ersetzen, und umbennen ----- //Ausgabeverzeichnis erstellen File outDir = new File(outputPath); outDir.mkdirs(); //Dateien kopieren File inDir = new File(pathToFiles); File[] files = inDir.listFiles(); for (int i = 0; i < files.length; i++) { copyFile(files[i], outDir); //Ausgabe System.out.println("Konvertiere Datei "+files[i].getName()+ " um..."); } //--------------------------------------------------------- } private void copyFile(File src, File outDir) { String outFile = outDir.getPath() + "\\"; outFile += src.getName().replaceAll(replaceWhat1, replaceWith1); try { RandomAccessFile rafIn = new RandomAccessFile( src, "r" ); RandomAccessFile rafOut = new RandomAccessFile( outFile, "rw" ); String line = rafIn.readLine(); while (line != null) { line = replace(line); rafOut.writeBytes(line + "\r\n"); line = rafIn.readLine(); } rafIn.close(); rafOut.close(); } catch ( IOException ex ) { } } private String replace(String where) { String ret = where; //Packagenamen und alles andere ersetzen if (ret.indexOf(oldPackage) != -1) ret = ret.replaceFirst(oldPackage, newPackage); if (ret.indexOf(replaceWhat1) != -1) ret = ret.replaceAll(replaceWhat1, replaceWith1); if (ret.indexOf(replaceWhat2) != -1) ret = ret.replaceAll(replaceWhat2, replaceWith2); if (ret.indexOf(replaceWhat3) != -1) ret = ret.replaceAll(replaceWhat3, replaceWith3); return ret; } public static void main(String[] args) { LookAndFeelRename lookAndFeelRename1 = new LookAndFeelRename(); } }
-
08.02.05 21:43 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.724
- Blog-Einträge
- 29
Hallo!
Das ist doch schon mal was
Prima Tobias! Aber du solltest in deinen Programmen nicht davon ausgehen das jeder das src.zip entpackt...
Gruß ThomasJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
09.02.05 12:54 #3
- Registriert seit
- Nov 2004
- Beiträge
- 284
Ups das hab ich wohl vergessen zu erwähnen...
Also -> erst noch die src.zip entpacken ;D
-
12.02.05 13:22 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.724
- Blog-Einträge
- 29
Hallo!
Auch nett:
http://www-106.ibm.com/developerwork...brary/j-synth/
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
12.02.05 18:08 #5
- Registriert seit
- Nov 2004
- Beiträge
- 284
Ja, aber dafür braucht der Nutzer die JRE in der Version 5 oder Die ist noch nicht so sonderlich verbreitet glaub ich, und ich brauchte das für ein Webprojekt. Nur wenige Nutzer würden sich dann das ganze JRE neu laden..
Zitat von Thomas Darimont
Davon mal abgesehen ist das natürlich sehr praktisch, weil man dann auch wahrscheinlich bald Editor die das unterstützen finden wird.
-
17.01.10 11:16 #6
- Registriert seit
- Aug 2008
- Ort
- Bückeburg (Niedersachsen)
- Beiträge
- 21
ich weiß das dieser Thread sschon "etwas" älter ist, mich würde aber trotzdem interessieren da ich im Moment nicht die Zeit habe mir das genauer anzuschauen ob man auch z.B. die Form der Buttons so verändern kann. Also anstatt rechteckig dann z.B. abgerundet...
lg
jal1976Windows Bluescreen:
Ihre Maus und Tastatur wurden aus dem System entfernt.
Drücken Sie eine beliebige Taste zum Fortfahren...
Nice try:
public static void main(String[] args)
{
for(int i=1; i<500; i++)
{
System.out.println("I must not throw paper planes in the class!");
}
}
-
17.01.10 22:23 #7DeKugelschieber Tutorials.de Gastzugang
das würde mich auch mal interessieren
-
Am einfachsten geht das heute wohl mit dem Synth Look And Feel: http://www.ibm.com/developerworks/java/library/j-synth/
-
22.01.10 16:30 #9
Hi,
ich hab den Code von Javaer mal ausprobiert, er funktioniert wunderbar!
Was mich allerdings stört, sind JButton & JTextField ect, sie haben keinen Rahmen/Border mehr.
Hat Sun die Border aus dem src.zip-Ordner entfernt? Oder wie bekommt man die Border wieder dazu?
Wenn man in AbcLookAndFeel.java zum Beispiel diese Zeile ändert:
Dann erscheint der Border auch. Woran liegt das?
-
22.01.10 16:46 #10
Die Lösung ist ganz einfach, man muss nur das hier einfügen:
Code java:1
b.setBorder(new AbcBorders.ButtonBorder());
-
-
Okay, wo du das eingefügt hast ist mir jetzt klar, aber das ist ja eine schlechte Lösung des Problems.
Eigentlich sollte das innerhalb des LookAndFeels geschehen, zB. hast du auf die ButtonBorder einer JOptionMessage keinen Einfluss, die bleiben dann weiterhin ohne Rahmen.
Habe das Problem jetzt folgendermaßen gelöst:
durch den direkten Aufruf ersetzenCode java:1
Object buttonBorder = new SwingLazyValue("abc.ABCBorders", "getButtonBorder");
oder:Code java:1
Object buttonBorder = ABCBorders.getButtonBorder();
Code java:1
Object buttonBorder = new ABCLazyValue("abc.ABCBorders", "getButtonBorder");
keine Ahnung, was man da jetzt besser nimmt, bin noch am testen
Viele Grüße, MoGeändert von SpySpooKy (15.03.10 um 10:47 Uhr)
Ähnliche Themen
-
JButton Look & Feel anders als das Look & Feels des JFrames machen
Von zer0 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 10.07.10, 12:31 -
Feel It
Von Florian_Rachor im Forum FotografieAntworten: 2Letzter Beitrag: 20.04.08, 01:14 -
[swing] eigenes Look and Feel
Von snowtom im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 14.08.06, 22:13 -
Look & Feel
Von illaX im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 10Letzter Beitrag: 04.05.06, 11:00 -
Mit .max eigenes spiel machen?
Von Michael Och im Forum 3D Studio MaxAntworten: 20Letzter Beitrag: 18.08.03, 16:50





Zitieren



Login




