1

私は Java の 2D ペイント ツールをいじっていて、問題が発生しました。オブジェクトを移動しようとしています。コードは次のとおりです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test extends JPanel{

private int[] location = new int[2]; 

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(Color.red);
g.fillArc(location[0], location[1], 100, 100, 45, 90);
g.setColor(Color.black);
g.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360);

new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setLocation((location[0]+50),50);
repaint();
System.out.println("repainting");
        }
}).start();

}

public void setLocation(int x, int y){
this.location[0] = x;
this.location[1] = y;
}


public static void main(String[] args){
JFrame jf=new JFrame();
jf.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
jf.setPreferredSize(new Dimension(300,500));
jf.setLocation(100,100);
jf.add(new Test());

jf.pack();
jf.setVisible(true);

}
}

これは、2つのオブジェクトのうちの1つだけを画面にペイントします... [1]でsetLocationのパラメーターを変更すると、ペイントする1つのオブジェクトが移動するため、2番目のオブジェクトのようです。何かご意見は?ありがとう

編集:以下の内容を反映するために上記のコードを編集しました。

4

1 に答える 1

2

デフォルトの方法で JFrame に 2 つのコンポーネントを追加しています。これにより、コンポーネント BorderLayout.CENTER が追加されるため、2 番目のコンポーネントが最初のコンポーネントを覆い隠します。これを修正するには、レイアウト マネージャーについて調べてください。また、コードが正しく記述されていてもアニメーションが実行されないため、単純なアニメーションについては Swing Timers を参照してください。

図面を移動したい場合は、

  • テスト JPanel を 1 つだけ使用する
  • paintComponent(...)メソッドではなく、JPanel のメソッドをオーバーライドしpaint(...)ます。
  • super.paintComponent(g)paintComponent メソッドのオーバーライドで最初にメソッドを呼び出します。
  • テスト JPanel パブリック メソッドを提供して、外部クラスがフィールドを直接操作せずに場所を変更できるようにします。安全のために、場所フィールド (名前は小文字で始まる必要があります) を非公開にしてください。
  • Swing Timer を使用して定期的にこのメソッドを呼び出し、場所を変更repaint()してから、JPanel を呼び出します。
于 2013-05-29T02:49:35.170 に答える