java - JPanel 没有出现在 JDialog 中

标签 java swing

我正在使用以下语句解决一个 Activity :创建一个应用程序以在 JDialog 窗口中显示八个 JPanel 组件。每个面板应使用图 1 中的八种颜色之一进行着色。 Figure 1

每个面板上都应写有翻译颜色含义的单词。使用字体大小 18。每个面板应使用表 1 中的颜色进行着色,指定与颜色含义相对应的每个 RGB(红、绿、蓝)分量的数量。使用 java.awt.Color 类。应该只实现一个 PaintComponent 方法来绘制 8 个面板并写入每种颜色的含义。 Table 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)

Paints each of the components in this container

并且由于 JPanel 没有任何组件,因此该方法可能永远不会被调用。

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

另外:

  • 避免使用setSize(...)
  • 而是在显示 JDialog 之前 pack() 来让组件和容器使用其首选大小自行调整大小。

所以这会起作用,尽管我不知道您正在寻找什么布局:

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

关于java - JPanel 没有出现在 JDialog 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58358830/

相关文章:

java - 停止请求焦点的 jframe

java - Java 中的 native 方法是否特定于操作系统?

java - 安装 Spring Tool Suite 的 JRE 问题

java - JPanel 上带有图像的 JButton 图像未正确渲染

java - JFrame显示不正确

java - 将年份与数据库中日期的年份部分进行比较

java - 无法在tomcat服务器上的eclipse上运行Web项目

java - 如何用 Clojure 中动态创建的小部件替换 SeeSaw 小部件?

java - 在Java中调用另一个JFrame

java - 如何将自定义的jPanel多次添加到jFrame中?