4

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));

質問:

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

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

ありがとう

4

2 に答える 2

3

以下は、上で述べた小さなコンパイル可能なコード スニペットです。絶対配置を使用するのではなく、レイアウトマネージャーを使用する必要があるという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();
            }
        });
    }
}
于 2010-12-12T20:19:16.743 に答える
1

境界で遊んではいけません。レイアウト マネージャーを使用すれば、これについて心配する必要はありません。

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

JTextField textField = new JTextField(10);

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

テキスト領域については、次を使用して作成できます。

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

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

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

于 2010-12-12T20:11:16.277 に答える