【问题标题】:components not appearing after JLayeredPaneJLayeredPane 之后没有出现的组件
【发布时间】:2016-04-12 23:16:58
【问题描述】:

我有一个从 JFrame 扩展而来的类。我里面有多个 JLayeredPanes。我想从一个 JLayeredPane 切换到另一个。为此,我所做的是;

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

这将删除我当前的 JLayeredPane 并显示下一个 JLayeredPane。但是组件没有添加到正确的位置。例如,我有一个包含 textarea 的 jscrollpane。仅显示滚动窗格并且缺少文本区域。此外,组合框的大小也发生了变化。为什么会这样?

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

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
  • @MadProgrammer 我已经上传了文件
  • setLayout(null); 是你的第一个坏主意
  • 你知道,据我所知,你不需要使用JLayeredPane,不太清楚你为什么要使用它,但是你可以使用CardLayout来切换视图之间
  • @MadProgrammer 有什么快速解决方法吗?还在使用分层窗格?我需要你的帮助

标签: java swing jlayeredpane


【解决方案1】:

我将 JLayeredPane exampleCardLayout example 结合起来演示了多个可选择的分层窗格。

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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2011-11-05
    相关资源
    最近更新 更多