Einen Character in einem JLabel unterstreichen



  • Hi Leute!

    Ich bin leider zu Java mit Swing genötigt worden und möchte einen JLabel haben, der mir den Buchstaben nach einem Amperstand ( '&' ) unterstreicht. Ich weiß, dass es mit HTML-Code im Text funktionieren würde, will ich aber nicht.

    Ich habe ein JCoolLabel von JLabel abgeleitet, ihm einen boolean underlined_char und einen int underlined_char_index spendiert, die setText( ) Methode überschrieben:

    public void setText( String text ) {
    
        underlined_char = false;
        underlined_char_index = -1;
    
        if( text.contains( "&" ) ) {
    
            underlined_char = true;
            underlined_char_index = text.indexOf( '&' );
    
            String new_text = text.substring( 0, underlined_char_index );
            new_text += text.substring( underlined_char_index + 1, text.length( ) );
            text = new_text;
        }
    
        super.setText( text );
    }
    

    und möchte nun

    public void paint( Graphics graphics ) {
    
        // super.paint( graphics );
    
        if( underlined_char ) { // Some letter is to be underlined
    
            String text = getText( );
            BasicGraphicsUtils.drawStringUnderlineCharAt( graphics, text, underlined_char_index, 0, getFontMetrics( getFont( ) ).getHeight( ) - 3 );
        }
    }
    

    Leider bin ich mit meiner Ausgabe - wie man sieht - 3 Pixel daneben. Warum? Weiß jemand, ob JLabel noch irgendwo Offsets bei der Textausgabe berücksichtigt?

    Bin für jeden Tipp dankbar.

    cheers, Swordfish



  • Du musst ein Masochist sein, wenn du das selber zeichnen willst...

    JLabel.setDisplayedMnemonicIndex ist die Methode die dem JLabel sagt, welcher Buchstabe unterstrichen sein soll. 😉



  • JBeni schrieb:

    Du musst ein Masochist sein, wenn du das selber zeichnen willst...

    Ich sagte nicht, dass ich es selber tun will, hab' nur auf die schnelle keine andere Möglichkeit gesehen, da ich im Internet nur auf die Lösung mit HTML Code gestoßen bin. Die zweite "gängige" Lösung war eben das selberzeichnen. Ist ja im prinzip nicht schwer, nur eben 3 Pixel daneben.

    JBeni schrieb:

    JLabel.setDisplayedMnemonicIndex ist die Methode die dem JLabel sagt, welcher Buchstabe unterstrichen sein soll. 😉

    Danke 👍

    Gibt's eventuell auch die Möglichkeit über eine Eigenschaft eines JLabels zu bestimmen, was beim auslösen des Mnemonics gemacht werden soll? Im speziellen möchte ich den aktuellen Focus setzen.

    Bisher mache ich das über eine Action für die Inputmap des RootPanes meines Frames. Vielleicht geht das auch einfacher?

    cheers, Swordfish



  • Du kannst dem JLabel mit "setLabelFor" sagen, welche Componenten fokusiert wird beim auslösen des Mnemonics. Wahrscheinlich musst du zusätzlich noch "setDisplayedMnemonic" aufrufen, damit das funktioniert (hab es nicht ausprobiert, nur gelesen was die API dazu sagt).



  • Danke. Werd's sofort ausprobieren, wenn ich nach Hause komme. Leider hab' ich mit der javadoc einbindung in Eclipse noch so meine Probleme... Werd' mich noch ein bisschen damit spielen 😉

    Ich denke, dass mit setLabelFor( ) meine Probleme gelöst sind. 👍

    cheers, Swordfish

    PS: In einer Woche bin ich Java spätestens wieder los 😃



  • Swordfish schrieb:

    PS: In einer Woche bin ich Java spätestens wieder los 😃

    Ja, mir der Einstellung kannst du natürlich kein Spass haben... 🙄 😉



  • Swordfish schrieb:

    PS: In einer Woche bin ich Java spätestens wieder los 😃

    Und dann wieder C++? Du bist wirklich Masochist!



  • JBeni schrieb:

    Swordfish schrieb:

    PS: In einer Woche bin ich Java spätestens wieder los 😃

    Ja, mir der Einstellung kannst du natürlich kein Spass haben... 🙄 😉

    Es gibt Menschen, die mit Popkorn keine Freude haben, es gibt Menschen, die mit aktiven Antennen keine Freude haben, ... es gibt Menschen, die mit Java keine Freude haben...

    Sadist schrieb:

    Swordfish schrieb:

    PS: In einer Woche bin ich Java spätestens wieder los 😃

    Und dann wieder C++? Du bist wirklich Masochist!

    Des einen Freud' des andern Leid 😉

    cheers, Swordfish

    PS: Danke für die Hilfe, aber es ist keine weitere Antwort in diesem Thread nötig - alle Klarheiten sind beseitigt 😉 . Falls doch @Mods: bitte schließen. Das wird kein Flamewar!


Anmelden zum Antworten