7

私はJavaでSpringLayoutを作成しようとしています。これは私が持っているコードです(Oracle Javaドキュメントから取得)

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

public class SpringForm {

    private static void createAndShowGUI() {
        String[] labels = {"Side1: ", "Side2: ", "Side3: "};
        int numPairs = labels.length;
        //Create and populate the panel.
        JPanel p = new JPanel(new SpringLayout());
        javax.swing.JButton calculate_btn;
        calculate_btn = new javax.swing.JButton();             

        for (int i = 0; i < numPairs; i++) {
            JLabel l = new JLabel(labels[i], JLabel.TRAILING);
            p.add(l);
            JTextField textField = new JTextField(10);
            l.setLabelFor(textField);
            p.add(textField);
        }
        calculate_btn.setText("Calculate");
        p.add(calculate_btn);
        //Lay out the panel.
        SpringUtilities.makeCompactGrid(p,
            numPairs, 2, //rows, cols
            6, 6,        //initX, initY
            6, 6);       //xPad, yPad     
        //Create and set up the window.
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
        //Set up the content pane.
        p.setOpaque(true);  //content panes must be opaque
        frame.setContentPane(p);     
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

上記のコードで私はこれを取得しています

ここに画像の説明を入力してください

しかし実際には私はこれを手に入れようとしています

ここに画像の説明を入力してください

私は他のレイアウトを気にしません!オラクルのヘルプが、私がやろうとしている私のニーズに本当に近いspringlayoutが下の図のようなレイアウトを取得することを示しているだけです。下で使用されているレイアウトがわかりません。また、私の試みでは、SpringLayoutIを使用しています。ウィンドウサイズを拡張すると、コントロールのサイズが自動的に変更されることに気付きました。これを無効にしますが、SpringLayoutは、ウィンドウを調整するときに、コントロールを調整することを明確に意味するため、意味がありません。

4

2 に答える 2

2

JavaトレイルからSpringLayout(実際にはほとんど最初の行):

このSpringLayoutクラスは、GUI ビルダーでのレイアウトをサポートするために JDK バージョン 1.4 で追加されました。SpringLayoutは、他のレイアウト マネージャーの多くの機能をエミュレートできる非常に柔軟なレイアウト マネージャーです。SpringLayoutただし、非常に低レベルであるため、Spring Layout Manager を手動でコーディングするのではなく、GUI ビルダーでのみ使用する必要があります。(強調を追加しました。)

私は何年も Java でプロとしてプログラミングを行ってきましたが、SpringLayout手でプログラミングするつもりはありません。代わりにMigLayout ライブラリを使用することをお勧めします。彼らの API は、レイアウトを手作業で行うコードに対してはるかに単純であり、ネイティブに非常に近いレイアウトを生成できます。私は長い間それを使用してきましたが、私が試した他の何よりも気に入っています. BorderLayoutスペース充填の仕組みにより、Java と組み合わせて使用​​すると特に便利です。強くお勧めします。


まず最初に:

  1. MigLayout はセルベースですが、セルの分割とスパンもサポートしています。HTML や Excel を使ったことがある人なら、それが何を意味するのか知っているはずです。それはかなり自明です。
  2. MigLayout のデフォルトの入力方法は文字列で、これは最も理解しやすいものですが、レイアウトを作成するための非常に優れた API も備えています。
  3. MigLayout は、SO の質問でカバーできる範囲をはるかに超えているため、上記のリンクをたどって、クイック スタート ガイドとチート シートを確認してください。それらは、制約に入れることができるものにとって最高のリソースです。

MigLayout投稿したサンプル画像と同様のレイアウトを作成するために使用する例を次に示します。

public static void main(String[] args) {
    JFrame frame = new JFrame("Testing MigLayout");
    JPanel contentPane = new JPanel(new MigLayout("fillx"));

    // Row 1
    JLabel areaLabel = new JLabel("Area of Triangle");
    areaLabel.setFont(areaLabel.getFont().deriveFont(16.0f));
    areaLabel.setHorizontalAlignment(JLabel.CENTER);
    contentPane.add(areaLabel, "spanx, growx, wrap");
    // wrap indicates a new row

    // Row 2
    JLabel side1Label = new JLabel("Side 1:");
    contentPane.add(side1Label, "alignx trailing");
    JTextField side1Field = new JTextField();
    side1Field.setColumns(6);
    contentPane.add(side1Field, "alignx leading, wrap");

    // Row 3
    JLabel side2Label = new JLabel("Side 2:");
    contentPane.add(side2Label, "alignx trailing");
    JTextField side2Field = new JTextField();
    side2Field.setColumns(6);
    contentPane.add(side2Field, "alignx leading, wrap");

    // Row 4
    JLabel side3Label = new JLabel("Side 3:");
    contentPane.add(side3Label, "alignx trailing");
    JTextField side3Field = new JTextField();
    side3Field.setColumns(6);
    contentPane.add(side3Field, "alignx leading, wrap");

    // Row 5
    JButton calculateButton = new JButton("Calculate Area");
    contentPane.add(calculateButton, "spanx, growx");

    frame.setContentPane(contentPane);
    // Resizes automatically
    frame.pack();
    // Centers automatically
    frame.setLocationRelativeTo(null);
    // Exit when the frame is closed
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setVisible(true);
}

そしてその出力:

MigLayout の例

もちろん、これにはすべてのロジックが含まれていませんが、それでも MigLayout の能力を示しています。より複雑なアプリケーションを使い始めて、コンポーネントをウィンドウで拡大および縮小する必要がある場合、MigLayout は非常にうまく機能します。を使用したことがある場合は、それが単に改良されたバージョンであることにGridBadLayout気付くでしょう。MigLayout

これのすべての個々の部分が何であるかについての参照については、チートシートを見てください. 私が使用したすべての作品の説明があります。具体的には、MigLayoutコンストラクターで宣言されたもの (ここでは"fillx") はレイアウト制約であり、addメソッドで宣言されたもの ( や など"spanx")"wrap"はすべてコンポーネント制約です。優れた GUI を作成する適切な組み合わせを得るために、練習と実験でできることは他にもあります。

GridLayoutそうは言っても、やのような単純なレイアウト マネージャーは常に他にもありBoxLayoutます。あなたのような単純なアプリケーションの場合、これらのレイアウト マネージャーはまったく問題ありません。より負荷の高いアプリケーションを使い始めるときは、MigLayout に割り込むことをお勧めします。それらについて読むには、Java Trails をお勧めします。そこにはレイアウトの視覚的なガイドもあり、それを出発点として使用できます. 手動でレイアウトする場合は、これらに固執することをお勧めします。

  • BorderLayout
  • BoxLayout
  • CardLayout
  • FlowLayout
  • GridBagLayout
  • GridLayout
于 2012-10-09T07:13:46.800 に答える
0

スプリング レイアウトを使用しようとしましたが、GUI エディター以外では非常にわかりにくいことがわかりました。可能であれば、別のマネージャーに切り替えることをお勧めします。

  • JGoodies の FormLayoutは非常によく知られており、多くの GUI ビルダーでサポートされています。最初は構文を理解するのが難しいかもしれませんが、一度理解すると、素敵なフォームを簡単に作成できます
  • MigLayoutも非常に優れていると言われています
于 2012-10-09T07:16:45.737 に答える