0

私は Java Swing の初心者で、問題があります。

この画像のようなものからインスピレーションを得て、ログイン ウィンドウを作成する必要があります (このようなものです。ウィンドウには、ユーザーがユーザー名とパスワードを挿入する 2 つのテキスト フィールドと、ログイン操作を実行するためのボタンを表示する必要があります)。

ここに画像の説明を入力

わかりました、これは非常に単純だと思います。それを行う次のクラスを実現しました。

package com.techub.crystalice.gui.login;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.jdesktop.application.SingleFrameApplication;

import com.techub.crystalice.gui.Constants;
import com.techub.crystalice.gui.GUI;

public class LoginFrame extends SingleFrameApplication {

    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("DENTRO: LoginFrame() ---> startup()");


        this.getMainFrame().setTitle("MyApp Login");
        //this.getMainFrame().setSize(600, 350);            // Setta le dimensioni del JFrame che rappresenta la finestra principale
        this.getMainFrame().pack();
        Container mainContainer = this.getMainFrame().getContentPane();     // Recupera l'oggetto Container del JFrame

        // Imposta un layput manager di tipo GridLayout per il contenitore principale: 3 righe ed una singola colonna:
        mainContainer.setLayout(new GridLayout(3,1));   

        // Contenitore rappresentato da 6 righe a singola colonna contenente i campi testuali e di input del login: 
        JPanel body = new JPanel();

        body.setLayout(new GridLayout(5, 1));

        JPanel usernNameLabelPabel = new JPanel();
        usernNameLabelPabel.add(new JLabel("Username"));
        body.add(usernNameLabelPabel);


        JPanel userNameTextPanel = new JPanel();
        JTextField userName = new JTextField();
        userNameTextPanel.add(userName);
        body.add(userNameTextPanel);


        JPanel passwordLabelPanel = new JPanel();
        passwordLabelPanel.add(new JLabel("Password"));
        body.add(passwordLabelPanel);


        JPanel passwordTextPanel = new JPanel();
        JTextField password = new JTextField();
        passwordTextPanel.add(password);
        body.add(passwordTextPanel);


        this.getMainFrame().add(body);      // Aggiunge al JFrame principale il JPanel contenente il form di login


        show(this.getMainFrame());

        JPanel footer = new JPanel();
        footer.setLayout(new FlowLayout(FlowLayout.CENTER)); 

        JButton loginButton = new JButton("Login");
        footer.add(loginButton);

        this.getMainFrame().add(footer);    // Aggiunge al JFrame principale il JPanel contenente il bottone di login

    }

    public static void main(String[] args) {
        System.out.println("DENTRO: LoginFrame() ---> main()");
        launch(LoginFrame.class, args);
    }

}

このクラスは、startup() メソッドの定義を含む JDesktop という小さなフレームワークを使用しますが、これは純粋な Swing コードです。唯一言えることは、次のコード行でメインの *JFrame * を取得するということです。

this.getMainFrame()

この例はうまく機能していないように見えます。実際には、ログイン フォームの視覚化に美学上の問題があり、次の結果が得られるためです。

ここに画像の説明を入力

ご覧のとおり、多くのエラーが表示されます。

  1. JLabel と JTextField は互いに垂直方向に圧縮されます
  2. 前の例では、要素が中央に配置され、左側に配置されていません。
  3. JTextField が短すぎる

これらの問題を解決するにはどうすればよいですか?

4

1 に答える 1

3
    JPanel passwordLabelPanel = new JPanel();
    passwordLabelPanel.add(new JLabel("Password"));
    body.add(passwordLabelPanel);

JLabel/JTextFeildcomponent( ) を別のコンテナ内に配置し、それをルート コンテナに追加して、いくつかの場所で同様のコードを実行しましたbody。どのパネルにFlowLayoutも、追加するコンポーネントの推奨サイズに従うデフォルトのレイアウトがあります。に追加していますpassword labelpasswordLabelPanel、優先サイズを設定していません。TextFieldとそれのコンテナで発生している同じ問題passwordTextPanellabelこれに優先サイズを設定textFeildして、満足のいく出力を得ることができます。でも実は、このアウターパネルは全く必要ありません。bodyラベルとテキスト フィールドをパネルに直接追加するだけです。

これらの問題を解決するにはどうすればよいですか?

上記の説明も解決策です。しかし、長い目で見れば、レイアウト マネージャーを学ばなければ意味がありません。

努力する価値のある、最も簡単で効率的な方法は、ここから始めることです:レッスン: コンテナ内にコンポーネントを配置する、信じてください。私たちを含め、多くの時間を節約できます。

于 2013-11-07T18:07:41.403 に答える