2012-05-02 3 views
0

У меня есть JPanel, где изображен треугольник. Когда кто-то нажимает кнопку, треугольник должен быть перекрашен новыми параметрами. Проблема в том, что старый треугольник все еще существует, а новый перепутан с частью текстового поля внизу.repaint не очищает панель перед перекраской

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

BTW 'f.setSize (screen.height/2, screen.height/4 * 3); JPanel jp = new JPanel(); 'Было бы лучше изменить это, чтобы установить ** предпочтительный размер ** панели на 1/2 высоты экрана X.why, это высота экрана 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.

В документации: Метод validate используется для того, чтобы контейнер снова выложил подкомпоненты. Он должен вызываться, когда подкомпоненты этого контейнера изменяются (добавляются или удаляются из контейнера или изменяются сведения о компоновке) после отображения контейнера.

0

Создать новый метод clear(Graphics g) в вашем Zeichnung классе и очистить все строки из нее, добавив тело:

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

этот метод вызова в методе zeichneDreieck на первой линии.

Смежные вопросы