【发布时间】:2020-11-10 13:18:00
【问题描述】:
我的基本安排如下:
+--- JFrame ---------------------------------------+
| +-- Panel --+ +-- JLayeredPane ----------------+ |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| +-----------+ +--------------------------------+ |
+--------------------------------------------------+
左侧面板位于JFrame 的BorderLayout 的WEST 一侧,JLayeredPane 位于CENTER 中。如何让 JLayeredPane 的 DEFAULT 层上的面板以 JFrame 的大小进行拉伸?
我尝试在 JLayeredPane 上设置 BorderLayout,但失败:
Caused by: java.lang.reflect.InvocationTargetException
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1349)
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1324)
at org.rc.vitruvius.Vitruvius.main(Vitruvius.java:17)
Caused by: java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)
at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:426)
at java.awt.Container.addImpl(Container.java:1130)
at javax.swing.JLayeredPane.addImpl(JLayeredPane.java:231)
at java.awt.Container.add(Container.java:975)
我正在使用add(Component, LayerConstant),我猜这与边框布局不兼容。
编辑:这里有一个小例子来说明:
package sandbox;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class JLayeredPaneProblem extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(String[] args)
{
JLayeredPaneProblem main = new JLayeredPaneProblem();
main.go();
}
public void go()
{
createMainUI();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void createMainUI()
{
JPanel leftPanel = getLeftPanel();
Component middlePanel = getMiddlePanel(getOtherPanel());
add(leftPanel, BorderLayout.WEST);
add(middlePanel, BorderLayout.CENTER);
pack();
}
private Component getMiddlePanel(JPanel wrappedPanel)
{
JLayeredPane middlePanel = new JLayeredPane();
middlePanel.add(wrappedPanel, JLayeredPane.DEFAULT_LAYER);
return middlePanel;
}
private JPanel getOtherPanel()
{
JPanel otherPanel = new JPanel();
Dimension size = new Dimension(100,100);
otherPanel.setSize(size);
otherPanel.setPreferredSize(size);
otherPanel.setBorder(BorderFactory.createLineBorder(Color.blue));
return otherPanel;
}
private JPanel getLeftPanel()
{
JPanel innerPanel = new JPanel();
innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.PAGE_AXIS));
JButton button = new JButton("button");
String [] items = { "One", "Two", "Three" };
JComboBox<String> cbox = new JComboBox<>(items);
innerPanel.add(button);
innerPanel.add(cbox);
JPanel leftPanel = new JPanel();
leftPanel.add(innerPanel);
return leftPanel;
}
}
如您所见,中间的面板(蓝色边框可查看其边框的位置)没有展开;我可能预计 JLayeredPane 会扩展,因此默认(和其他?)层中的面板会扩展,但似乎都没有。这应该怎么做?
【问题讨论】:
-
错误消息表明您正在调用方法add(Component, Object),但第二个方法参数是
int,而不是Object。也许如果您愿意edit 您的问题并发布minimal reproducible example,我也许可以帮助您解决这个问题。或者您只需将int更改为Integer? -
在 JLayeredPane 上设置
BorderLayout的尝试是在黑暗中刺伤;我希望有人知道它应该如何完成,而不是仅仅尝试或多或少随机的东西来看看它是否有效。我可以花一些时间从根本不是最小的东西中提取一个例子,但我并不是试图避免这个错误消息,我试图找出应该如何做到这一点。我很满意自己在 JLayeredPane 上设置 BorderLayout 不是这样。 -
我想添加一个面板,该面板将具有空布局,并且我将使用它进行绝对定位。如果我转储 JLayeredPane 的大小和首选大小,我分别得到 38,61 和 1,1——我不知道 38,61 来自哪里。我希望这个中间区域成为用户可以拖放图像的面板,所以我希望它能够扩展以适应可用空间。这就是我想弄清楚该怎么做。
标签: java swing border-layout jlayeredpane