0

私が構築しているアプリケーションの一部では、ある種の編集不可能なコンポーネントに可変量のテキストを表示する必要があります。現在、これは JTextArea に実装されていますが、JTextArea には、コンポーネントの垂直方向のサイズを設定するための setRows() しかありません。

私が欲しいのは、必要なサイズに拡張するコンポーネントです。このものが埋め込まれているパネルはスクロール可能であるため、これは問題になりません。特定の時間にすべてが表示される必要はありませんが、表示される必要があります。(そして、私はスクロールバー内にスクロールバーを入れたくありません。これは忌まわしいと考えています。

これらの要件に最適な Swing コンポーネントはどれですか?

(注: すべての Swing デモとチュートリアルを含む #$%^&* Oracle Java ドキュメント サイト全体が現在ダウンしているように見えるため、ここで質問しているだけです)。

4

2 に答える 2

0

私は、元の問題の動的サイズ変更の問題に対処するために、このための実用的なプロトタイプを管理しました。テキストが追加されると、テキスト領域のサイズが変更され、テキストを含めるのに十分な大きさになります。明らかに、setEditable(false)を使用してテキストの編集を停止します。うまくいけば、それはあなたにいくつかのアイデアを与えるでしょう。

  • テキストを設定する
  • 列数をおおよその値に変更します-ここでは、合計文字数の平方根*任意の係数を使用しました。
  • テキスト領域は適切な幅ではありませんが、高さを固定する必要があります。
  • 優先サイズを低い値に設定します-これにより、再計算が強制されます
  • 優先高さを最小高さに設定します。これは、コンテンツの最小バウンディングボックスから計算されます。

コード

JFrame frame = new JFrame();
GroupLayout gLayout = new GroupLayout(frame.getContentPane());
frame.getContentPane().setLayout(gLayout);

final JTextArea area = new JTextArea();
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);

JButton button = new JButton("Add more");
button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        area.setText(area.getText()
                + "apple banana carrot dingo eagle fox gibbon ");

        // set approx number of cols
        int chars = area.getText().length();
        int cols = (int) Math.round(Math.sqrt(chars) * 1.3);
        area.setColumns(cols);

        // force recalculation
        area.setPreferredSize(new Dimension(25, 25));

        // downsize
        area.setPreferredSize(new Dimension(
                area.getPreferredSize().width,
                area.getMinimumSize().height));

    }
});

ParallelGroup hGroup = gLayout
        .createParallelGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setHorizontalGroup(hGroup);

SequentialGroup vGroup = gLayout
        .createSequentialGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setVerticalGroup(vGroup);

frame.setSize(600, 500);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

frame.invalidate();
frame.validate();
frame.setVisible(true);
于 2012-03-23T21:35:56.680 に答える
0

ええと...テキストを入力したくない場合は、 JTextAreaは必要ありません... テキストを表示するには、単純に JLabel を使用できます。JLabel は html テキスト形式をサポートしているため、このような方法で簡単に使用できます

...

JPanel aPanel=new JLanel(new FlowLayout());
JLabel aLabel=new JLabel();
aPanel.add(aLabel);


void showFormattedText(String html)
{
 aLabel.setText(html);
}

...

ご想像のとおり、書式設定されたテキストは次のようになります

<html>
Put some text<br>
...<br>

</html>

私はあなたが概念を得たことを願っています

...

ミニパーサー - テストされていません

  String getFormattedText(String text)
{
  char commonBR='\n';
  String htmlBR="<br>";
  char check;
  String result="";

  for(int i=0; i<text.length(); i++)
  {
      check=text.charAt(i);
      if(check==commonBR)

    {

    result+=htmlBR;
    continue;
    }

    result+=check;

     }

     return result;

    }

...

void test
{
       String text="Hello world \n Hello World once again \n ...and again ";

       System.out.println(this.getFormattedText(text));
}

...それは最終的な解決策ではありませんが、基本的な概念です。お役に立てば幸いです

幸運を

于 2012-03-23T20:26:56.177 に答える