# Labeltext unterstreichen



## badmaxx (22. Jul 2010)

Hi,

ich stehe gerade vor dem Problem, den Text auf einem (J)Label unterstreichen zu müssen.
Wäre ja eigentlich nicht so schwer, aber ich kann weder die Version mit HTML noch die Version über java.awt.font.Textatribute verwenden.

Gibt es noch eine weitere möglichkeit?

Gruß


----------



## Marco13 (22. Jul 2010)

Grundsätzlich kann man natürlich paintComponent von dem Label überschreiben, und dort für jeden einzelnen Pixel des Labels aus der schier unerschöpflichen Fülle von 16777216 Farben wählen. D.h. man kann dort eine Linie reinmalen, die dann die Unterstreichung darstellt. Rauszufinden, WO diese Linie hingemalt werden muss, damit der Text UNTER- und nicht etwa DURCHGEstrichen ist, wäre aber höchst frickelig.

Was spricht gegen HTML? 

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class UnderlineLabelTest
{
    public static void main(String args[])
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        final UnderlineLabel label = new UnderlineLabel("Hello");
        final JToggleButton b0 = new JToggleButton("Underline");
        b0.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                label.setUnderlined(b0.isSelected());
            }
        });

        final JToggleButton b1 = new JToggleButton("Toggle text");
        b1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (b1.isSelected())
                {
                    label.setText("World");
                }
                else
                {
                    label.setText("Hello");
                }
            }
        });


        frame.getContentPane().setLayout(new GridLayout(0,3));
        frame.getContentPane().add(label);
        frame.getContentPane().add(b0);
        frame.getContentPane().add(b1);

        frame.pack();
        frame.setVisible(true);
    }
}


class UnderlineLabel extends JLabel
{
    private String text;
    private boolean underlined = false;

    public UnderlineLabel(String text)
    {
        super(text);
        this.text = text;
    }

    public void setUnderlined(boolean newUnderlined)
    {
        if (!underlined && newUnderlined)
        {
            super.setText("<html><u>"+text+"</u></html>");
            underlined = newUnderlined;
        }
        else if (underlined && !newUnderlined)
        {
            super.setText(text);
            underlined = newUnderlined;
        }
    }

    public void setText(String text)
    {
        this.text = text;
        if (underlined)
        {
            super.setText("<html><u>"+text+"</u></html>");
        }
        else
        {
            super.setText(text);
        }
    }

}
```


----------



## Runtime (22. Jul 2010)

Vielleicht kann er es nicht benutzen, weil das JRE der/des Benutzer/s zu alt ist.


----------



## badmaxx (22. Jul 2010)

ok ich schätze ich werde um das überschreiben der Methode nicht rumkommen.

Gegen HTML spricht das es auf der VM wo es laufen soll nicht funktioniert


----------



## hansmueller (22. Jul 2010)

Hallo,

eventuell mit Rahmen.

Link: How to Use Borders (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Mit dem CompoundBorder könntest du einen EmptyBorder und einen LineBorder (welcher nur unten einen Strich hat) kombinieren.

Ist zwar etwas umständlich für eine Textunterstreichung und erfordert evtl. etwas Justierungsarbeit, aber sollte eigendlich klappen. Der Text darf natürlich nur einzeilig sein.

MfG
hansmueller

Nachtrag: Keinen LineBorder, sondern einen MatteBorder.


----------



## badmaxx (22. Jul 2010)

OK ich werd erstmal die Idee mit dem Border versuchen bevor ich die Methode umschreib


----------

