3

図に示すようなGUIを描画しようとしていますが、どういうわけかオブジェクトを正しい場所に配置できません(問題はレイアウトにあると思います)テキストエリアは真ん中にあるはずです.. .しかし、まったく表示されていません

ここに画像の説明を入力

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

public class Exercise226 extends JFrame {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    public Exercise226() {
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        jTextDisplay = new JTextArea();
        jTextAdd = new JTextField(8);

        setLayout(new BorderLayout());

        JPanel p1 = new JPanel(new GridLayout(1,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        add(p1, BorderLayout.NORTH);
        add(jTextDisplay, BorderLayout.CENTER);    
        add(p2, BorderLayout.SOUTH);
    }

    public static void main(String... args) {

        Exercise226 gui = new Exercise226();
        gui.setTitle("Numbers");
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(300, 200);
        gui.setLocationRelativeTo(null);
        gui.setVisible(true);   

    }     
}
4

3 に答える 3

4

JTextArea、実際には期待どおりの場所ですが、アウトラインの境界線はありません。コンポーネントを に配置するのが通常です。これによりJScrollPane、この効果が得られます。

add(new JScrollPane(jTextDisplay), BorderLayout.CENTER);

または単に

add(new JScrollPane(jTextDisplay));
于 2012-12-27T00:58:48.010 に答える
4

フレーム内の要素間に間隔/パディングを追加するにはどうすればよいですか? そのため、テキスト領域がより見やすく、中央に配置されます。

ボーダーとパディング。例えば

演習 226-with-padding-and-borders

と比べて:

演習226

import javax.swing.*;
import java.awt.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

public class Exercise226 {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    private JPanel gui;

    public Exercise226() {
        gui = new JPanel(new BorderLayout(5,5));
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        // set the size constraints using columns/rows
        jTextDisplay = new JTextArea("Here I am!", 6,20);
        jTextAdd = new JTextField(8);

        JPanel p1 = new JPanel(new GridLayout(1,3,3,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3,3,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        JPanel textAreaContainer = new JPanel(new GridLayout());
        textAreaContainer.add(new JScrollPane(jTextDisplay));
        textAreaContainer.setBorder(new TitledBorder("Text Area Here"));

        gui.add(p1, BorderLayout.PAGE_START);
        gui.add(textAreaContainer, BorderLayout.CENTER);    
        gui.add(p2, BorderLayout.PAGE_END);

        gui.setBorder(new EmptyBorder(4,4,4,4));
    }

    public Container getGui() {
        return gui;
    }

    public static void main(String... args) {
        JFrame f = new JFrame();

        Exercise226 gui = new Exercise226();
        f.setContentPane(gui.getGui());
        f.setTitle("Numbers");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);   

    }     
}

このコード:

  • int主に、水平および垂直間隔の2 つの引数を受け入れるレイアウトのさまざまなコンストラクターを使用して、GUI に「空白」を提供します。
  • また、2 つの境界線を追加します。
    1. GUI とフレームの装飾の間にスペースを確保するための、GUI 全体の周囲の空の境界線。
    2. 非常に明確にするために、テキスト領域の周りにタイトル付きの境界線を付けます。
  • 元のコードの不要な部分の変更を実装します。フレームを拡張する代わりに、フレームのインスタンスを保持するだけです。
  • JScrollPane@Reimeus で提案されているように、テキスト領域にコンテナーを使用します。スクロールバーを必要としない要素に、独自の素敵な斜めの境界線を追加します。
  • textAreaContainerスクロール ペインを囲むようにタイトル付きの境界線を設定できるように、既存の境界線に干渉することなくを特別に作成します。既存の境界線 ( ) とタイトル付きの境界線で構成されるスクロール ペインに
    を使用することができます。ただし、選択またはアクションの境界線を変更する可能性のあるボタンやその他の要素では複雑になります。したがって、画面要素 (ここではテキスト領域など) に「最外枠」を設定するには、通常、最初にコンポーネント全体を別のコンテナーにラップすることを好みます。CompoundBorderscroll.getBorder()
  • EDT で GUI を作成および表示しません。Swing GUI は、EDT 上で作成および変更する必要があります。ユーザーの演習として残します。詳細については、Swingでの同時実行を参照してください。

古いコード

上記の「比較GUIイメージ」を提供するこの回答の元のコード。IT は元のコードに密接に基づいていますが、テキスト領域がスクロール ペインにラップされ (そのため斜めの境界線が得られます)、表示するテキストが与えられています。

演習226

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

public class Exercise226 extends JFrame {
    private JButton jbSort;
    private JButton jbReverse;
    private JButton jbAdd;
    private JButton jbShuffle;
    private JLabel jlAddnum;
    private JTextArea jTextDisplay;
    private JTextField jTextAdd;

    public Exercise226() {
        jbSort = new JButton("Sort");
        jbReverse = new JButton("Reverse");
        jbShuffle = new JButton("Shuffle");
        jbAdd = new JButton("Add");
        jlAddnum = new JLabel("Add number here: ");
        // set the size constraints using columns/rows
        jTextDisplay = new JTextArea("Here I am!", 6,20);
        jTextAdd = new JTextField(8);

        setLayout(new BorderLayout());

        JPanel p1 = new JPanel(new GridLayout(1,3));
        p1.add(jlAddnum);
        p1.add(jTextAdd);
        p1.add(jbAdd);

        JPanel p2 = new JPanel(new GridLayout(1,3));
        p2.add(jbSort);
        p2.add(jbReverse);
        p2.add(jbShuffle);

        add(p1, BorderLayout.NORTH);
        add(new JScrollPane(jTextDisplay), BorderLayout.CENTER);    
        add(p2, BorderLayout.SOUTH);
    }

    public static void main(String... args) {

        Exercise226 gui = new Exercise226();
        gui.setTitle("Numbers");
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //gui.setSize(300, 200);
        gui.pack();
        //gui.setLocationRelativeTo(null);
        gui.setLocationByPlatform(true);
        gui.setVisible(true);   

    }     
}
于 2012-12-27T02:46:24.440 に答える
4

textAreaウィンドウでリサイズするには、 を試してくださいBoxLayout。は「オブジェクトをレイアウト マネージャーとしてBox使用する軽量コンテナー」です。BoxLayout

Box p1 = new Box(BoxLayout.X_AXIS);
于 2012-12-27T02:01:54.797 に答える