我正在努力刷新 jpanel 中的图形。
每次我使用 JColorChooser 选择存储在 BaseColor 对象中的新颜色时,我尝试让 JPanel 扩展类“ShadeSelectPane”更新它的 Graphics 对象,但事实并非如此。你们中有人能告诉我为什么吗?毕竟我正在调用重画。先感谢您。 它们是我的代码中的两个文件,Main.java 和 CompressedColor.java。 Main.java 扩展了 JFrame,仅作为大多数代码的入口点和存储。 CompressedColor 将颜色及其更多色调存储在 rgb565 中并作为颜色对象。我删除了 Swing 组件的所有初始化代码,这些代码位于 Mains 构造函数中。 运行时,代码会绘制初始 Color CompressedColor 设置的所有阴影,但在更改 BaseColor 对象时不会更新 ShadeSelectPane。
This is my Main.java file
public class Main extends JFrame implements ActionListener
{
CompressedColor BaseColor;
JMenuBar bar;
JMenu file;
JMenu edit;
JMenuItem save;
JMenuItem exportdata;
JMenuItem exportfunction;
JMenuItem bgcolor;
ImagePane canvas;
ShadeSelectPane shadeselector;
// main-Methode
public static void main(String[] args)
{
Main frame = new Main();
frame.setVisible(true);
}
public void actionPerformed (ActionEvent ae){
if(ae.getSource() == this.bgcolor){
BaseColor = new CompressedColor(JColorChooser.showDialog(null, "Farbauswahl", null));
BaseColor.updateShades();
System.out.println(Integer.toHexString(BaseColor.rgb565));
shadeselector.repaint();
}
else if(ae.getSource() == this.save){
System.out.println("Save was pressed!");
}
else if(ae.getSource() == this.exportdata){
System.out.println("Export Data was pressed!");
}
else if(ae.getSource() == this.exportfunction){
System.out.println("Export Function was pressed");
}
}
}
class ImagePane extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("BLAH", 20, 20);
g.drawRect(200, 200, 200, 200);
}
}
class ShadeSelectPane extends JPanel {
CompressedColor BaseColor;
ShadeSelectPane(CompressedColor baseColor){
super();
BaseColor = baseColor;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < 8; i++) {
g.setColor(BaseColor.shades[i].color);
g.fillRect(0, i*(this.getHeight()/8), this.getWidth(), i*(this.getHeight()/8)+(this.getHeight()/8));
}
}
}
This is CompressedColor.java
import java.awt.Color;
public class CompressedColor {
Color color;
short rgb565;
CompressedColor[] shades;
void updateShades(){
for (int i = 0; i < shades.length; i++) {
shades[i] = new CompressedColor(new Color((color.getRed()-(i<<3))&0xFF, (color.getGreen()-(i<<3))&0xff, (color.getBlue()-(i<<3))&0xff));
}
}
void setColor(Color clr){
color = clr;
rgb565=(short)((((clr.getRed() & 0b11111000) << 8) | ((clr.getGreen() & 0b11111100) << 3) | (clr.getBlue() >> 3))&0xFFFF);
}
CompressedColor(short clr){
shades = new CompressedColor[8];
rgb565 = clr;
color= new Color((clr>>8)&0xF8, (clr>>3)&0xFC, (clr<<3)&0xF8);
}
CompressedColor(Color clr){
shades = new CompressedColor[8];
color = clr;
rgb565=(short)((((clr.getRed() & 0b11111000) << 8) | ((clr.getGreen() & 0b11111100) << 3) | (clr.getBlue() >> 3))&0xFFFF);
}
}```
弄清楚了,我正在创建一个新的 CompressedColor,而不是将 BaseColors Color 设置为新的 Color,这使得 BaseColor 在本地指向不同的对象,然后在 main 方法中。我只是没有很好地概述我的指示。