Java 为什么重绘()后方块不会出现?

Java 为什么重绘()后方块不会出现?,java,swing,graphics2d,Java,Swing,Graphics2d,我在稍早的时候发布了这个问题,并被告知要将其设置为SSCCE,所以这里是这样的(如果我可以进行任何改进,请随时告诉我): 我想知道为什么当我的按钮“确认”被点击时,旧的方块消失了,重绘的方块没有出现在我的GUI上(用swing制作)。Squares类绘制了200个间隔的正方形,其中ID(0、1、2或3作为字符串)是从不同的类中获得的(对于这个问题,我们假设它始终为0,不包括该类)。澄清一下:Squares在第一次完美地绘制了所有内容(也检索了正确的ID),但我希望它在用新ID单击按钮后重新绘制所

我在稍早的时候发布了这个问题,并被告知要将其设置为SSCCE,所以这里是这样的(如果我可以进行任何改进,请随时告诉我): 我想知道为什么当我的按钮“确认”被点击时,旧的方块消失了,重绘的方块没有出现在我的GUI上(用swing制作)。Squares类绘制了200个间隔的正方形,其中ID(0、1、2或3作为字符串)是从不同的类中获得的(对于这个问题,我们假设它始终为0,不包括该类)。澄清一下:Squares在第一次完美地绘制了所有内容(也检索了正确的ID),但我希望它在用新ID单击按钮后重新绘制所有内容。 正方形代码:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.ArrayList;

public class Squares extends JPanel{

private ArrayList<Rectangle> squares = new ArrayList<Rectangle>();
private String stringID = "0";

public void addSquare(int x, int y, int width, int height, int ID) {
      Rectangle rect = new Rectangle(x, y, width, height);
      squares.add(rect);
      stringID = Integer.toString(ID);
      if(ID == 0){
          stringID = "";
      }
}

   @Override
   protected void paintComponent(Graphics g) {

  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  FontMetrics fm = g2.getFontMetrics();
  int fontAscent = fm.getAscent();
  g2.setClip(new Rectangle(0,0,Integer.MAX_VALUE,Integer.MAX_VALUE));
  for (Rectangle rect : squares) {
     g2.drawString(stringID, rect.x + 7, rect.y + 2 + fontAscent);
     g2.draw(rect);
  }
 }
}

一个主要问题是:您的Squares JPanels首选大小只有20乘20,而且实际上很可能就是这个大小,因为它似乎是使用容器添加到FlowLayout中的。接下来,您似乎要在远远超出此组件边界的位置绘制图形,因此可能永远不会看到这些图形。考虑允许您的正方形对象更大,并且确保只在该组件的边界内绘制。 注意还有一些代码没有意义,包括:

private int myID;
private JTextField row, column, instru draft saved // ???
package question2;ction1, instruction2, seatLabel, rowLabel; // ???
我猜是的

private int myID;
private JTextField row, column, instruction1, instruction2, seatLabel, rowLabel;
这不会为我们编译:

int rows = AircraftSeatReservation.getRows();
int seatsInRow = AircraftSeatReservation.getSeatsInRow(); // and shouldn't this take an int row parameter?
因为我们没有您的AircraftSeatReservation类(希望您在该类中没有真正的静态方法)

我们无法编译或运行您当前的代码。我们不想看到您的整个程序,但您应该将代码压缩为最小的代码位,它仍然可以编译,没有与您的问题无关的额外代码,但仍然可以演示您的问题。因此,正如安德鲁·汤普森(Andrew Thompson)所建议的,为了获得更好的帮助,请创建并发布您的or


我会尽可能地解决你的问题,让你分而治之。这可能涉及:

  • 创建一个
    SeatClass
    enum,其中可能有两个元素,FIRST和COACH
  • 创建一个非GUI座位类,该类包含多个字段,可能包括:int row、char Seat(如a、B、C、D、E、F)、SeatClass字段以查看是否为头等座位或coach,以及布尔保留字段(仅当座位被保留时才为真)
  • 这个类还有一个getId()方法,该方法返回行号和座位字符的字符串连接
  • 创建一个非GUI飞机类,一个包含两个座椅阵列,一个用于SeatClass.FIRST或FIRST-class座椅,一个用于SeatClass.COACH
  • 它还有一个行计数字段和一个座位计数(列计数)字段
  • 创建完所有这些之后,就可以使用GUI类了
  • 我将为Seats创建一个GUI类,可能是GuiSeat,让它包含一个Seat对象,可能是让它扩展JPanel,允许它显示它从它包含的Seat对象获得的自己的id字符串,让它覆盖
    getBackground(…)
    ,这样它的颜色将取决于座位是否被保留
  • 等等

“为了简洁起见,我没有包含该类,但所有内容都在那里工作。”为了更快地获得更好的帮助,请发布一个or。这不是SSCCE,没有一个类以
main
开头。自包含意味着它可以被编译并运行在它自己的……ZaViRiaN:请考虑上面提到的所有点,特别是关于你的帖子和创建你的点,如果你想要或需要更详细和具体的帮助。@ ZainVirani:简单地删除ActurftStAtAsvices的引用没有什么好处,因为现在您使用的是重要但对编译器没有意义的未声明变量,包括行。很抱歉删除, @HovercraftFullOfEels@HovercraftFullOfEels它还需要在
actionPerformed
方法中调用
GUI
上的
revalidate
,我不知道为什么OP从
JFrame
扩展并创建另一个
JFrame
,但这一切都很令人困惑:P@ZainVirani:您的另一个主要问题是没有Square类,没有保存每个Square项的id和可用性的类,因此所有id都是共享的,因为Square只有一个id字符串。还请注意,您的myID从未以任何方式使用过。或者更好,你会想要一个座位。
private int myID;
private JTextField row, column, instruction1, instruction2, seatLabel, rowLabel;
int rows = AircraftSeatReservation.getRows();
int seatsInRow = AircraftSeatReservation.getSeatsInRow(); // and shouldn't this take an int row parameter?