gpt4 book ai didi

java - 如何将 FlowLayout 与绝对定位混合使用

转载 作者:行者123 更新时间:2023-11-29 05:55:17 25 4
gpt4 key购买 nike

我有这段代码可以加载 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 张卡片并正确识别它们。
但问题是现在我想在框架上放置一个按钮。这个按钮应该放置在屏幕的大约中央,但是如果我将它添加到 Pane 中,按钮将放置在其他面板附近,使用水平流布局设置的间隙。
如何在不改变面板位置的情况下将其放置在绝对位置(因此我希望使用流布局添加 5 个面板,并在绝对位置添加一个按钮)。

最佳答案

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

在这种情况下:

  1. 我会将 5 张卡片包装在一个单独的 JPanel 中(使用您的 FlowLayout)。
  2. 我会将该面板放在内容 Pane 中。
  3. 并使用另一个 JPanel 作为我将添加到内容 Pane 南端的按钮(默认情况下,内容 Pane 使用 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);
}
}

关于java - 如何将 FlowLayout 与绝对定位混合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12397119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com