微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在JLayeredPane中获取面板以在BorderLayout中拉伸

如何解决在JLayeredPane中获取面板以在BorderLayout中拉伸

我有以下基本安排:

+--- JFrame ---------------------------------------+
| +-- Panel --+ +-- JlayeredPane ----------------+ |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| |           | |                                | |
| +-----------+ +--------------------------------+ |
+--------------------------------------------------+

左侧的面板在WEST的{​​{1}}的{​​{1}}侧,JFrameBorderLayout中。如何在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 举报,一经查实,本站将立刻删除。