JScrollBar 垂直/水平設定の問題 - Java Swing
-
09-10-2019 - |
質問
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 行を超えると、テキスト領域にスクロールバーが自動的に表示されます。