如何解决在JLayeredPane中获取面板以在BorderLayout中拉伸
我有以下基本安排:
+--- JFrame ---------------------------------------+
| +-- Panel --+ +-- JlayeredPane ----------------+ |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| +-----------+ +--------------------------------+ |
+--------------------------------------------------+
左侧的面板在WEST
的{{1}}的{{1}}侧,JFrame
在BorderLayout
中。如何在JlayeredPane的JlayeredPane
层上获得一个面板以扩展JFrame的大小?
我尝试在JlayeredPane上设置BorderLayout,但是失败并显示:
CENTER
我正在使用DEFAULT
,我想这与边框布局不兼容。
编辑:这是一个小例子来说明:
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)
如您所见,中间的面板(蓝色边框以查看其边框在哪里)不会展开;我可能曾预计JlayeredPane会扩展,因此其默认(和其他?)层中的面板也会扩展,但似乎都没有。应该怎么做?
解决方法
我相信这可以满足您的需求。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
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;
private static JPanel otherPanel;
public static void main(String[] args)
{
JLayeredPaneProblem main = new JLayeredPaneProblem();
main.getContentPane().addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// Do nothing.
}
@Override
public void componentResized(ComponentEvent e) {
System.out.println("componentResized()");
otherPanel.setPreferredSize(e.getComponent().getSize());
otherPanel.setMaximumSize(e.getComponent().getSize());
otherPanel.setSize(e.getComponent().getSize());
otherPanel.revalidate();
otherPanel.repaint();
}
@Override
public void componentMoved(ComponentEvent e) {
// Do nothing.
}
@Override
public void componentHidden(ComponentEvent e) {
// Do nothing.
}
});
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()
{
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
考虑了其所包含组件的不同大小。因此,您需要动态更改这些大小,以响应顶级JFrame
大小的更改。
为了知道何时调整顶级JFrame
的大小,我在ComponentListener
的内容窗格中添加了JFrame
,并且每当内容窗格的大小发生变化时,我都会设置{ {1}}大小以匹配内容窗格的新大小。
我尝试在JLayeredPane上设置BorderLayout,但由于...而失败:
正常添加组件,然后设置图层:
private Component getMiddlePanel(JPanel wrappedPanel)
{
JLayeredPane middlePanel = new JLayeredPane();
//middlePanel.add(wrappedPanel,JLayeredPane.DEFAULT_LAYER);
middlePanel.setLayout(new BorderLayout() );
middlePanel.add(wrappedPanel,BorderLayout.CENTER);
middlePanel.setLayer(wrappedPanel,JLayeredPane.DEFAULT_LAYER);
return middlePanel;
}
使用这种方法,不需要ComponentListener。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。