0

何らかの理由で、別のパネルの内側にあるパネルを垂直方向に中央に配置するのに問題があります。私は私が研究した例とまったく同じようにしていますが、それでも運がありません。

そこに私のコードがあります。コンテナパネルでsetAlignmentY(0.5f)を使用しているにもかかわらず、ウィンドウのサイズを変更しても中央に配置されません。

また、setAligenmentX(0.5f)にもかかわらず、コンテナパネル内のコンポーネントも中央に配置されません。

これに対する解決策があるかどうか疑問に思います、私はほとんどすべてをそこに試しましたが、解決策を見つけることができませんでした。

JLabel idLabel;
    JLabel passLabel;
    JTextField id;
    JTextField pass;
    JButton enter;
    JPanel container;

    public JournalLogin()
    { 
        //setLayout(new FlowLayout());
        //setPreferredSize(new Dimension(500, 500));
        //setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));


        container = new JPanel();
        container.setLayout(new MigLayout());
        container.setAlignmentX(0.5f);
        container.setAlignmentY(0.5f);
        container.setPreferredSize(new Dimension(300, 300));
        container.setBorder(BorderFactory.createTitledBorder("Login"));
        add(container);

        idLabel = new JLabel("ID:");
        idLabel.setAlignmentX(0.5f);
        container.add(idLabel);

        id = new JTextField();
        id.setText("id");
        id.setAlignmentX(0.5f);
        id.setPreferredSize(new Dimension(80, 20));
        container.add(id, "wrap"); 
4

3 に答える 3

3

setAlignmentXとYは、これを実行する方法ではありません。コンポーネントをコンテナの中央に配置する1つの方法は、コンテナにGridBagLayoutを使用させ、GridBagConstraintsを使用せずにコンポーネントを追加することです。これはいわゆるデフォルトの追加です。他の方法もあります。

たとえば、Nick Rippeの例(彼に1+)を変更するには:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.*;

public class UpdatePane2 extends JPanel {
   private static final int PREF_W = 300;
   private static final int PREF_H = 200;

   public UpdatePane2() {
      JPanel innerPanel = new JPanel();
      innerPanel.setLayout(new BorderLayout());
      innerPanel.add(new JLabel("Hi Mom", SwingConstants.CENTER), 
            BorderLayout.NORTH);
      innerPanel.add(new JButton("Click Me"), BorderLayout.CENTER);

      setLayout(new GridBagLayout());
      add(innerPanel);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("UpdatePane2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new UpdatePane2());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-08-06T21:08:19.560 に答える
2

Swingでは配置がかなりうるさい傾向があります-それらは[通常]機能します...しかし、中央に配置されたパネルだけを探している場合は、BoxLayout(私の個人的なお気に入りLayoutManager)でボックスを使用することをお勧めします。開始するための例を次に示します。

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

public class UpdatePane extends JPanel{

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                //Create Buffers
                Box verticalBuffer = Box.createVerticalBox();
                Box horizontalBuffer = Box.createHorizontalBox();

                verticalBuffer.add(Box.createVerticalGlue()); //Top vertical buffer
                verticalBuffer.add(horizontalBuffer);

                horizontalBuffer.add(Box.createHorizontalGlue()); //Left horizontal buffer

                //Add all your content here
                Box mainContent = Box.createVerticalBox();
                mainContent.add(new JLabel("Hi Mom!"));
                mainContent.add(new JButton("Click me"));
                horizontalBuffer.add(mainContent);

                horizontalBuffer.add(Box.createHorizontalGlue());  //Right horizontal buffer
                verticalBuffer.add(Box.createVerticalGlue()); //Bottom vertical buffer


                // Other stuff for making the GUI
                verticalBuffer.setPreferredSize(new Dimension(300,200));
                JFrame frame = new JFrame();
                frame.add(verticalBuffer);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);

            }
        });
        }

}
于 2012-08-06T21:08:08.230 に答える
1

レイアウトを中央に配置するには、LayoutManagerを取得する必要があります。現在、「MigLayout」の実装はアライメントを尊重していないようです。変更するか、サブクラスを作成してみてください。

于 2012-08-06T20:55:56.173 に答える