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);
}
}
4

3 回答 3

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

对于,改为JPanel覆盖。paintComponent()作为第一行,调用super方法。

于 2012-05-02T14:59:26.570 回答
0

称呼

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

在此处查看有关invalidate()和的更多信息。validate()

根据文档:validate方法用于使容器再次布置其子组件。在容器显示后修改此容器的子组件(添加到容器或从容器中删除,或更改布局相关信息)时,应调用它。

于 2012-05-02T14:59:29.203 回答
0

clear(Graphics g)在您的类中创建一个新方法,Zeichnung并通过将主体添加为以下内容来清除其中的所有行:

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

zeichneDreieck在第一行的方法中调用此方法。

于 2012-05-02T15:02:33.347 回答