简体   繁体   English

Repaint()不起作用

[英]Repaint() doesn't work

Somehow repaint doesn't work when I try to call it. 当我尝试调用重绘时,它以某种方式不起作用。 It doesn't give an error, it looks like it just ignores the whole function. 它没有给出错误,看起来只是忽略了整个函数。

Here is my code: 这是我的代码:

public class Neerslag extends JComponent {
JPanel painting = new JPanel();
private int j = 0;

  Neerslag() {
    setPreferredSize(new Dimension(370, 200));
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.GRAY);

    g.fillOval(j, 20, 100, 20);
    g.fillOval(j + 10, 30, 100, 20);
    System.out.println("test2");

  }

  public void move(int j) {
    System.out.println("test");
    if (j < 50) {
        j++;
    } else {
        j = -j;
    }
    /*try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        System.err.println("sleep exception");
    }*/
    this.repaint();
  }

  public JPanel showPaint() {
    painting.add(new Neerslag());
    return painting;
  }

  public void Clear() {
    painting.repaint();
    System.out.println("hello");
  }
}

and

public class NeerslagFrame extends JFrame implements MouseListener {
NeerslagPanel panel1 = new NeerslagPanel();;
private int i=0;
Neerslag neerslag = new Neerslag();

public static void main(String[] args) {
    NeerslagFrame textFieldFrame = new NeerslagFrame();
    textFieldFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    textFieldFrame.setSize(500, 350);
    textFieldFrame.setVisible(true);

}

public NeerslagFrame(){
    super ("Neerslag");
    //panel1 = 
    this.addMouseListener(this);
    this.add(panel1.addSideBar(), BorderLayout.EAST);
    this.add(panel1.addSouthBar(), BorderLayout.SOUTH);
    this.add(neerslag.showPaint());
}
public void Clear(){
    //Neerslag paint = new Neerslag();
    this.add(new Neerslag());
}

@Override
public void mouseClicked(MouseEvent arg0) {
    neerslag.move(i);
    i++;
    neerslag.repaint();
    neerslag.revalidate();
    //this.add(neerslag.showPaint());
}
@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}


}

What have I missed? 我错过了什么? It does show the initial two ovals, but just doesn't repaint them once I changed the "j" value. 它确实显示了最初的两个椭圆,但是一旦我更改了“ j”值,就不会重新绘制它们。 Thank you in advance! 先感谢您!

repaint isn't really what you want, what you "seem" to want is revalidate AND repaint . repaint不是您真正想要的,您“似乎”想要的是revalidaterepaint

Something like... 就像是...

@Override
public void mouseClicked(MouseEvent arg0) {
    neerslag.move(i);
    i++;
    neerslag.revalidate();
    neerslag.repaint();
    this.add(neerslag.showPaint());
}

for example. 例如。

Now, for what it's worth, your design seems backwards, that is, rather than having Neerslag container some other container which seems to then add instance of itself to it, instead Neerslag should simply care only about itself and nothing else. 现在,就其价值而言,您的设计似乎是倒退的,也就是说,与其让Neerslag容器提供一些其他容器,然后再向其添加其自身的实例, Neerslag只关心它自己而不关心其他任何东西。

You should move the painting panel out and manage it separately, as Neerslag simply should not care about it - IMHO 您应该将painting面板移出并进行单独管理,因为Neerslag根本不关心它-恕我直言

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM