2012-05-02 58 views
0

我得到了一個三角形繪製的JPanel。 當有人點擊一個按鈕時,應使用新參數重新繪製三角形。問題是舊的三角形仍然存在,新的三角形與下面的文本字段的一部分混亂。重新繪製前重繪不清除面板

public class Vermessung { 

private static void eingabe(){ 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(screen.height/2, screen.height/4*3); 
    JPanel jp = new JPanel(); 
    jp.setLayout(new BoxLayout(jp, BoxLayout.PAGE_AXIS)); 

    //Eingabebereich 
    JPanel eingabebereich = new JPanel(new GridLayout(3, 1)); 
    JPanel abc = new JPanel(new GridLayout(4, 2)); 
    abc.add(new JLabel("Strecke")); 
    abc.add(new JLabel("Gemessener Wert in [m]")); 
    abc.add(new JLabel("a:")); 
    abc.add(tfa); 
    abc.add(new JLabel("b:")); 
    abc.add(tfb); 
    abc.add(new JLabel("c:")); 
    abc.add(tfc); 

    //AusgabeBereich 
    JPanel ausgabe = new JPanel(new GridLayout(2, 3)); 
    ausgabe.add(new JLabel("p [m]")); 
    ausgabe.add(new JLabel("q [m]")); 
    ausgabe.add(new JLabel("h [m]")); 
    ausgabe.add(P); 
    ausgabe.add(Q); 
    ausgabe.add(H); 
    P.setEditable(false); 
    Q.setEditable(false); 
    H.setEditable(false); 

    //Buttons mit Listenern 
    JPanel buttons = new JPanel(new FlowLayout()); 
    JButton ok = new JButton("OK"); 
    JButton cancel = new JButton("beenden"); 

    ActionListener al = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      //Textfelder auslesen 
      TextfelderAuslesen(); 

      //bei gueltiger Eingabe Höhe Berechnen 
      if(berechenbar){ 
       berechnungPQ(); 
       berechnungH(); 
       P.setText(String.valueOf(p)); 
       Q.setText(String.valueOf(q)); 
       H.setText(String.valueOf(h)); 
       sketch.update(vec); 
sketch.repaint(); 
      }else{ 

      } 

     } 
    }; 
    ok.addActionListener(al); 

    ActionListener beenden = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.exit(0); 

     } 
    }; 
    cancel.addActionListener(beenden); 

    buttons.add(ok); 
    buttons.add(cancel); 

    //Fensteraufbau 
    sketch.setPreferredSize(new Dimension(screen.height/2, screen.height/2)); 
    jp.add(sketch); 
    eingabebereich.add(abc); 
    eingabebereich.add(ausgabe); 
    eingabebereich.add(buttons); 
    eingabebereich.setPreferredSize(new Dimension(screen.height/4, screen.height/4)); 
    jp.add(eingabebereich); 
    f.add(jp); 
    f.setVisible(true); 
} 


} 

public class Zeichnung extends JPanel{ 

public void paint(Graphics g){ 
    zeichneDreieck(g); 
} 

private void zeichneDreieck(Graphics g){ 
    berechneLaengen(); 
    g.setColor(new Color(255,0,0)); 
    g.drawLine(30, 30, ca, 30); 
    g.drawString("c", ca/2, 20); 
    g.drawLine(ca, 30, qa, ha); 
    g.drawString("a", (ca-pa/2), ha/2); 
    g.drawLine(qa, ha, 30, 30); 
    g.drawString("b", (qa/2), ha/2); 
    g.setColor(new Color(0,0,0)); 
    g.drawLine(qa, ha, qa, 30); 
    g.drawString("h", qa+5, ha/2); 
} 
} 
+1

爲更好的幫助,儘早用[SSCCE](http://sscce.org/) – mKorbel

+0

編輯您的問題。 JPanel jp = new JPanel();'最好改變這個設置面板的**首選尺寸爲1/2屏幕高度X ..爲什麼它是1和1/3屏幕高度(?) - 然後在框架上調用'pack()'。這確保了GUI有足夠的空間顯示框架裝飾以及內容。 –

回答

5
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    zeichneDreieck(g); 
} 

對於JPanel,覆蓋paintComponent()代替。作爲第一行,請致電super方法。

+1

簡單Van GUIph – mKorbel

0

呼叫

yourFrame.invalidate(); 
yourFrame.validate(); 
yourFrame.repaint(); 

查看更多有關invalidate()validate()here

根據文檔:驗證方法用於使容器再次佈置其子組件。在容器顯示後,應該調用此容器的子組件(添加到容器中或從容器中移除,或者更改與佈局相關的信息)。

0

Zeichnung類創建一個新的方法clear(Graphics g)並通過將身體清除其所有行:在第一線

super.paintComponent(g); 
this.removeAll(); 
this.updateUI(); 

調用此方法可在zeichneDreieck方法。