Verschiedene Farben in einer GUI

oOJavaNeulingOo

Bekanntes Mitglied
Hi!

Mir ist die Idee gekommen, in Ausgaben in einer GUI Farbcodes einzuführen - Also quasi so:
Java:
public void enter(String text){
		textArea.append(text.replaceAll("%farbe(.+?)%", getColor("$1")) + "\n");
	}
	Color getColor(String c){
		if(c.equalsIgnoreCase("0")){
			return Color.YELLOW;
		}else{
			return Color.WHITE; //USW
		}
	}

Leider kann das ja natürlich nicht gehen. Wenn ich nun aber etwas mit setForegroundColor ändere, wird ja nicht nur der Text-Abschnitt, sondern der ganze Text geändert! Jetzt 2Fragen:
1: Wie kann ich das was ich machen wollte ungefähr machen, ohne den ganzen Text einzufärben?
2: Gibt es mehr Farben als bei der ColorKlasse? Die Auswahl ist nämlich sehr gering; Wäre echt von Vorteil wenn ich die Funktion oben zB mit Hex-Farbcodes machen könnte...


LG
 
Lern erst Java.

Sorry, jede kleinste Frage wird hier reingedonnert ohne auch nur den Hauch einer Bemühung deinerseits zu sehen, dass du dich mit dem Thema beschäftigt hast.

Lächerlich.

Beide Fragen lassen sich mit 10 Minuten Google beantworten. Die Antworten verstehst du nicht, weil du kein Java kannst, sondern nur JForum. :toll: :applaus:
 
Dass ich kein Java kann, stimmt (Leider). Dass ich Themen aber einfach so erstelle, ohne mich vorerst damit zu befassen, sehe ich als falsch an - Sorry. Naja, dann löscht diesen Thread halt.
 
Zuletzt bearbeitet:
wie man Text formatieren kann und was bei Color möglich ist, sind zwei Themen die man getrennt stundenlang recherchieren kann,

zum Code oben noch:
Java:
textArea.append(text.replaceAll("%farbe(.+?)%", getColor("$1")) + "\n");
ist in mehrfacher Hinsicht bemerkenswert

1. in deiner Position vermeide unbedingt Monsterzeilen mit verschiedenen Methodenaufrufen, direkt verwendeteten Ergebnisse als neue Parameter usw.

2. getColor() liefert eine Color, wie soll die als zweiter Parameter von replaceAll() verwendet werden?
hofft du auf irgendeine automatische Umwandlung in einen String, gar den Namen der statischen Variable, etwa 'Yellow'?

3. $1 ist ein komplizierter Rückbezug, der während der Bearbeitung intern in replaceAll(), während des RegEx-Durchlaufs, seine Bedeutung findet,
wie willst du vorher schon getColor() aufrufen? soll dort als Parameter nicht genau "$1", sondern z.B. "0" ankommen?
das kann doch nicht funktionieren

auch kannst du nicht hoffen, dass replaceAll() intern irgendwie auf einmal deine Methode getColor() miteinbezieht (*)

4. nicht unbedingt von dir geplant, aber nur um die Auflistung länger zu machen 😉 : es wird maximal Text geändert, das färbt doch nichts, zumal ja JTextArea ungeeignet ist


du musst schon eher klassisch mit Pattern und Matcher arbeiten, dann mit Schleife und find()-Methode Textstellen wie "farbe.0" finden,
durch die Gruppierung kommst du an die 0 ran, dafür die Farbe holen oder was immer für ein String es werden soll,
und nebenher den neuen String zusammenbauen,
also in etwa so wie zuvor bei (*), nur selber implementiert um mittendrin tatsächlich getColor() zu nutzen
 
@TKausL Vielen Dank, gucke ich mir mal an 😀!
@SlaterB Vielen Dank 😀

1. Uh okay, vermeide ich demnächst 🙂
2. Der Fehler ist mir bewusst, aber da ich bevor ich den Thread erstellt habe recht lange gegooglt habe (teilweise sogar Artikel gefunden die das selbe Problem wie ich hatten, aber keine Lösung drin steht), hab ich hier halt den Thread erstellt
3. Hupps... Das hatte ich komplett vergessen 🙁 Mir ist so ein Fehler schon einmal unterlaufen >.<
4. Wie gesagt, nur ein Beispielscode um zu zeigen was es ungefähr machen soll 😀 Ich dachte halt es gäbe irgendwie eine Art "Code", welche automatisch durch Farbe ersetzt wird. DieFarbe.toString(); hat leider keinen Erfolg aufgewiesen 😀

Werde ich machen, allerdings muss ich vorerst herausfinden wie ich überhaupt die Farbe einer einzelnen Stelle und nicht die des ganzen Textes setzen kann 😉 Etwas anderes als JTextArea zu nutzen wäre nicht allzu vorteilhaft, da ich damit schon recht "viel" gemacht habe :/
 
Tut mir Leid für die späte Antwort; War AFK.

@Marcinek Wieso sollte mir der Post nicht weiterhelfen 😱? Hilft sogar sehr 😀

Nur funktionieren will es nicht so ganz.. Bei meiner TextArea habe ich das hier:

Code:
area.setDocument(doc);

Wobei Doc eine von mir erstellte Klasse ist:
Code:
public class FarbDoc extends DefaultStyledDocument { 
public void colorize(int start, int end, Color farbe) {
	 
	  SimpleAttributeSet sas = new SimpleAttributeSet();
	  StyleConstants.setForeground(sas, farbe);
	  setCharacterAttributes(start, end - start, sas, false);
	}

Wenn ich nun einfach nur zum testen colorize(5, 10, new Color(123,321,0));

angebe, passiert gar nichts...
 
was gegenüber einer womöglichen Exception schon eine genauere Information ist, allerdings in deinem vorherigen Posting auch schon so zu lesen, Nachfrage war etwas unnötig

benutzt du immer noch eine JTextArea? ich glaube die reagiert auf das bestgefüllte Document nicht, hat schlicht keine entsprechenden Fähigkeiten, JEditorPane heißt nach wie vor die Devise

allerdings teils nur vermutet, bitte nachschlagen, nett wäre auch ein kleines vollständiges Testprogramm, das andere kopieren und ausprobieren könnten,
da ist der Austausch hin zu JEditorPane dann wirklich nur einer Zeile
 
Vielen Dank, ich versuche es mal 🙂!

EDIT: Hmm.. Habe die JTextArea zu einem JEditorPane geändert - Jedoch passiert dort auch nichts 🙁!

Wahrscheinlich liegt es wieder an so einem total auffälligem Fehler wie bei dem ScrollPane, ich gucke mal -.-

Nja, hier das Test-Programm:
Java:
public class Konsole {
	
	
	JFrame frame;
	ScrollingText t;
	
	public Konsole(){
		frame = new JFrame("Test");
		t = new ScrollingText();
		frame.add(t.getScollPanel());
		frame.pack();
		frame.setVisible(true);
		spam();
	}
	
	
	void spam(){
		t.getArea().setText(t.getArea().getText() + "Hier bitte Spam einfügen");
		t.getDoc().setForeground(0, 5, Color.RED);
	}
}
Java:
public class Test {

	public static void main(String[] args) {
		new Konsole();
	}
	
}
Java:
public class FarbDoc extends DefaultStyledDocument { 
public void colorize(int start, int end, Color farbe) {
	 
	  SimpleAttributeSet sas = new SimpleAttributeSet();
	  StyleConstants.setForeground(sas, farbe);
	  setCharacterAttributes(start, end - start, sas, false);
	}}
Java:
public class ScrollingText  {
	
	private JEditorPane jta;
	private JScrollPane scroll;
	private FarbDoc doc = new FarbDoc();
	private Color
	
	public ScrollingText(){
		
		jta = new JEditorPane();jta.setDocument(doc);
		jta.setEditable(false);
		scroll = new JScrollPane(jta);
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setPreferredSize(new Dimension(960, 540));
	}
	
	public JScrollPane getScollPanel(){
		return scroll;
	}
	public JEditorPane getArea(){
		return jta;
	}
	public FarbDoc getDoc(){
		return doc;
	}
 
JEditorPane war es vielleicht doch nicht oder braucht anderes Document,
wie auch immer, ich persönlich jongliere wie gesagt nur mit Begriffen

nach
Java Blog Buch : D) Formatierte Texteingabe
sollte es JTextPane sein, noch eine Klasse zur Auswahl..,
kurze Änderung in deinem Beispielcode und es erscheint ein rotes 'Hier'
 
Das bringt doch so nichts... Hast du dich schon einmal mit Zugriffsmodifizierern und statischen Methoden beschäftigt? Irgendwie fehlt da Hand und Fuß.
 

Neue Themen


Zurück
Oben