我正在使用Swing编写Java GUI。目前,我试图创建一个“模块”(黄色块),它在左侧和右侧具有小部件容器(黑色条)。每个容器将容纳几个小块,并且我想要以垂直线显示它们。下面是一张图片:
示例模块:
我希望能够使品红/青色块在小部件容器中均匀分布。
我查看了几个Swing教程,并尝试将小部件容器的布局实现为GridLayout和BoxLayout,但都没有成功。单列GridLayout似乎是这里的自然选择,但即使我编写了小型测试程序,也无法使其正常工作。
布局管理器在简单示例中运行,但在这个稍微复杂的程序中却无法工作,这让我感到困惑。
在我的程序中:
- 模块是一个JPanel - 小部件容器/黑条也是JPanel - 小部件本身(青/品红块)目前是JPanel,但我也尝试过将它们设置为JLabel和JButton。我只是希望它们能够监听鼠标事件并具有区域和颜色。
另外,我还遇到了关于模块本身布局的问题,以将小部件容器放置在左侧和右侧。我尝试使用水平BoxLayout(holder,horizontal glue,holder),还尝试使用BorderLayout(使用EAST/WEST分别作为容器),但无论我做什么,容器都不会移动 - 因此,尽管我不想这样做,我使用了setBounds()来定位它们。
模块类(小部件容器为inputLine和outputLine):
这是IOWidget类的摘要,两种类型的小部件(输入[品红色]和输出[青色])都从它派生。稍后将添加功能。
这是InputWidget类。目前,它与OutputWidget完全相同,直到我添加额外的功能,因此我将仅发布这一个:
示例模块:
![enter image description here](https://istack.dev59.com/KZ3Qd.webp)
我查看了几个Swing教程,并尝试将小部件容器的布局实现为GridLayout和BoxLayout,但都没有成功。单列GridLayout似乎是这里的自然选择,但即使我编写了小型测试程序,也无法使其正常工作。
布局管理器在简单示例中运行,但在这个稍微复杂的程序中却无法工作,这让我感到困惑。
在我的程序中:
- 模块是一个JPanel - 小部件容器/黑条也是JPanel - 小部件本身(青/品红块)目前是JPanel,但我也尝试过将它们设置为JLabel和JButton。我只是希望它们能够监听鼠标事件并具有区域和颜色。
另外,我还遇到了关于模块本身布局的问题,以将小部件容器放置在左侧和右侧。我尝试使用水平BoxLayout(holder,horizontal glue,holder),还尝试使用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无关,因此我将省略其余代码。
当运行程序时,它看起来像这样:
为了完整起见,以下是调用单个模块列表的输出:
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开发都很新,所以对于风格/约定或任何方面的批评都欢迎。