Java 如何引用从另一个类扩展JPanel的类
我有一个Circle类,每个Circle元素都有一个线程,用于在jpanel中移动圆。CirclePanel类独立于实际的GUI,并且有一个圆形元素向量。我需要一种方法来重新绘制jpanel,而不必每次都创建一个新的面板。CirclePanel在GUI类中实例化,该类创建一个包含CirclePanel的框架。如何在每次圆移动时重新绘制面板?谢谢大家! 编辑:输入一些代码 圆圈类:Java 如何引用从另一个类扩展JPanel的类,java,Java,我有一个Circle类,每个Circle元素都有一个线程,用于在jpanel中移动圆。CirclePanel类独立于实际的GUI,并且有一个圆形元素向量。我需要一种方法来重新绘制jpanel,而不必每次都创建一个新的面板。CirclePanel在GUI类中实例化,该类创建一个包含CirclePanel的框架。如何在每次圆移动时重新绘制面板?谢谢大家! 编辑:输入一些代码 圆圈类: public class Circle extends Thread { public Ellip
public class Circle extends Thread {
public Ellipse2D.Double thisCircle;
public int size=30,xPoz,yPoz;
Random r=new Random();
int red=r.nextInt(255),green=r.nextInt(255),blue=r.nextInt(255);
int deltax,deltay;
public boolean ballStarted;
public Circle()
{xPoz=(int)Math.random()*300;
yPoz=(int)Math.random()*300;
ballStarted = true;
deltax=-10+(int)(Math.random()*21);
deltay=-10+(int)(Math.random()*21);
if ((deltax == 0) && (deltay == 0)) { deltax = 1; }
thisCircle=new Ellipse2D.Double(xPoz,yPoz,size,size);
}
public void draw(Graphics2D g2d){
if(thisCircle!=null)
{g2d.setColor(new Color(red,green,blue,80));
g2d.fill(thisCircle);
}
}
public int PozX(){return xPoz;}
public int PozY(){return yPoz;}
public int radius(){return size*2;}
public void grow(){
size++;
thisCircle.setFrame(xPoz,yPoz,size,size);
}
public void move(){
int oldx=xPoz;
int oldy=yPoz;
int newx=oldx+deltax;
int newy=oldy+deltay;
if(newx+size>800 || newx<0)
deltax=-deltax;
if(newy+size>600 || newy<0)
deltay=-deltay;
thisCircle.setFrame(newx,newy,size,size);
}
public void run(){
try {
Thread.sleep(100);
}
catch (InterruptedException e)
{ System.out.println("Thread Halted");}
while(ballStarted)
{move(); }
}
}
这是圆形面板类:
public class CirclePanel extends JPanel {
private int prefwid, prefht;
public ArrayList<Circle> Circles = new ArrayList<Circle>();
public ShapePanel(int pwid, int pht) {
prefwid = pwid;
prefht = pht;
createCircles();
}
public void createCircles() {
for (int i = 1; i <= 20; i++) {
Circle nextCircle = new Circle();
Circles.add(nextCircle);
nextCircle.start();
}
}
public Dimension getPreferredSize() {
return new Dimension(prefwid, prefht);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (int i = 0; i < Circles.size(); i++) {
(Circles.get(i)).draw(g2d);
}
}
}
我看不到一个清晰的方法来从发布的代码中找到你想要的地方,这可能就是你被卡住的原因。如果所有圆圈线程都可以访问JPanel,那么它们有一个引用包含JPanel的字段变量,那么您可以让它们在移动后请求JPanel重新绘制。但我不认为这是解决问题的方法 您可能要做的是创建一个每100毫秒触发一次的计时器,计时器指示所有圆圈移动。除非有其他需要让每个圆在自己的线程中运行,否则我认为这更简单,并将产生更平滑的动画。一旦所有圆圈都改变了位置、大小或正在做的任何事情,计时器就可以要求JPanel重新绘制 以下是我的意思的一个例子:
import java.awt.Dimension;
import javax.swing.*;
import java.util.ArrayList;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
*
* @author LLASPINA
*/
public class CirclePanel extends JPanel implements ActionListener {
Timer timer;
private int prefwid, prefht;
ArrayList<Circle> circleList;
public CirclePanel(int pwid, int pht) {
prefwid = pwid;
prefht = pht;
createCircles();
timer = new Timer(300, this);
timer.start();
}
public void createCircles() {
circleList = new ArrayList<Circle>();
for (int i = 1; i <= 20; i++) {
Circle nextCircle = new Circle();
circleList.add(nextCircle);
}
}
public Dimension getPreferredSize() {
return new Dimension(prefwid, prefht);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (Circle c : circleList) {
c.draw(g2d);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
CirclePanel panel = new CirclePanel(400,500);
frame.add(panel);
frame.setSize(400,500);
//frame.pack();
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//move those circles and then redraw them.
}
class Circle {
int x, y;
int radius;
public Circle() {
this.x = (int) (Math.random() * (prefwid-10));
this.y = (int) (Math.random() * (prefht-10));
this.radius = (int) (Math.random() * 50) + 10;
}
public Circle(int x, int y, int r) {
this.x = x;
this.y = y;
this.radius = r;
}
public void draw(Graphics2D g) {
g.drawOval(x, y, radius, radius);
}
}
}
没有代码,我们就像没有耳朵的贝多芬……到目前为止你做了什么?对于那些没有在解决方案中投入一点精力的问题,很少会得到回答。为什么每个圆都需要一个线程?我需要在单击时停止一个随机圆,并扩展其半径。然后每个点击扩展圆圈的圆圈也会这样做。谢谢你的输入,但我需要一个单独的java文件中的圆圈类,我有义务使用线程来使圆圈移动。使圆圈成为一个单独的类是微不足道的;为了简单起见,我把它做成了一个内部类。只需在Circle类构造函数中传递对JPanel的引用,然后Circle就可以告诉JPanel重新绘制。更好的是,你可以像我一样做事。绘图由计时器处理,但每个圆在其自己的线程中移动或修改其属性,然后当面板调用Circle draw方法时,这些更改变为可见。通过让圆圈在自己的线程中运行代码,它们可以在不需要JPanel输入或参与的情况下进行修改。但是JPanel仍然需要每100毫秒重新绘制一次。