1

5つの画像をロードし、FlowLayoutを使用してそれらをフレームに配置する次のコードがあります。

public class Main
{
    private static final int verticalGap=50;
    private static final int horizontalGap=30;
    private static final int width= 800;
    private static final int height= 800;
    public static void main(String[] args)
    {
        FlowLayout layout=new FlowLayout(FlowLayout.LEADING,horizontalGap,verticalGap);
        JButton button= new JButton("Discard");
        ImagePanel[] panels= new ImagePanel[5];
        Deck deck= new Deck();
        JFrame frame= new JFrame("Poker");
        frame.setSize(width, height);
        frame.setLayout(layout);
        frame.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        deck.mix();
        for(int i=0; i<5; i++)
        {
            panels[i]= new ImagePanel();
            panels[i].setImage(deck.getCard(i));
            frame.getContentPane().add(panels[i]);
        }
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

コードは5枚のカードをロードし、それらを正しく検出します。
しかし、問題は、フレームにボタンを配置したいということです。このボタンは画面のほぼ中央に配置する必要がありますが、ペインに追加すると、ボタンは水平方向を使用して他のパネルの近くに配置されます。フローレイアウトが設定したギャップ。
パネルの位置を変更せずに絶対位置に配置するにはどうすればよいですか(したがって、フローレイアウトを使用して5つのパネルを追加し、1つのボタンを絶対位置に追加します)。

4

1 に答える 1

3

絶対レイアウトとLayoutManagerを混在させることはできません。

この場合:

  1. 5枚のカードを別のJPanelでラップします(FlowLayoutを使用)。
  2. そのパネルをコンテンツペインに配置します。
  3. コンテンツペインの南に追加するボタンに別のJPanelを使用します(デフォルトでは、コンテンツペインはBorderLayoutを使用します)。このパネルでは、アライメントをCENTERに設定してFlowLayoutを使用します。
  4. SwingUtilities.invokeLaterを使用してGUI初期化コードをEDTに移動します(常にEDTでGUIを実行します!)

これがそのソリューションに対応するコードです(ただし、他のクラスがないため、テストできませんでした)。

import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main {
    private static final int verticalGap = 50;
    private static final int horizontalGap = 30;
    private static final int width = 800;
    private static final int height = 800;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main().initUI();
            }
        });
    }

    private void initUI() {
        FlowLayout layout = new FlowLayout(FlowLayout.LEADING, horizontalGap, verticalGap);
        JButton button = new JButton("Discard");
        ImagePanel[] panels = new ImagePanel[5];
        Deck deck = new Deck();
        JFrame frame = new JFrame("Poker");
        frame.setSize(width, height);
        frame.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        deck.mix();
        JPanel deckPanel = new JPanel(layout);
        for (int i = 0; i < 5; i++) {
            panels[i] = new ImagePanel();
            panels[i].setImage(deck.getCard(i));
            deckPanel.add(panels[i]);
        }
        frame.getContentPane().add(deckPanel);
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        buttonPanel.add(button);
        frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();// Sets the frame size to its preferred size.
        // You can also call setSize() instead
        frame.setVisible(true);
    }
}
于 2012-09-12T23:24:52.970 に答える