在重新粉刷之前,重绘不会清除面板

时间:2012-05-02 14:56:26

标签: java swing jpanel

我有一个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);
}
}

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

致电

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

查看有关invalidate()validate() here的详细信息。

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

答案 2 :(得分:0)

clear(Graphics g)课程中创建一个新方法Zeichnung,并通过添加正文清除其中的所有行:

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

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