+-
Java Swing-难以实现所需的布局
我正在使用Swing在 Java中编写GUI.目前,我正在尝试创建一个“模块”(黄色块),该模块在左右边缘具有小部件支架(黑条).每个持有人将持有我想垂直显示的几个小块.这是一张图片:

示例模块:

我希望能够将洋红色/青色块沿小部件支架均匀地隔开.

我看过一些有关Swing的教程,并尝试将小部件持有人的布局实现为GridLayout和BoxLayout,但两者都没有运气.在这里,单列GridLayout似乎是很自然的选择,但是即使我编写了可以正确使用网格的小型测试程序,也似乎无法使其正常工作.

布局管理器只能在简单的示例中工作,而不能在这个稍微复杂一些的程序中工作,这一事实使我感到困惑.

在我的程序中

>该模块是一个JPanel
>小部件支架/黑条也是JPanel
>小部件本身(青色/品红色块)当前是JPanels,但我也尝试将它们作为JLabel和JButtons使用.我只希望他们能够听取鼠标事件并具有区域和颜色.

顺便提一句,我在模块本身的布局方面也遇到了麻烦,无法将小部件支架定位在左侧和右侧.我尝试使用水平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);
}

这是两种类型的小部件(input [洋红色],output [青色])派生的抽象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的方式无关,因此我将省略其余代码.

这是程序运行时的外观:

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

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.您可以将小部件支架添加到主面板的WEST和EAST中.

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

点击查看更多相关文章

转载注明原文:Java Swing-难以实现所需的布局 - 乐贴网