Swing Buchstaben im Label anders färben

KrokoDiehl

Top Contributor
Hallo zusammen.

Ich habe nun eine Frage zu einer Darstellung von Textunterschieden: Ich habe zwei Strings, einen SOLL- und einen IST-String. Beide würde ich in der (Swing-)Oberfläche nun gerne so darstellen, dass sie
a) untereinander stehen und vor allem
b) die unterschiedlichen Buchstaben im IST-String in rot dargestellt werden.

Ich bin nun auf der Suche nach sinnvollen und natürlich einfachen Umsetzungsmöglichkeiten. Dabei ist es mir relativ egal ob es über ein JLabel, JTextField, JTextArea, JWasAuchImmer gemacht wird.
Da ich die Unterschiede dynamisch ermittle fände ich es ungeschickt über HTML zu lösen, da man es flexibel aufbauen müsste und immer dieses
Code:
<font color=...></font>
reinhängen muss, aber vermutlich ist es auch ein denkbarer Ansatz.

Im ersten, naiven Ansatz habe ich ein einfaches JLabel mit überschriebener
Code:
paintComponent()
-Methode, die jeden Buchstaben einzeln zeichnet. Einfach betrachtet tut es das, was ich wünsche, jedoch mit diversen Probleme betreffend der Größe / Position des Textes, Look&Feel usw.

Java:
public final class DiffLabel extends JLabel {

    private final String expected;
    private final String actual;
    
    public DiffLabel(String exp, String act) {
        super(act);
        expected = exp;
        actual   = act;
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g.create();
        
        try {
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            if (this.isOpaque()) {
                g2d.setColor(this.getBackground());
                g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
            }
            
            this.paintBorder(g2d);
            this.paintChildren(g2d);
            
            
            Insets      insets  = this.getInsets();
            FontMetrics metrics = g2d.getFontMetrics( this.getFont() );
            int         strPos  = this.getHeight() -insets.top -insets.bottom;
            int         offset  = insets.left;
            
            for (int i = 0; i < actual.length(); ++i) {
                char c = actual.charAt(i);
                if (this.diffs(c, i)) {
                    g2d.setColor(Color.red);
                }
                else {
                    g2d.setColor(this.getForeground());
                }
                
                String str = ""+c;
                g2d.drawString(str, offset, strPos); 
                offset += metrics.getStringBounds(str, g2d).getWidth();
            } //for
        }
        finally {
            g2d.dispose();
        }
    }

    private boolean diffs(char c, int i) {
        if (i < expected.length()) {
            return (c != expected.charAt(i));
        }
        
        return true;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                String exp = "HaLlo Welt";
                String act = "Hallo welti";
                
                JFrame f = new JFrame("Test Diff Label");
                f.setLayout(new GridLayout(2, 1));
                f.add(new JLabel(exp));
                f.add(new DiffLabel(exp, act));
                f.setResizable(false);
                f.pack();
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}

Gibt es von euch Anregungen, Ideen usw. zu diesem Thema? Danke im Voraus!
 

TR

Aktives Mitglied
möglich wäre auch in einem panel mit 2 Labels zu arbeiten und das einem entsprechendem Layoutmanager machen zu lassen
 

Natac

Bekanntes Mitglied
Ich versteh nicht ganz, warum du es nicht mit HTML lösen möchtest!?

Du musst den String eh vergleichen und die Buchstaben rausfinden, die sich unterscheiden. Ob du das nun in der paint()-methode machst oder immer dann, wenn der Text sich ändert (und entsprechend HTML) ergänzt ist doch egal.

Zumal du mit dem HTML-Ansatz flexibler bist, was L&F angeht.
 

KrokoDiehl

Top Contributor
Nun ja, der Reiz der HTML-Lösung ist es durchaus dass es am wenigsten Eingriff erfordert. Vermutlich werde ich auch hiermit anfangen. Aber ich bin gern offen für weitere Ideen.
 

KrokoDiehl

Top Contributor
So, mein bisheriger Stand:

Ich habe es tatsächlich über HTML gelöst und ein Label entsprechend aufgebaut. Man musste noch ein wenig mit Leerzeichen aufpassen (-->
Code:
&nbsp;
) damit es zur Darstellung normaler Labels passt.

Ich hatte das Ganze ebenfalls in einem TreeRenderer drin, was meistens ging aber es gab auch sehr oft hässliche Darstellungseffekte. Ich nehme an dass er mit der Größenberechnung des HTMLs nicht wirklich zurande kam.
Als normale Labels ging es wiederum gut genug (außer bei starken Verkleinern der Fenstergröße), sodass ich mich damit begnügen kann. Es ist ohnehin eine nice-to-have Sache, daher will ich auch nicht ewig Zeit reinstecken. Andere Versuche mit Textfelder und eigenen Dokument-Implementierungen habe ich also nur kurz und ohne wirkliche Ergebnisse verfolgt.

Für mich ist das Thema damit erledigt, aber wenn es anderen in den Finger juckt: Bitteschön ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
R Low-Res OCR einzelner Buchstaben und mehrstelliger Zahlen - Ideen gesucht AWT, Swing, JavaFX & SWT 2
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
F Schriftgröße von Buchstaben berechnen AWT, Swing, JavaFX & SWT 3
R JTextField - Event bei jedem Buchstaben AWT, Swing, JavaFX & SWT 2
hdi Swing 3 Buchstaben des Hasses aka EDT AWT, Swing, JavaFX & SWT 20
G JLabel und griechische Buchstaben AWT, Swing, JavaFX & SWT 6
F kleine Zahlen/buchstaben mit Java darstellen? AWT, Swing, JavaFX & SWT 3
P Text aus JTextField auslesen und Buchstaben ersetzen AWT, Swing, JavaFX & SWT 2
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
izoards Ausdruck auf Label Drucker AWT, Swing, JavaFX & SWT 1
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
I BoxLayout zentriert Label nicht AWT, Swing, JavaFX & SWT 7
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
R JavaFX Label oder Imageview anzeigen mit Buttonklick AWT, Swing, JavaFX & SWT 4
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
Trèfle JavaFX Formattierung im Label AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
F Countdown in Label anzeigen AWT, Swing, JavaFX & SWT 14
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
J Dateiname im Label einblenden AWT, Swing, JavaFX & SWT 4
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
L JavaFX ContextMenu bei Label mit Linksklick AWT, Swing, JavaFX & SWT 4
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
N Anordnung der Label AWT, Swing, JavaFX & SWT 3
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
B Swing JXMapKit Mausemove in Label anzeigen AWT, Swing, JavaFX & SWT 0
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
G Label wird nicht erstellt AWT, Swing, JavaFX & SWT 0
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
G Label erstellen AWT, Swing, JavaFX & SWT 6
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
F JavaFX label.getWidth() AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
R JavaFX Label ändern in aufgerufener AnchorPane AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
G JavaFX CSS: Label in GridPane rechts ausrichten AWT, Swing, JavaFX & SWT 9
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
C Label wird nicht an der richtigen Position angezeigt.. AWT, Swing, JavaFX & SWT 7
H Label mit Icon positionieren AWT, Swing, JavaFX & SWT 14
E Netbeans: Buttons mit Label bzw. Rahmen unterlegen AWT, Swing, JavaFX & SWT 8
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
T label überschriebt seine werte-SWT AWT, Swing, JavaFX & SWT 3
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
N Label auf Hauptfenster manipulieren AWT, Swing, JavaFX & SWT 2
S VAADIN: Problem mit Label AWT, Swing, JavaFX & SWT 18
P Ausgabe Label AWT, Swing, JavaFX & SWT 6
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
A Bekomme das Label nicht in die Mitte von Reihe AWT, Swing, JavaFX & SWT 7
H SWT Markierbares Label AWT, Swing, JavaFX & SWT 8
A Swing Box Label ausrichten AWT, Swing, JavaFX & SWT 3
R Label in den Vordergrund einblenden AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
A TextField und Label AWT, Swing, JavaFX & SWT 8
L Label dynamisch awt AWT, Swing, JavaFX & SWT 2
J Label mit transparentem hintergrund - geht das? AWT, Swing, JavaFX & SWT 21
B Die Werte von getLocation() im Label anzeigen AWT, Swing, JavaFX & SWT 4
Avalarion SWT Listener auf Label oder Text Teile AWT, Swing, JavaFX & SWT 10
C Label Hintergrundbild mit Text AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben