フレームの端に触れるたびにバウンスする四角形を含むアプリを作成しました。アプリをランチするときに問題はありません。問題はさまざまなスレッドを作成する方法がわからないことですフレーム内の複数の正方形。 私は複数のものを試しましたが、私はスレッドを作成する必要があるのか分かりません。 私は、正方形がフレーム内に直接追加されたときにのみ表示され、JPanelの内部に配置したときは表示されないことにも気付きました。paintComponent()でマルチスレッドする方法は?
Square.java
public class Square extends JComponent implements ActionListener {
int width = 20;
int height = 20;
double y = Math.random() * 360;
double x = Math.random() * 360;
boolean xMax = false;
boolean yMax = false;
boolean xMin = true;
boolean yMin = true;
Rectangle2D.Double square = new Rectangle2D.Double(x, y, width, height);
public Square() {
Timer t = new Timer(2, this);
t.start();
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
super.paintComponent(g);
g2.setColor(Color.BLUE);
g2.fill(square);
x_y_rules();
}
public void x_y_rules() {
if (xMax == true) {
x = x - 0.5;
if (x <= 0) {
xMax = false;
}
} else {
x = x + 0.5;
if (x >= this.getWidth()) {
xMax = true;
}
}
if (yMax == true) {
y = y - 0.5;
if (y <= 0) {
yMax = false;
}
} else {
y = y + 0.5;
if (y >= this.getHeight()) {
yMax = true;
}
}
square.setFrame(x, y, width, height);
}
@Override
public void actionPerformed(ActionEvent arg0) {
repaint();
}
}
App.java
public class App extends JFrame {
public static void main(String[] args) {
JFrame jf = new JFrame();
Square sqr = new Square();
jf.setSize(400, 400);
jf.setVisible(true);
jf.add(sqr);
jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
}
}
それは私がタイマー内の2の時間をかけたにもかかわらず、広場は非常にゆっくりと移動していること正常ですか?
がActionListener.The問題内側x_y_rulesを置く()メソッドは次の場合には、別の正方形を作成することであると私はフレームに追加you.Iありがとうございました後者は1つの正方形しか表示しません。そのため、私はスレッドを使うべきだと思ったのです。 – TomCa
レイアウトマネージャの問題を解決するためにスレッディングを使用しないので、レイアウトマネージャを調べたいと思うでしょう。 JFrame contentPaneはBorderLayoutを使用し、デフォルトでコンポーネントをJFrameに追加すると、最後に追加されたコンポーネントだけが表示されます。 –