1

JLabelHTML形式のテキストを表示する必要があるがあります。ただし、これを4行の長さに制限したいと思います(そうであれば、すべてを表示するためのボタンを提供します)。

これまで、手動またはレイアウトマネージャーを使用して最大サイズを設定してみました。ただし、これらの解決策の両方により、行の一部が表示される可能性があります。

編集:もう少し詳細を追加するには、行の折り返しを正しく尊重し、コンポーネントのサイズを変更し、フォントサイズを変更する場合でも、4行を強制する必要があります。ラベルを正しくフィットする新しいラベルに置き換えることで、サイズ変更/フォントサイズの変更を処理することを検討しました。

JLabel不完全なタグをうまく処理しているように見えるので、入力文字列を2分探索して、4行の制限を超える文字を見つけて(4FontMetric行のピクセル数を決定するために)、置換することができます。新しいラベルを持つ既存のラベル。このアプローチの大きな欠点は、ユーザーがパネルのサイズを変更したり、フォントを変更したりするたびに計算を実行する必要があることです(そして、それは汚い汚いハックのように感じます)。

4

3 に答える 3

2

JLabelをJScrollPaneに追加して、適切なサイズのスクロールペインを設定します。スクロールバーが必要になります。

「線」が何であるかを定義できるとは思えないので、質問に対する絶対的な解決策はわかりません。テキストの1行はフォント12で、別の行は24である可能性があります。指定された各行の高さを計算する方法がわかりません。

ComponentListenerを使用してcomponentResized()イベントを処理したとしても、4行表示の正確な幅/高さを計算するための合理的なアルゴリズムを思い付くことができるかどうかはわかりません。

于 2010-04-26T03:23:45.023 に答える
1

テキストの文字列を実行して、3 番目の「\n」以降のすべてのテキストを削除してみます。

    String shortenText(String oldtext){
        String newText = "";
        for(int i=0;i<3;i++){
            newText += oldtext.substring(0,oldtext.indexOf("\n"));//adds one line to String
            oldtext = oldtext.substring(indexOf("\n")+1);//shorten old string to prepare for next iteration
        }


    return newText;
}

<p>とタグの除去を除いて、同じアルゴリズムを試してみることもでき<br>ます...

可能なタグの値がわかっている場合は、テキストを「\n」から「<br>」または必要なタグに切り替えるだけです

于 2010-04-26T02:45:56.033 に答える
0

ねえ、私はうまくいく方法を見つけました。私が使用しているフレームワークを使用すると、フォントサイズを変更するためのリスナーを作成できます。このリスナーでは、ラベルの新しい最大サイズ(getFontMetrics(font).getHeight() * 4)を決定し、ラベルの最大高さをこれに再設定してから、すべてをリレーアウトします。これは、ワードラップケースもうまく処理します。誰かがばかげたHTML入力で厄介なことをする可能性があると私は推測していますが、これは99%のケースをかなりうまくカバーしています。

于 2010-04-26T03:30:11.707 に答える