gpt4 book ai didi

Java Swing - 难以实现所需的布局

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:53 27 4
gpt4 key购买 nike

我正在使用 Swing 在 Java 中编写 GUI。目前,我正在尝试创建一个“模块”(黄色 block ),它在左右边缘都有一个小部件支架(黑色条)。每个支架将容纳几个我想在垂直线上显示的小块。这是一张图片:

示例模块: enter image description here

我希望能够将洋红色/青色 block 沿小部件支架均匀分布。

我看过几个 Swing 教程,并尝试将小部件持有者的布局实现为 GridLayout 和 BoxLayout,但都没有成功。单列 GridLayout 似乎是这里的自然选择,但我似乎无法让它工作,即使我已经编写了正确使用网格的小测试程序。

布局管理器在简单示例中工作,但在这个稍微复杂一点的程序中却没有,这一事实让我感到困惑。

在我的程序中,

  • 该模块是一个 JPanel
  • 小部件持有者/黑条也是 JPanel
  • 小部件本身(青色/品红色 block )目前是 JPanel,但我也尝试过将它们作为 JLabel 和 JButton。我只希望它们能够监听鼠标事件并拥有区域和颜色。

附带说明一下,我在模块本身的布局方面也遇到了麻烦,无法将小部件支架定位在左侧和右侧。我尝试使用水平 BoxLayout(支架、水平胶水、支架),还有一次我尝试使用 BorderLayout(对任一支架使用 EAST/WEST),但无论我做什么,支架都不会让步 - 就像我一样不想,我使用 setBounds() 来定位它们。

模块类(小部件持有者是 inputLine 和 outputLine):

public class Module extends JPanel
{
private static final int MOD_WIDTH = 86;
private static final int MOD_HEIGHT = 60;

private int screenX, screenY, myX, myY;

private boolean moving = false;

// figure out the layout !
private JPanel inputLine, outputLine;

public Module()
{
//super(new BorderLayout());

initPanel();
initWidgets();
initMouse();

setLayout(null);

list();
}

private final void initPanel()
{
this.setSize(new Dimension(MOD_WIDTH, MOD_HEIGHT));
this.setBackground(Color.ORANGE);
}

private void initWidgets()
{
inputLine = new JPanel(new GridLayout(0, 1, 5, 5));
outputLine = new JPanel(new GridLayout(0, 1, 5, 5));

inputLine.setBounds (0, 0, 18, 60);
outputLine.setBounds(68, 0, 18, 60);

this.add(inputLine);
this.add(outputLine);

/* adding IOWidgets to test */
inputLine.add(new InputWidget());
inputLine.add(new InputWidget());
inputLine.add(new InputWidget());

outputLine.add(new OutputWidget());
outputLine.add(new OutputWidget());
outputLine.add(new OutputWidget());
outputLine.add(new OutputWidget());

inputLine.setBackground(Color.BLACK);
outputLine.setBackground(Color.BLACK);
}


这是抽象的 IOWidget 类,两种类型的小部件(输入[洋红色],输出[青色])都从中派生。稍后将添加功能。

public abstract class IOWidget extends JLabel
{

private static final int EDGE_SIZE = 8;

public IOWidget()
{
this.setSize(new Dimension(EDGE_SIZE, EDGE_SIZE));
}
}


这是 InputWidget 类。目前,在我添加额外功能之前,它与 OutputWidget 相同,所以我只会发布这个:

public class InputWidget extends IOWidget
{
public InputWidget()
{
this.setBackground(Color.MAGENTA);
}
}


在我的应用程序中,模块被添加到一个更大的 JPanel 中。我希望模块的布局独立于它添加到另一个 JComponent 的方式,因此我将省略其余代码。

这是程序运行时的样子:

enter image description here

为了完整起见,这里是单个模块上调用列表的输出:

rhopkins.honors.Dataflow.Module[,0,0,86x60,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
javax.swing.JPanel[,0,0,18x60,invalid,layout=java.awt.GridLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
rhopkins.honors.Dataflow.InputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
rhopkins.honors.Dataflow.InputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
rhopkins.honors.Dataflow.InputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
javax.swing.JPanel[,68,0,18x60,invalid,layout=java.awt.GridLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
rhopkins.honors.Dataflow.OutputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
rhopkins.honors.Dataflow.OutputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
rhopkins.honors.Dataflow.OutputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]
rhopkins.honors.Dataflow.OutputWidget[,0,0,8x8,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=8,height=8]]

我非常想知道我做错了什么。另外,我知道我是 Swing 和 GUI 开发的新手,所以欢迎任何关于样式/约定/任何方面的批评。

最佳答案

不要使用空布局。

您的主面板可能应该是 BorderLayout。您可以将小部件支架添加到主面板的西侧和东侧。

小部件面板应该能够使用垂直的 BoxLayout。您需要在添加到面板的每个小部件之前/之后添加胶水。由于 BoxLayout 尊重组件的大小,因此您需要覆盖 getPreferredSize()、getMinimumSize() 和 getMaximumSize() 方法以返回相同的值。这样,面板中的任何额外空间都应在您添加的胶水之间平均分配。

关于Java Swing - 难以实现所需的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415758/

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