Java Swing DrawRect:创建新尺寸替换旧尺寸

Java Swing DrawRect: creating new replaces old dimensions

我尝试使用下面的 class 制作两个矩形:DrawRect,但是当我创建一个新的 DrawRect 对象时,它会替换旧对象的宽度和高度。

package MemDiagramVisualizer;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;

public class DrawRect extends JPanel {
   private static int RECT_X;
   private static int RECT_Y;
   private static int RECT_WIDTH;
   private static int RECT_HEIGHT;

   
   public DrawRect(int w, int h) {
       RECT_X = 20;
       RECT_Y = 20;
       RECT_WIDTH = w;
       RECT_HEIGHT = h;
   }
   
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawRect(RECT_X, RECT_Y, RECT_WIDTH, RECT_HEIGHT);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(RECT_WIDTH + 2 * RECT_X, RECT_HEIGHT + 2 * RECT_Y);
   }

}
JPanel visDisplay = new JPanel();
visDisplay.setLayout(new GridLayout(1,3));
DrawRect rec2 = new DrawRect(40,60);
visDisplay.add(rec2);
DrawRect rec = new DrawRect(100,600);
visDisplay.add(rec);

上面的代码在添加到框架内容窗格时会创建两个尺寸为 100,600 的矩形

你的程序有几个问题:

  1. 所有这 4 个变量:

    private static int RECT_X;
    private static int RECT_Y;
    private static int RECT_WIDTH;
    private static int RECT_HEIGHT;
    

    它们都是静态的,但您试图在程序内部更改它们,这将适用于您程序的所有实例,并且它们都将共享值。在这种情况下,我建议您删除它,您应该会很好。这就是为什么当您使用相同的代码创建另一个 class 时,它起作用的原因。

  2. RECT_X = 20;RECT_Y = 20; 在构造函数中,如果它们是常量,则在顶部初始化它们并且不要在 [=41 的每个实例中设置它们=].

  3. 不是错误,但根据您的要求,您可能希望停止使用多个 JPanel,而是使用形状 API,如图 创建一个可以在单个 JPanel 中绘制的形状数组。同样,这完全取决于您的需要。

从上面的常量中删除 static 关键字后,我们有: