1

最近 Java プログラミングを始めて、ログイン画面を作成しようとしています。ただし、ボタンとテキストを配置する新しい行を作成する方法がわかりません。また、これらを JPanel の右下隅に移動したいと思います。言葉遣いが下手で申し訳ありませんが、私のコードから私が何を意味するかを理解していただければ幸いです。どうぞよろしくお願いいたします。

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

public class CardLayoutDemo implements ItemListener {
JPanel cards;
final static String BUTTONPANEL = "Card with JButtons";

public void addComponentToPane(Container pane) {

    JPanel card1 = new JPanel();
    card1.add(new JLabel("Username:"));
    card1.add(new JTextField("Username", 10));
    card1.add(new JButton("Login")); //end line here
    //New line
    card1.add(new JLabel("Password:"));
    card1.add(new JTextField("Password", 10));
    card1.add(new JButton("Register")); //end line here
    //New line
    card1.add(new JCheckBox());
    card1.add(new JLabel("Remember credentials"));


    cards = new JPanel(new CardLayout());
    cards.add(card1, BUTTONPANEL);

    pane.add(cards, BorderLayout.BOTTOM_RIGHT);// Add cards to bottom right hand corner.
}

public void itemStateChanged(ItemEvent evt) {
    CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, (String)evt.getItem());
}

private static void createAndShowGUI() {
    JFrame frame = new JFrame("Login");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    CardLayoutDemo demo = new CardLayoutDemo();
    demo.addComponentToPane(frame.getContentPane());

    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {

    try {

        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}
4

3 に答える 3

3

提案:

  1. にはそのような制約はありませBorderLayout.BOTTOM_RIGHTBorderLayout

    • BorderLayout.SOUTH: コンテナの底にコンポーネントを配置します
    • BorderLayout.EAST : コンポーネントをコンテナの右側に配置します
    • BorderLayout.NORTH: コンポーネントをコンテナの上部に配置します
    • BorderLayout.WEST : コンポーネントをコンテナの右側に配置します
    • BorderLayout.CENTER: コンポーネントをコンテナの中央に配置します

    コンポーネントが順番に表示され、相互に相対的に配置され、メイン コンテナのサイズ変更に対応できるように、コンポーネントを希望どおりに配置する場合は、 最初にレイアウト マネージャについて学習する必要があります。

  2. イベント リスナーについて学習します。ItemListenerそのようなリスナーを持たない JPanel/Top レベル クラスにを実装する代わりに、命名規則MyItemListener implements ItemListenerを使用して新しいクラスに実装し、新しいインスタンスを作成してaddItemListener(listener)関数で追加するか、匿名クラスの手段を使用してインラインで追加します。

     checkBox.addItemListener(new ItemListener() {
    
        @Override
        public void itemStateChanged(ItemEvent e) {
           // put your code
        }
    });
    

    ItemListeneritemieCheckBoxなどで動作するコンポーネント用ですComboBox。他の種類の Even リスナーも存在しActionListenerますMouseListener

チュートリアル リソース:

  1. イベント リスナーの作成
  2. レイアウト マネージャーの使用
于 2013-10-27T17:12:53.900 に答える
1

私はあなたのコードを取得し、次のように変更しました。

package sandbox;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LoginLayoutDemo
{
    JPanel cards;

    public void addComponentToPane(Container pane)
    {
        // Panel for text and fields
        JPanel textAndFieldsPanel = new JPanel();
        textAndFieldsPanel.setLayout(new GridLayout(2,2));
        textAndFieldsPanel.add(new JLabel("Username ", JLabel.RIGHT));
        textAndFieldsPanel.add(new JTextField("Username", 10));
        textAndFieldsPanel.add(new JLabel("Password ", JLabel.RIGHT));
        textAndFieldsPanel.add(new JPasswordField("password", 10));

        JPanel controlsPanel = new JPanel();
        controlsPanel.setLayout(new BoxLayout(controlsPanel, BoxLayout.PAGE_AXIS));

        controlsPanel.add(textAndFieldsPanel);
        controlsPanel.add(new JCheckBox("Remember credentials"));

        JPanel bottomPanel = new JPanel();

        bottomPanel.add(controlsPanel);
        bottomPanel.add(new JButton("Login")); // end line here

        bottomPanel.add(new JButton("Register")); // end line here

        cards = new JPanel(new BorderLayout());
//      cards.setLayout(new BorderLayout(cards, BoxLayout.LINE_AXIS));
        cards.add(bottomPanel, BorderLayout.LINE_END);

        pane.add(cards, BorderLayout.PAGE_END);   // BOTTOM_RIGHT);// Add cards to bottom right hand
                                                                                                // corner.
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//      CardLayoutDemo demo = new CardLayoutDemo();
        new LoginLayoutDemo().addComponentToPane(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {

        try
        {

            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex)
        {
            ex.printStackTrace();
        } catch (IllegalAccessException ex)
        {
            ex.printStackTrace();
        } catch (InstantiationException ex)
        {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

LayoutManager について本当に学ぶ必要があります。Oracle/Java サイトにはまともなサイトがあり、すぐに利用できる他のサイトもあります。彼らのほとんどが最もうまくいかないと思うのは、マネージャーの目的とマネージャーを使って物事を設計する方法を全体的に説明することです。彼らはコードにすぐに飛び込む傾向があります。

LayoutManager はコンテナに適用され、コンテナに追加されたコンポーネントの処理方法を指示します。FlowLayout と BoxLayout は、選択した水平または垂直のいずれかで、物事を一列にレイアウトする傾向があります。GridLayout は、グリッド内のすべての「セル」が同じサイズで、テーブル内に物事をレイアウトします。BorderLayout には、中央のセクションと、N、S、E、および W 用にそれぞれ 1 つのセクションがあります。N、S は水平方向に伸び、E、W は垂直方向に伸びます。これらの 4 つすべてが、含まれているコンポーネントから他の次元を取得し、BorderLayout の中央が両方向に伸びて、コンテナー内の使用可能なスペースを埋めます。GroupLayout や GridBagLayout などがありますが、これらはすべて UI 設計の問題または一連の問題を解決するために設計されており、Swing UI を設計するにはそれらが何をするかを学ぶ必要があります。

一部のチュートリアルで行われているが実際には説明されていないこと: 各コンテナーには 1 つのレイアウト マネージャーがありますが、コンテナーは別のコンテナー内のコンポーネントになることができ、それを囲むコンテナーは別のレイアウト マネージャーを持つことができます。それがここで行ったことです。フレーム全体の BorderLayout は、構築したパネルを下部に配置し、パネル内の右揃えのパネルはそれらを右に配置します。それが彼らがすべて右下に到達する方法です。

他のコントロールを別の行に配置することを意図している可能性があります。私はあなたのための練習としてそれを残します...頑張ってください。

もう 1 つ: CardLayout は、何らかの理由で 2 つ以上のパネルが互いの上に配置されている場合 (つまり、一方が他方を隠している場合) に使用されます。UI にはそのような必要性はないと判断したので、CardLayout マネージャーを削除しました。

于 2013-10-28T01:10:35.670 に答える