当前位置: 首页 > 知识库问答 >
问题:

JLayeredPane之后未出现的组件

巢睿
2023-03-14

我有一个从JFrame扩展的类。我在它里面有多个JLayeredPanes。我想从一个JLayeredPane切换到另一个JLayeredPane。因为我所做的是;

  1. remove(pane1)一样删除当前的JLayeredPane;
  2. repaint();
  3. 向新的JLayeredPane添加组件并设置边界
  4. 添加(pane2)

下面是一个包含整个java文件的zip文件http://s000.tinyupload.com/index.php?file_id=33381866612121130517

共有1个答案

李意致
2023-03-14

我将这个JLayeredPane示例与这个CardLayout示例结合起来演示多个可选择的分层窗格。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/36587584/230513
 * @see https://stackoverflow.com/a/6432291/230513
 * @see https://stackoverflow.com/questions/6432170
 */
public class CardPanel extends JLayeredPane {

    private static final Dimension d = new Dimension(320, 240);
    private static final Random random = new Random();
    private static final JPanel cards = new JPanel(new CardLayout());
    private static final JComboBox combo = new JComboBox();
    private final String name;

    public CardPanel(String name) {
        this.name = name;
        this.setBackground(new Color(random.nextInt()));
        this.add(new LayerPanel(1 * d.height / 8), 100);
        this.add(new LayerPanel(2 * d.height / 8), 101);
        this.add(new LayerPanel(3 * d.height / 8), 102);
    }

    @Override
    public Dimension getPreferredSize() {
        return d;
    }

    @Override
    public String toString() {
        return name;
    }

    private static class LayerPanel extends JPanel {

        private static final Random r = new Random();
        private int n;
        private Color color = new Color(r.nextInt());

        public LayerPanel(int n) {
            this.n = n;
            this.setOpaque(false);
            this.setBounds(n, n, d.width / 2, d.height / 2);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(color);
            g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 16, 16);
            g2d.setColor(Color.black);
            g2d.drawString(String.valueOf(n), 5, getHeight() - 5);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 1; i < 9; i++) {
            CardPanel p = new CardPanel("Panel " + String.valueOf(i));
            combo.addItem(p);
            cards.add(p, p.toString());
        }
        JPanel control = new JPanel();
        combo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox jcb = (JComboBox) e.getSource();
                CardLayout cl = (CardLayout) cards.getLayout();
                cl.show(cards, jcb.getSelectedItem().toString());
            }
        });
        control.add(combo);
        f.add(cards, BorderLayout.CENTER);
        f.add(control, BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
 类似资料:
  • 我试图创建一个超级简单的组件,但它没有出现。 组件类别: 面板类我将其添加到: JFrame: 唯一出现的是黄色背景。JFrame和JPanel工作正常;在构建jcomponents时,这个问题一直发生在我身上。我错过了什么? 任何帮助都将不胜感激!

  • 我一直在关注Oracle的JLayeredPane教程,但它们的布局方式让我感到困惑,也没有理解我想要做什么。 我有一个应用程序,到目前为止还没有层的概念。所有东西都在JFrame中的一个单层中布局。

  • 问题内容: 我正在开发国际象棋游戏。我想让板容器使用GridLayout来显示JPanels的8x8网格。(这将使诸如突出显示所选正方形和有效移动之类的功能变得更加容易。)然后,我想在此层上添加片段,以便将其拖放。我最初是通过在单独的正方形JPanels中绘制它们来显示这些块的,但后来发现尝试将它们拖放时,这是一个问题。从那以后,我一直在尝试使用JLayeredPane作为主要容器,但是遇到了几个

  • 主要内容:1 Java JLayeredPane的介绍,2 Java JLayeredPane的声明,3 Java JLayeredPane的构造方法,4 Java JLayeredPane的方法,5 Java JLayeredPane的案例1 Java JLayeredPane的介绍 JLayeredPane类用于增加摆动容器的深度。它用于提供用于定位组件的第三维,并将深度范围划分为几个不同的层。 2 Java JLayeredPane的声明 3 Java JLayeredPane的构造方法

  • 问题内容: 我有一个包含三个部分的搜索页面。浏览主题组件列出了可供选择的主题。浏览文章组件基于主题ID列出所有文章,如果没有主题ID,则加载所有文章。home组件包含browsertopics和browserarticles组件,并根据所单击的主题更改其状态。 我需要的是,我希望BrowseTopics组件在父状态更改时停止重新呈现。我尝试使用shouldComponentUpdate()(返回f

  • 问题内容: 情况:像在纸牌游戏中一样,画一堆纸牌。堆好。 为实现此目的,我将结合使用接口的自定义实现。使用自定义LayoutManager的原因是堆栈方向各不相同,有时纸牌彼此完全覆盖,有时彼此覆盖,而对于LayoutManager来说,此逻辑似乎是一项好工作,因为这基本上归结为设置布局的位置。牌。 因此,负责设置堆栈中所有组件的X和Y坐标。在另一方面是负责他们的z坐标(通过其层)。 向组件添加组