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

クラスに新しいメソッドclear(Graphics g)を作成Zeichnungし、本文を次のように追加してすべての行を削除します。

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

zeichneDreieckメソッドの最初の行でこのメソッドを呼び出します。

于 2012-05-02T15:02:33.347 に答える
0

電話

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

との詳細についてはinvalidate()validate() こちらを参照してください。

ドキュメントによると、validateメソッドは、コンテナーにサブコンポーネントを再度レイアウトさせるために使用されます。コンテナーが表示された後に、このコンテナーのサブコンポーネントが変更された (コンテナーに追加または削除された、またはレイアウト関連の情報が変更された) 場合に呼び出す必要があります。

于 2012-05-02T14:59:29.203 に答える