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 个面板,并在绝对位置添加一个按钮)。

4

1 回答 1

3

您不能将绝对布局与 LayoutManager 混合使用。

在这种情况下:

  1. 我会将 5 张卡片包装在单独的 JPanel 中(使用您的 FlowLayout)。
  2. 我会将该面板放在内容窗格中。
  3. 并使用另一个 JPanel 作为我将添加到内容窗格的 SOUTH 的按钮(默认情况下,内容窗格使用 BorderLayout)。在这个面板中,我将简单地使用一个 FlowLayout,并将对齐设置为 CENTER。
  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 回答