更新 jpanel 中的图形

问题描述 投票:0回答:1

我正在努力刷新 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); 

     } 

 }```
java swing graphics jpanel graphics2d
1个回答
0
投票

弄清楚了,我正在创建一个新的 CompressedColor,而不是将 BaseColors Color 设置为新的 Color,这使得 BaseColor 在本地指向不同的对象,然后在 main 方法中。我只是没有很好地概述我的指示。

© www.soinside.com 2019 - 2024. All rights reserved.