2015-12-14 15 views
1

我有一个repaint方法的新问题。 有一个框架,我画几个图形在一起。当我点击一个特定的坐标范围时,它应该改变一个图形的状态,然后重新绘制这个特定的范围。但这重绘没有工作... 这是初始化图形的方法(未显示图形的声明):Java图形 - repaint()不起作用,当我点击 - >所有作品之前

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与方法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); 
      } 
     } 
} 

对不起这么多ç颂歌,但我不能减少它来解释/显示问题。 有人可以帮忙吗?

+0

你不要在你的'Painter'上调用'repaint' ......不管怎么说,你没有给我们所有必要的代码来理解发生什么,第一个代码属于哪一类? –

+0

@ Jean-BaptisteYunès:他在保存Painter实例的JFrame上调用'repaint()'。这应该导致绘画调用滴落组件层次树,所以我认为这应该是足够的。但是我强烈建议他创建并发布[mcve]。 –

回答

4

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

关于:

对不起,这么多的代码,但我不能减少它来解释/显示问题。

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