質問

TextField と TextArea に垂直スクロール バーを追加しようとしています。私は ScrollPane を使用していますが、デフォルトで垂直/水平スクロール バーが作成されるはずです。

問題:表示されていないデータを表示するには垂直スクロール バーが必要です。最初は垂直スクロールバーが表示されますが、データが増加すると垂直スクロールバーは水平スクロールバーに変わります。また、TextField が消え、代わりに水平スクロールバーのみが表示されます。境界の設定方法が原因だと思いますが、境界を変更しようとしたところ、TextFieldが完全に削除されてしまいました。

私のコードスニペット:

public JTextField inputField = new JTextField();

public  JTextArea talkArea = new JTextArea();

public JScrollPane inputFieldScroll = new JScrollPane(inputField);

public JScrollPane talkAreaScroll = new JScrollPane(talkArea);
      talkArea.setEditable(false);

    talkArea.setBackground(Color.white);

     talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));     

     this.getContentPane().add(talkAreaScroll, null);

    //set input area

      inputField.setBackground(Color.white);

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

    inputFieldScroll.setVerticalScrollBar(new JScrollBar());

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

質問:

垂直スクロールバーを維持するために設定する必要があるパラメータはありますか?データが膨大な行になると、入力スクロール バーが入力フィールド全体を占めるのはなぜですか?最初は適切な垂直スクロールバーとして表示されます。

アドバイスをいただければ幸いです。

ありがとう

役に立ちましたか?

解決

以下は、上で述べたコンパイル可能な小さなコード スニペットです。私は、絶対配置を使用するのではなく、レイアウトマネージャーを使用する必要があるという camickr の意見に同意します。JTextField に水平スクロールバーがどうしても必要な場合、それを動作させる 1 つの方法は、これを可能にする JScrollPane コンストラクターを使用して、水平スクロールバーを常に表示させることです。つまり、

        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

たとえば、

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

public class FuSwing1b extends JPanel {
    private static final int TA_ROWS = 25;
    private static final int TA_COLS = 60;
    private JTextField inputField = new JTextField();
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS);

    public FuSwing1b() {
        talkArea.setEditable(false);
        talkArea.setFocusable(false);
        talkArea.setBackground(Color.white);
        //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT));

        JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        int gap = 10;
        setLayout(new BorderLayout(gap, gap));
        add(talkPane, BorderLayout.CENTER);
        add(inputPane, BorderLayout.SOUTH);
        setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap));
    }

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

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

他のヒント

境界線をいじらないでください。レイアウトマネージャーを使用すれば、このことを心配する必要はありません。

テキストフィールドを作成するときは、次のようなものを使用します。

JTextField textField = new JTextField(10);

これにより、少なくとも 10 文字を保持するテキスト フィールドが作成されます。文字数がテキストフィールドの表示幅を超える場合は、右/左矢印キーを使用して残りの文字を表示できます。これは、私がこれまで見たすべてのアプリケーションで使用されている通常の UI です。水平スクロールバーを使用して独自の UI を作成しようとしないでください。ユーザーはそれに慣れていません。

テキスト領域の場合は、次を使用して作成できます。

JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane( textArea );

5 行、1 行あたり約 30 文字のテキスト領域を作成します。

次に、「レイアウト マネージャーを使用して」テキスト フィールドとスクロールペインをフレームに追加し、フレームをパックします。レイアウト マネージャーがコンポーネントの最適なサイズを決定します。テキスト領域にテキストを追加し、テキストが 5 行を超えると、テキスト領域にスクロールバーが自動的に表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top