我使用以下语句解决活动:创建一个应用程序以在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)
绘制此容器中的每个组件
并且由于JPanel没有任何组件开始,因此该方法可能永远不会被调用。
而是在SigCoresGUI构造函数中添加组件。
也:
避免使用setSize(...)
在显示JDialog之前,先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();
}
}