5

コンポーネントの配置についていくつか質問があり、テキスト フィールドとテキスト領域 (Java Swing) についていくつか質問があります。どんな助けでも大歓迎です。

現在、2 つのテキスト フィールドを横に並べて、それぞれの上に異なるラベルを付けて、そのテキスト フィールドの機能を説明しようとしています。これを達成するために、私はそれらを に配置しましたGridLayout(2, 2)

  1. これが最善の方法ですか?別のコンポーネントの上に直接ラベルを付ける方法は、私が知っている唯一の方法です。より良い方法はありますか?1 つのボタンの上に 1 つのラベルしかない場合はどうでしょう。これを を通して配置するのは賢明GridLayout(2, 1)ですか? 私は視覚障害者なので、別のコンポーネントに対して相対的なピクセル数でコンポーネントを配置する簡単な方法がない限り、ボタンをピクセル位置だけで配置することは選択肢ではないと思います。

  2. それが私の次の質問につながります。上記と同じ UI を使用し、その下に別のコンポーネント (ボタン) を配置する最良の方法は何ですか。基本的に、UI は 2 つの名前付きテキスト フィールドで構成され、その下に [計算] ボタンがあります。私がこれを行った方法は、上記のコンポーネントをパネルに配置し、それに加えて計算ボタンを周囲のパネルにGridLayout(2, 1). 問題は、ボタンがその上のパネルと同じくらい大きくなることです (私は推測しています)。これを調整して、テキスト フィールド/ラベルのパネルの下にボタンを完全に配置するにはどうすればよいですか? テキスト領域の上のラベルも同様です。ラベルは小さくする必要がありますが、下のテキスト領域用に大きなスペースが必要です。

  3. (テキスト フィールド): 上記の UI を再度参照すると、ユーザーが最初のテキスト フィールドに多くの文字を入力した場合、文字は右側のテキスト フィールドを超えてしまうでしょうか? もしそうなら、どうすればこれを防ぐことができますか?

  4. テキスト領域にテキストを追加して既にいっぱいになっている場合、ユーザーは自動的にスクロールできるようになりますか? そうでない場合、テキスト領域をスクロール可能にする簡単な方法は何ですか?

  5. 現在、テキスト領域のサイズを設定していません。テキストを追加するだけで大​​きくなりますか? 文字数のようにデフォルトのサイズはありますか?

4

2 に答える 2

10

必要なものを提供できるレイアウト マネージャーは多数あります。

というのGridBagLayoutが私の選択です (過去 12 年間、このレイアウト マネージャーを使用してきたので、偏見があります ;))

ここに画像の説明を入力

public class TestLayout17 {

    public static void main(String[] args) {
        new TestLayout17();
    }

    public TestLayout17() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);

            add(new JLabel("Label 1"), gbc);
            gbc.gridx++;
            add(new JLabel("Label 2"), gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JTextField(10), gbc);
            gbc.gridx++;
            add(new JTextField(10), gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.fill = GridBagConstraints.NONE;
            gbc.gridwidth = 2;
            add(new JButton("Click"), gbc);

        }

    }

}

また、長期的には生活を楽にするために複合コンテナを使用するという Eng.Fouad の提案にも同意します。

コンテナ内のコンポーネントのレイアウトは、読む価値があるかもしれません。

于 2012-12-26T22:53:10.843 に答える
10

現在、2 つのテキスト フィールドを並べて、それぞれの上に異なるラベルを付けて、そのテキスト フィールドの機能を説明しようとしています。これを実現するために、それらを GridLayout(2, 2) に配置しました。これが最善の方法ですか?別のコンポーネントの上に直接ラベルを付ける方法は、私が知っている唯一の方法です。より良い方法はありますか?1 つのボタンの上に 1 つのラベルしかない場合はどうでしょう。これを GridLayout(2, 1) で配置するのは賢明ですか?

私自身、私は常にネストされたパネルを介してそれを行いBorderLayoutます. 例えば:

ここに画像の説明を入力

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

空の境界線を設定して、コンポーネント間のギャップを操作できることに注意してください。また、BorderLayout.LINE_STARTandBorderLayout.LINE_ENDの代わりにBorderLayout.WESTandを使用することもできますBorderLayout.EAST。これにより、RTL 言語 (アラビア語など) のサポートが追加されます。


それが私の次の質問につながります。上記と同じ UI を使用し、その下に別のコンポーネント (ボタン) を配置する最良の方法は何ですか。基本的に、UI は 2 つの名前付きテキスト フィールドで構成され、その下に [計算] ボタンがあります。私がこれを行った方法は、上記のコンポーネントをパネルに配置し、それに加えて計算ボタンを GridLayout(2, 1) を使用して周囲のパネルに追加することです。問題は、ボタンがその上のパネルと同じくらい大きくなることです (私は推測しています)。これを調整して、テキストフィールド/ラベルのパネルの下にボタンを完全に配置するにはどうすればよいですか?

以前に行ったように、ネストされたパネルを介してそれを行いますが、下部パネルにはFlowLayout、ボタンの適切なサイズを取得するためのレイアウト マネージャーがあります。

ここに画像の説明を入力

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

panOuter.add(panLeft, BorderLayout.WEST);
panOuter.add(panRight, BorderLayout.EAST);
panOuter.add(panBottom, BorderLayout.SOUTH);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

テキスト領域の上のラベルも同様です。ラベルは小さくする必要がありますが、下のテキスト領域用に大きなスペースが必要です。

使用することをお勧めしますTitledBorder

ここに画像の説明を入力

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);

panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);

panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

JTextArea txtConsole = new JTextArea(5, 10);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

panConsole.add(txtConsole, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

3 番目 (テキスト フィールド): 上記の UI を再度参照すると、ユーザーが最初のテキスト フィールドに多くの文字を入力した場合、文字は右側のテキスト フィールドを超えてしまうでしょうか? もしそうなら、どうすればこれを防ぐことができますか?

上記のコードを試して、どのように動作するかを確認してください:)


4 番目: テキスト領域にテキストを追加したときに既にいっぱいになっている場合、ユーザーは自動的にスクロールできるようになりますか? そうでない場合、テキスト領域をスクロール可能にする簡単な方法は何ですか?

と呼ばれるものを使用する必要がありますJScrollPane

ここに画像の説明を入力

JFrame frame = new JFrame("The Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panOuter = new JPanel(new BorderLayout());
JPanel panLeft = new JPanel(new BorderLayout());
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panRight = new JPanel(new BorderLayout());
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panBottom = new JPanel(); // default is FlowLayout
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

JPanel panInput = new JPanel(new BorderLayout());
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel panConsole = new JPanel(new BorderLayout());

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
Border insideBorder = BorderFactory.createTitledBorder("The Console");
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
panConsole.setBorder(theBorder);

panInput.add(panLeft, BorderLayout.WEST);
panInput.add(panRight, BorderLayout.EAST);
panInput.add(panBottom, BorderLayout.SOUTH);

panOuter.add(panInput, BorderLayout.NORTH);
panOuter.add(panConsole, BorderLayout.CENTER);

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER);
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER);

JTextField txtLeft = new JTextField(10);
JTextField txtLright = new JTextField(10);

JButton btnBottom = new JButton("Press it!");

JTextArea txtConsole = new JTextArea(5, 10);

JScrollPane srcPane = new JScrollPane(txtConsole,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

panLeft.add(lblLeft, BorderLayout.NORTH);
panLeft.add(txtLeft, BorderLayout.CENTER);

panRight.add(lblRight, BorderLayout.NORTH);
panRight.add(txtLright, BorderLayout.CENTER);

panBottom.add(btnBottom);

panConsole.add(srcPane, BorderLayout.CENTER);

frame.setContentPane(panOuter);
frame.pack();
frame.setVisible(true);

私はあなたのすべての質問に答えたことを願っています:)

于 2012-12-26T22:29:24.340 に答える