Java Graphics-repaint()不';单击->;开工前的一切

Java Graphics-repaint()不';单击->;开工前的一切,java,swing,graphics,paintcomponent,repaint,Java,Swing,Graphics,Paintcomponent,Repaint,我对重绘方法有一个新问题。 有一个框架,我在其中一起画了几个图形。当我在特定的坐标范围内单击时,它应该更改一个图形的状态,然后重新绘制该特定范围。但是重新油漆不起作用。。。 这是初始化图形的方法(未显示图形声明): 以及使用方法updateKnopfRot的Painter-类,该方法在MouseEvent中调用: public class Painter extends JPanel { private List<Gleis> gleisList = new Arra

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

以及使用方法
updateKnopfRot
Painter
-类,该方法在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);
            }
       }
 }
public类Painter扩展了JPanel{
private List gleisList=new ArrayList();
private List knopfList=new ArrayList();
//新津列岛的新元素
公共无效地址(Gleis Gleis){
添加(gleis);
}
公共无效添加KnopfRot(KnopfRot knopf){
knopfList.add(knopf);
}
public void updateKnopfRot(KnopfRot knopf、int x、int y、int xpos、int ypos){
knopfList.移除(knopf);
addKnopfRot(新KnopfRot(x,y,0,true));
}
//在Gleis.java aus中,绘制元素的绘制方法
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
for(Gleis-Gleis:gleisList){
gleis.draw(g2);
}
用于(KnopfRot knopf:knopfList){
knopf.draw(g2);
}
}
}
很抱歉有这么多代码,但我无法减少代码来解释/显示问题。
有人能帮忙吗?

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

关于:

很抱歉有这么多代码,但我无法减少代码来解释/显示问题


如果这个答案不能解决您的问题,那么是的,您可以减少此代码,并像我们过去讨论的那样使其可运行。是的,创建和发布一个有效的,但这是值得的。

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

关于:

很抱歉有这么多代码,但我无法减少代码来解释/显示问题


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

您不需要在
画师上调用
重新绘制
。。。无论如何,你没有给我们所有必要的代码来理解发生了什么,第一个代码属于哪个类?@Jean BaptisteYunès:他在保存Painter实例的JFrame上调用
repaint()
。这将导致组件层次结构树中的绘制调用,因此我认为这应该足够了。但我强烈支持你的建议,他创建并发布了一个。你不要在你的
画师上调用
重新绘制
。。。无论如何,你没有给我们所有必要的代码来理解发生了什么,第一个代码属于哪个类?@Jean BaptisteYunès:他在保存Painter实例的JFrame上调用
repaint()
。这将导致组件层次结构树中的绘制调用,因此我认为这应该足够了。但我强烈支持你的建议,他创建并发布一个。
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 {}

    }

}
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);
            }
       }
 }