gpt4 book ai didi

java - 在一个 JFrame 中同时处理两个 JPanel

转载 作者:行者123 更新时间:2023-11-30 08:25:17 27 4
gpt4 key购买 nike

我是 java swing 的新手。在尝试使用图形时,我遇到了这个问题。我无法在 web 中找到合适的解决方案。所以我想到在这里发帖。

现在让我们来谈谈我的问题。首先我会解释我想做什么。然后我会解释我的问题。

我试图让两个球在 JFrame 中同时向不同方向移动。 (基本上我想到了做链式 react 游戏,当你点击一个填充的盒子时,球会同时向不同的方向移动)。

我在这里为两个球创建了两个(截至目前)JPanel,我试图同时在 JFrame 上移动。

这是我试过的代码,

公共(public)类 chainGraphics 扩展 JPanel 实现 Runnable{

int oldX,oldY,newX,newY;
int changeX,changeY;
Container myPane;
public chainGraphics(int oldX,int oldY,int newX,int newY,Container myPane) {
// TODO Auto-generated constructor stub
this.myPane=myPane;
this.oldX=oldX;
this.oldY=oldY;
this.newX=newX;
this.newY=newY;
myPane.add(this);

}

public void paintComponent(Graphics g) {

//super.paintComponent(g);
System.out.println("hj");
g.drawOval(changeX,changeY, 40, 40);

}


@Override
public void run() {


System.out.println("hii");
changeX =oldX;
changeY = oldY;

if((newY-oldY)==0){
if(oldX<newX){
for(int i=oldX;i<newX;i++){
System.out.println("hii123");
changeX = i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {

e.printStackTrace();
}

repaint();
}
}
else {
for(int i=oldX;i>newX;i--){
changeX=i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}

}
if((newX-oldX)==0){
if(oldY<newY){
for(int i=oldY;i<newY;i++){
changeY=i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}
}
else {
for(int i=oldY;i>newY;i--){
changeY=i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}
}
}
}

public static void main(String[] args) {

JFrame gui = new JFrame();
gui.setTitle("Chain Reaction ;-) ");
gui.setSize(650,650);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setLocationRelativeTo(null);
gui.setVisible(true);
Container Pane = gui.getContentPane();
chainGraphics g = new chainGraphics(100,200,300,200,Pane);
chainGraphics g1 = new chainGraphics(200,100,200,300,Pane);
Thread t1 = new Thread(g);
t1.start();
Thread t2 = new Thread(g1);
t2.start();


try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

在这里我看不到两个球同时移动。我想有一个问题。我只能看到球沿 y 方向移动。 (但我希望两个球同时移动,因为我创建了两个线程)

而且我还注意到如果我先创建 g1 对象然后创建 g 对象,然后球只沿 x 方向移动。

我认为 Jframe 一次只能在 1 个 JPanel 上工作。 (我正在将 JPanel 添加到 Frame thorough Constructor)。所以最后将哪个 JPanel 添加到框架中,它允许对其进行处理。是这样吗 ?如果是,我现在应该做什么。我的要求是我想同时朝不同的方向移动球。谢谢。

最佳答案

"No i am trying to draw two balls using two threads"

  1. 不要尝试将面板的两个实例添加到容器中。只需使用 Ball 对象的数据结构(我更喜欢 List)并在 paintComponent 方法中循环遍历它们。每个球都可以有一个 drawBall(Graphics g) 方法,您可以在 paintComponent 方法中调用该方法,将 Graphics 上下文传递给它

  2. 使用 Swing Timer 并忘记线程。 Thread.sleep 不是您在 Swing 中的 friend 。参见 How to use Swing Timers

  3. 在 Timer 中,只需更改每个 Ball 对象的位置/轨迹并调用 repaint()。您可以在 Ball 类中使用可以改变方向的方法。

  4. 在事件调度线程上运行 Swing 应用程序。为此,您可以将 main 方法代码包装在 SwingUtilities.invokeLater.. 中。参见 Initial Threads


举个例子

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MoveBalls extends JPanel {

private static final int D_W = 500;
private static final int D_H = 300;

private List<Ball> balls;

public MoveBalls() {
Random rand = new Random();
balls = new ArrayList<>();
for (int i = 0; i < 10; i++) {
int randX = rand.nextInt(D_W);
int randY = rand.nextInt(D_H);
balls.add(new Ball(randX, randY));
}

Timer timer = new Timer(15, new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (Ball ball : balls) {
ball.animate();
}
repaint();
}
});
timer.start();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Ball ball : balls) {
ball.drawBall(g);
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(D_W, D_H);
}

public class Ball {

int x = 0;
int y = 0; // Current ball position
int dx = 4; // Increment on ball's x-coordinate
int dy = 4; // Increment on ball's y-coordinate
int radius = 15; // Ball radius

public Ball(int x, int y) {
this.x = x;
this.y = y;
}
Color color = new Color((int) (Math.random() * 256),
(int) (Math.random() * 256), (int) (Math.random() * 256));

public void drawBall(Graphics g) {
g.setColor(color);
g.fillOval(x - radius, y - radius,
radius * 2, radius * 2);
}

public void animate() {
if (x < 0 || x > getWidth()) {
dx = -dx;
}
if (y < 0 || y > getHeight()) {
dy = -dy;
}
// Adjust ball position
x += dx;
y += dy;
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new MoveBalls());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}

关于java - 在一个 JFrame 中同时处理两个 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22283462/

27 4 0
文章推荐: javascript - 将数组转换为 JSON 数组
文章推荐: javascript - 需要增加或减少
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com