web-dev-qa-db-ja.com

JLabelからテキストを選択しますか?

JLabelからテキストを選択できるようにすることはできますか?そうでない場合、使用するのに最適な代替コントロールは何ですか?また、JLabelのように表示されるように構成するにはどうすればよいですか?

29
mellis

JTextFieldは、JLabelのようなhtml形式のテキストを許可しません。選択可能なhtmlテキストが必要な場合は、代わりにhtmlフォーマットに設定されたJTextPaneを試すことができます。

JTextPane f = new JTextPane();
f.setContentType("text/html"); // let the text pane know this is what you want
f.setText("<html>Hello World</html>"); // showing off
f.setEditable(false); // as before
f.setBackground(null); // this is the same as a JLabel
f.setBorder(null); // remove the border
30
Arend

編集を有効にせずにJTextFieldを使用できます

JTextField f=new JTextField("Hello World");
f.setEditable(false);
content.add(f);

ピエール

14
Pierre

答えに基づいて:編集を有効にせずにJTextFieldを使用できます

JTextField f=new JTextField("Hello World");
f.setEditable(false);
f.setBackground(null); //this is the same as a JLabel
f.setBorder(null); //remove the border

テキストを選択したときに「ジャンプ」を停止する方法、またはテキストを(プログラムで)置き換える方法がわかりません。多分それは私のコンピュータだけです...

10
lindon fox

JTextFieldを使用する場合は、境界線も削除する必要があります:f.setBorder(null);

無効なテキストの色を設定します:f.setDisabledTextColor(Color.black);

7
akf

以下のバリアントとして、CopyableLabelはHTMLタグとフォントをJLabelとしてサポートします。

public class CopyableLabel extends JTextPane {

    private static final long serialVersionUID = -1;

    private static final Font DEFAULT_FONT;

    static {
        Font font = UIManager.getFont("Label.font");
        DEFAULT_FONT = (font != null) ? font: new Font("Tahoma", Font.PLAIN, 11);
    }

    public CopyableLabel() {
        construct();
    }

    private void construct() {
        setContentType("text/html");

        setEditable(false);
        setBackground(null);
        setBorder(null);

        putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
        setFont(DEFAULT_FONT);
    }
}
3
Alexander V.

JLabelは編集できません。

ただし、JTextFieldを使用し、前景色/背景色を変更してJLabelとして表示することもできます。本当に派手になりたい場合は、選択したときに色を変更して編集可能であることを示すコードを追加できます。

1
sangretu

他の応答で提案された変更に加えて(setEditable、setContentType、setOpaqueまたはsetBackground、多分setEnabled + setDisabledTextColor(Color.black)、多分setBorder(null)および/またはsetMargin(new Insets(0、 0,0,0))

JTextPaneのフォントをJLabelのようにするには、 このブログ投稿 からの提案を参照してください。

「残念ながら、デフォルトのフォントはJComponentではなくスタイルシートから取得されるため、JEditorPaneでset fontを呼び出すだけでは効果がありません。ただし、誤ったフォントのデフォルトを回避する賢い方法があります。デフォルトを変更する最良の方法HTMLレンダリングJEditorPaneのフォントは、次のようにスタイルシートを変更します。 "

    // create a JEditorPane that renders HTML and defaults to the system font.
    JEditorPane editorPane = 
            new JEditorPane(new HTMLEditorKit().getContentType(),text);
    // set the text of the JEditorPane to the given text.
    editorPane.setText(text);

    // add a CSS rule to force body tags to use the default label font
    // instead of the value in javax.swing.text.html.default.csss
    Font font = UIManager.getFont("Label.font");
    String bodyRule = "body { font-family: " + font.getFamily() + "; " +
            "font-size: " + font.getSize() + "pt; }";
    ((HTMLDocument)editorPane.getDocument()).getStyleSheet().addRule(bodyRule);
0
Joshua Goldberg