Java 重新喷漆在重新喷漆前不清除面板

Java 重新喷漆在重新喷漆前不清除面板,java,swing,jpanel,Java,Swing,Jpanel,我有一张画有三角形的三角板。 当有人点击一个按钮时,三角形应该用新参数重新绘制。问题是旧的三角形仍然存在,而新的三角形下面的部分文本字段被弄乱了 public class Vermessung { private static void eingabe(){ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(screen.height/2, screen.height/4*3); 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);
}
}
对于
JPanel
,请替代
paintComponent()
。作为第一行,调用
super
方法

对于
JPanel
,请替代
paintComponent()
。作为第一行,调用
super
方法。

调用

yourFrame.invalidate();
yourFrame.validate();
yourFrame.repaint();
请参阅有关
invalidate()
validate()
的更多信息

根据文档:使用验证方法使容器重新布置其子组件。当容器的子组件在容器显示后被修改(添加到容器中或从容器中删除,或布局相关信息发生更改)时,应调用此函数。

调用

yourFrame.invalidate();
yourFrame.validate();
yourFrame.repaint();
请参阅有关
invalidate()
validate()
的更多信息


根据文档:使用验证方法使容器重新布置其子组件。当容器的子组件在容器显示后被修改(添加到容器中或从容器中删除,或布局相关信息发生更改)时,应调用此函数。

Zeichung
类中创建一个新方法
清除(图形g)
,并通过添加正文清除其中的所有行,如下所示:

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

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

zeichung
类中创建一个新方法
clear(Graphics g)
,并通过添加正文清除其中的所有行,如下所示:

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

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

要获得更好的帮助,请使用BTW
f.setSize(screen.height/2,screen.height/4*3)编辑您的问题;JPanel jp=新的JPanel()最好将面板的首选尺寸设置为1/2屏幕高度X。为什么是1&1/3屏幕高度(?)-然后在框架上调用
pack()
。这确保GUI有足够的空间来显示框架装饰以及内容。为了获得更好的帮助,请使用BTW
f.setSize(screen.height/2,screen.height/4*3)更快地编辑您的问题;JPanel jp=新的JPanel()最好将面板的首选尺寸设置为1/2屏幕高度X。为什么是1&1/3屏幕高度(?)-然后在框架上调用
pack()
。这确保GUI有足够的空间来显示框架装饰和内容。