繁体   English   中英

JPanel 没有出现在 JDialog 中

[英]JPanel does not appear in JDialog

我正在使用以下语句解决活动:创建一个应用程序以在 JDialog window 中显示八个 JPanel 组件。 每个面板应在图 1 中的八个 colors 之一中着色。图 1

在每个面板上都应该写下翻译颜色含义的单词。 使用 18 号字体。每个面板应使用表 1 中的颜色着色,指定与颜色含义相对应的每个 RGB(红、绿、蓝)分量的数量。 使用 java.awt.Color class。 应该只实现一个 paintComponent 方法来绘制 8 个面板并写入每种颜色的含义。 表格1

问题是我的 JPanel 没有出现在 JDialog 中。 而且我不知道如何让它出现。

遵循代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class SigCoresGUI extends JDialog {

    private static final long serialVersionUID = 1L;
    private Color[] cores = { new Color(255, 255, 255), new Color(249, 206, 137), new Color(255, 128, 0),
            new Color(255, 0, 0), new Color(244, 102, 174), new Color(5, 120, 203), new Color(116, 186, 160),
            new Color(0, 0, 0) };
    private String[] sig = { "Paz", "Energia", "Criatividade", "Paixão", "Ternura", "Tranquilidade", "Harmonia",
            "Elegância" };
    private Font font = new Font("Arial", Font.BOLD, 18);

    public SigCoresGUI() {
        super();
        Desenha desenha = new Desenha();
        add(desenha);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);
        setLayout(new GridLayout(8, 8));
        setSize(400, 500);
        setVisible(true);
    }

    public class Desenha extends JPanel {
        private static final long serialVersionUID = 1L;

        @Override
        public void paintComponents(Graphics g) {
            super.paintComponents(g);
            for (int i = 0; i < 8; i++) {
                JPanel panel = new JPanel();
                panel.setBackground(cores[i]);
                panel.setFont(font);
                JLabel label = new JLabel(sig[i]);
                label.setFont(font);
                if (i > 0)
                    label.setForeground(Color.WHITE);
                panel.add(label);
                add(panel);
            }
        }
    }
}

永远不要在绘画方法中从容器(这里是您的 JPanel)中添加或删除组件。 绘画方法应该只用于绘画和绘画,而不是改变容器的组件结构。 了解您无法直接控制何时调用或什至调用绘制方法,并且可以多次调用它——将许多不必要的组件添加到容器中——而且你也永远不想减慢绘制速度。

您正在覆盖paintComponents,这是一种(根据API)

绘制此容器中的每个组件

并且由于 JPanel 没有以开始的组件,因此可能永远不会调用该方法。

相反,在 SigCoresGUI 构造函数中添加您的组件。

还:

  • 避免使用setSize(...)
  • 取而代之的是在显示之前pack() JDialog,让组件和容器使用它们的首选大小来调整自己的大小。

因此,尽管我不知道您要寻找什么布局,但这将起作用:

import java.awt.*;
import javax.swing.*;

public class SigCoresGUI extends JDialog {

    private static final long serialVersionUID = 1L;
    private Color[] cores = { new Color(255, 255, 255), new Color(249, 206, 137), new Color(255, 128, 0),
            new Color(255, 0, 0), new Color(244, 102, 174), new Color(5, 120, 203), new Color(116, 186, 160),
            new Color(0, 0, 0) };
    private String[] sig = { "Paz", "Energia", "Criatividade", "Paixão", "Ternura", "Tranquilidade", "Harmonia",
            "Elegância" };
    private Font font = new Font("Arial", Font.BOLD, 18);

    public SigCoresGUI() {
        super();
        Desenha desenha = new Desenha();
        add(desenha);
        pack();
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);
        // setLayout(new GridLayout(8, 8));
        // setSize(400, 500);
        setVisible(true);
    }

    public class Desenha extends JPanel {
        private static final long serialVersionUID = 1L;

        public Desenha() {
            setLayout(new GridLayout(0, 1));
            for (int i = 0; i < 8; i++) {
                JPanel panel = new JPanel(new GridBagLayout());
                panel.setBackground(cores[i]);
                panel.setFont(font);
                panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
                JLabel label = new JLabel(sig[i]);
                label.setFont(font);
                if (i > 0)
                    label.setForeground(Color.WHITE);
                panel.add(label);
                add(panel);
            }
        }

        //@Override
        //public void paintComponents(Graphics g) {
        //    super.paintComponents(g);
        //}
    }

    public static void main(String[] args) {
        new SigCoresGUI();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM