【问题标题】:JPanel does not appear in JDialogJPanel 没有出现在 JDialog 中
【发布时间】:2019-10-12 21:45:39
【问题描述】:

我正在使用以下语句解决一个活动:创建一个应用程序以在 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);
            }
        }
    }
}

【问题讨论】:

  • 事实上,我敢打赌,paintComponents 从不被调用,因为您的 JPanel 最初没有添加任何组件
  • @Abra 确实,在实现自定义绘画时,应该覆盖paintComponent,但是在这种情况下,不应覆盖任何绘画方法。

标签: java swing


【解决方案1】:

从不在绘画方法中从容器(这里是您的 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();
    }
}

【讨论】:

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