0

Java Swing を使用してダイアログ ボックスにテキスト領域を配置しようとしています。この JTextArea のサイズの設定に問題があります。テキスト領域の幅は常にウィンドウの幅全体に等しく、サイズを変更するとウィンドウに合わせて伸びます。

private void arrangeComponents() {
    JTextArea textArea = new JTextArea();
    JPanel outerPanel = new JPanel();
    outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.PAGE_AXIS));

    JScrollPane scrollPane = new JScrollPane(textArea);
    outerPanel.add(scrollPane, BorderLayout.CENTER);

    Container contentPane = getContentPane();
    contentPane.add(outerPanel, BorderLayout.CENTER);
}

JTextArea をウィンドウの中央に水平に配置し、サイズを変更しないようにします。

私は何を間違えましたか?

4

5 に答える 5

7

ここJTextArea(int rows, int columns)に示すように、行と列を指定するコンストラクターを使用し、囲んでいる を無視しないでください。pack()Window

于 2013-02-16T19:16:21.857 に答える
2
outerPanel.add(scrollPane, BorderLayout.CENTER);

BoxLayout は制約を受けないため、BorderLayout.CENTER は不要です。

問題は、BoxLayout が、スクロールペインに対して非常に大きく設定されているコンポーネントの最大サイズを尊重することです。

BoxLayout を使用する代わりに、FlowLayout を持つパネルを使用してください。

以下の例を実行して、現在何をしているかを確認してください。次に、setLayout(...) ステートメントをコメントアウトして、再度実行します。デフォルトでは、パネルは FlowLayout を使用するため、必要なものが得られます。

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
          setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));

          JTextArea textArea = new JTextArea(5, 30);
          JScrollPane scrollPane = new JScrollPane(textArea);
          //scrollPane.setMaximumSize( scrollPane.getPreferredSize() );

          add(scrollPane);
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

または、本当に BoxLayout を保持したい場合は、setLayout(...) ステートメントをそのままにして、最大サイズを優先サイズに設定します。多くの人は、「setXXX()」メソッドを直接呼び出すべきではなく、代わりにスクロールペインの setMaximumSize() メソッドをオーバーライドして、優先サイズを返すようにすべきだと言うでしょう。

これら 2 つのソリューションをテストするときは、ウィンドウをスクロール ペインよりも小さくして、各レイアウトの動作の違いを確認してください。

于 2013-02-16T19:41:27.613 に答える
1

そのメソッドを ur テキスト領域に対して呼び出すだけです。setLineWrap(true);

于 2014-04-23T11:55:54.500 に答える
1

シンプルなコーディングサイトからこれを見つけました。このコード サンプルは役に立つかもしれません。

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JTextAreaTest {
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("JTextArea Test");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String text = "A JTextArea object represents a multiline area for displaying text. "
                + "You can change the number of lines that can be displayed at a time, "
                + "as well as the number of columns. You can wrap lines and words too. "
                + "You can also put your JTextArea in a JScrollPane to make it scrollable.";
        JTextArea textAreal = new JTextArea(text, 5, 10);
        textAreal.setPreferredSize(new Dimension(100, 100));
        JTextArea textArea2 = new JTextArea(text, 5, 10);
        textArea2.setPreferredSize(new Dimension(100, 100));
        JScrollPane scrollPane = new JScrollPane(textArea2,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        textAreal.setLineWrap(true);
        textArea2.setLineWrap(true);
        frame.add(textAreal);
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }
}
于 2013-02-16T19:17:03.953 に答える