gpt4 book ai didi

java - JPanel 没有出现在 JDialog 中

转载 作者:行者123 更新时间:2023-12-02 01:17:14 26 4
gpt4 key购买 nike

我正在使用以下语句解决一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com