【问题标题】:How can I recolor a rectangle?如何重新着色矩形?
【发布时间】:2021-02-21 14:30:45
【问题描述】:

所以基本上我有一个矩形类,我想实现一个方法,在它被绘制后改变它的颜色。

到目前为止,这是我的代码。以为它可能会像更改对象的位置一样起作用,但事实并非如此。

public class rectangle extends JPanel(){

@Override
protected void paintComponent(Graphics g){
   super.paintComponent(g);
   g.setColor(Color.red)
   g.fillRect(0, 0, 30, 30);
}

public void recolor(){
  Color.blue;
  repaint();
}
}

【问题讨论】:

    标签: java swing colors rectangles repaint


    【解决方案1】:

    不要保留硬编码值。当您使用 Swing 组件时,它们具有允许您动态更改属性的方法。

    例如,所有组件都有如下方法:

    1. setFont(...)
    2. setBorder(...);
    3. setBackground(...);
    4. setForeground(...);

    在您的情况下,您甚至不需要自定义方法。在您的应用程序代码中,您可以使用:

    someComponent.setForeground( Color.BLUE );
    

    然后在你的绘画代码中使用:

    @Override
    protected void paintComponent(Graphics g)
    {
       super.paintComponent(g);
       //g.setColor(Color.red)
       g.setColor( getForeground() ); 
       g.fillRect(0, 0, 30, 30);
    }
    

    如果您不想使用前景色属性,则可以在代码中添加自定义属性。基本步骤是

    1. 创建一个类似 setColor(Color color) 的方法
    2. 创建一个实例变量“color”来保存你的类中的属性
    3. 自定义绘画代码以使用“颜色”属性

    上述 3 个步骤适用于要添加到您的类的任何自定义属性。

    【讨论】:

      【解决方案2】:

      您可以执行以下操作

      Main.java

      import java.awt.Dimension;
      import java.util.Timer;
      import java.util.TimerTask;
      
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.SwingUtilities;
      
      public class Main {
      
      public static void main(String[] args) throws InterruptedException {
          SwingUtilities.invokeLater(new Runnable() { //do some research about SwingUtilities.invokeLater
              @Override
              public void run() {
                  JFrame frame = new JFrame();
                  JPanel panel = (JPanel) frame.getContentPane();
                  Rectangle rectangle = new Rectangle();
                  panel.add(rectangle);
      
                  frame.setPreferredSize(new Dimension(400, 400));
                  frame.pack();
                  frame.setVisible(true);
      
                  Timer timer = new Timer();
                  timer.schedule(new TimerTask() {
                      @Override
                      public void run() {
                          rectangle.recolor();
                      }
                  }, 0, 1000); // 0 = initial delay, 1000 = intervall
              }
          });
      
      }
      

      }

      矩形.java

      import java.awt.Color;
      import java.awt.Graphics;
      import java.util.Random;
      
      import javax.swing.JPanel;
      
      public class Rectangle extends JPanel {
      
          private Color color;
      
          @Override
          protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              g.setColor(color);
              g.fillRect(0, 0, getWidth(), getHeight());
          }
      
          public void recolor() {
              Random r = new Random();
              color = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
              repaint();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 1970-01-01
        • 2020-12-15
        相关资源
        最近更新 更多