【问题标题】:Java Graphics - repaint() doesn't work when I click -> all before worksJava Graphics - 当我点击时 repaint() 不起作用 - > all before works
【发布时间】:2015-12-14 17:19:04
【问题描述】:

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

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{}

}

然后我的课KnopfRot

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 以及在 MouseEvent 中调用的 updateKnopfRot 方法:

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

很抱歉有这么多代码,但我无法减少它来解释/显示问题。 有人可以帮忙吗?

【问题讨论】:

  • 你不会在Painter 上调用repaint...无论如何,你没有给我们所有必要的代码来理解发生了什么,第一个代码属于哪个类?
  • @Jean-BaptisteYunès:他在持有 Painter 实例的 JFrame 上调用 repaint()。这应该会导致绘制调用沿组件层次结构树向下传播,因此我认为这应该足够了。但我强烈支持您的建议,即他创建并发布minimal reproducible example

标签: java swing graphics paintcomponent repaint


【解决方案1】:

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

关于:

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

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

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多