Java 图形 - 当我点击时 repaint() 不工作 -> 全部工作之前

Java Graphics - repaint() doesn't work when I click -> all before works

重绘方法出现新问题。 有一个框架,我在其中绘制了几个图形。当我点击一个特定的坐标范围时,它应该改变一个图形的状态,然后重新绘制这个特定的范围。但是这个重绘不起作用...... 这是初始化图形的方法(未显示图形的声明):

private void initComponents() {

    Painter painter = new Painter();

    setExtendedState(MAXIMIZED_BOTH);
    int width = (int) getContentPane().getBounds().getWidth();
    int height = (int) getContentPane().getBounds().getHeight();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    g0 = new Gleis(25, 1, 4, 0, 0);
    g1 = new Gleis(26, 1, 0, 1, 0);
    k0 = new KnopfRot(26, 1, 0, false);
    g2 = new Gleis(27, 1, 0, 2, 0);
    g3 = new Gleis(28, 1, 0, 3, 0);
    g4 = new Gleis(29, 1, 0, 4, 0);
    g5 = new Gleis(30, 1, 0, 5, 0);
    g6 = new Gleis(31, 1, 0, 6, 0);
    g7 = new Gleis(32, 1, 0, 7, 0);
    g8 = new Gleis(33, 1, 0, 8, 0);
    g9 = new Gleis(34, 1, 0, 9, 0);
    g10 = new Gleis(35, 1, 0, 10, 0);
    g11 = new Gleis(36, 1, 0, 11, 0);
    g12 = new Gleis(37, 1, 0, 12, 0);
    g13 = new Gleis(38, 1, 0, 13, 0);
    k1 = new KnopfRot(38, 1, 1, false);

    painter.addGleis(g0);
    painter.addGleis(g1);
    painter.addKnopfRot(k0);
    painter.addGleis(g2);
    painter.addGleis(g3);
    painter.addGleis(g4);
    painter.addGleis(g5);
    painter.addGleis(g6);
    painter.addGleis(g7);
    painter.addGleis(g8);
    painter.addGleis(g9);
    painter.addGleis(g10);
    painter.addGleis(g11);
    painter.addGleis(g12);
    painter.addGleis(g13);
    painter.addKnopfRot(k1);

    this.addMouseListener(new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent e) {
            double x = e.getX();
            double y = e.getY();
            frameMouseClicked(x, y);    
        }
    });

    this.getContentPane().add(painter);

    this.setVisible(true);
}

public void frameMouseClicked(double x, double y) {

    if(x >= 306 && x <= 314 && y >= 55 && y <= 63){     //x+11 y+32
        Painter painter = new Painter();
        painter.updateKnopfRot(k0, 26, 1, 306, 55);
        repaint();
    }
    else{}

}

然后我的classKnopfRot:

public class KnopfRot {

    int xposition;
    int yposition;
    int type;
    int id;
    boolean status;

    //Konstruktor
    public KnopfRot(int xpos, int ypos, int id, boolean status){

        this.xposition = xpos * 11 + 12;
        this.yposition = ypos * 11 + 12;
        this.id = id;                       //zur eindeutigen Bezeichnung der Gleiselemente
        this.status = status;
    }

    public void draw(Graphics2D g) {

        if (!status) {
            Ellipse2D.Double aussen = new Ellipse2D.Double(xposition, yposition, 8, 8);
            Ellipse2D.Double innen = new Ellipse2D.Double(xposition + 1, yposition + 1, 6, 6);

            g.setColor(Color.black);
            g.fill(aussen);
            g.setColor(Color.red);
            g.fill(innen);
        }
        else if (status){
            Ellipse2D.Double aussen = new Ellipse2D.Double(xposition, yposition, 7, 7);
            Ellipse2D.Double innen = new Ellipse2D.Double(xposition + 1, yposition + 1, 5, 5);

            g.setColor(Color.black);
            g.fill(aussen);
            g.setColor(Color.red);
            g.fill(innen);
        }
        else {}

    }

}

并且 Painter-Class 方法 updateKnopfRot 在 MouseEvent 中调用:

public class Painter extends JPanel {
        private List<Gleis> gleisList = new ArrayList<>();
        private List<KnopfRot> knopfList = new ArrayList<>();

        //fügt ein neues Element der Liste gleisList hinzu
        public void addGleis(Gleis gleis) {
            gleisList.add(gleis);
        }

        public void addKnopfRot(KnopfRot knopf) {
            knopfList.add(knopf);
        }

        public void updateKnopfRot(KnopfRot knopf, int x, int y, int xpos, int ypos) {
            knopfList.remove(knopf);

            addKnopfRot(new KnopfRot(x, y, 0, true));
        }


        //paint-Methode geht jedes Element der Liste gleisList durch und führt die draw-Methode in Gleis.java aus
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            for (Gleis gleis : gleisList) {
                gleis.draw(g2);
            }
            for (KnopfRot knopf : knopfList) {
                knopf.draw(g2);
            }
       }
 }

抱歉代码太多,但我无法将其简化为 explain/show 问题。 有人可以帮忙吗?

您正在 frameMouseClicked(...) 方法中创建一个 new Painter(...) 对象,然后更改该对象的状态,但这对完全不同的可视化 Painter 对象没有影响。您的解决方案 -- 不要创建新的 Painter 对象,而是使用对原始对象的引用,然后尝试更改其状态。

关于:

Sorry for so much code but I can't reduce it to explain/show the problem.

如果这个答案不能解决您的问题,那么是的,您可以可以减少此代码并且使其可以运行,因为我们'过去讨论过。是的,您需要付出一些努力才能创建 post 有效的 MCVE,但这是值得的。