Labeltext unterstreichen

badmaxx

Mitglied
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

Top Contributor
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?
Java:
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);
        }
    }

}
 

badmaxx

Mitglied
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

Bekanntes Mitglied
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.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben