2015-12-14 13 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,但這是值得的。