gpt4 book ai didi

java - 从 ArrayList 重新绘制类的实例

转载 作者:行者123 更新时间:2023-11-29 06:56:10 25 4
gpt4 key购买 nike

好的,我是 Java Swing 的新手,总体上是 Java 的初学者。我目前的问题是我设计了一个“城市景观”。我正在研究飞来飞去的不明飞行物,但我随机生成的建筑物会继续再生。 我想知道是否有一种方法可以像我尝试的那样将我的建筑物实例保存到 ArrayList,并在每次调用 paint 时从该列表中绘制该选择。我尝试了我的想法并且我相信它只是在运行时崩溃了,因为它甚至没有打开 JFrame 而是在出错时产生错误。这是我所拥有的:

CityScape类(主类):

import java.awt.*; 
import javax.swing.*;
public class CityScape extends JPanel
{
Buildings a = new Buildings ();
UFO b = new UFO();

@Override
public void paint (Graphics g)
{
//RememberBuildings.buildingList.get(1).paint(g);
a.paint(g);
b.paint(g);
}
public void move()
{
b.move();
}


public static void main(String[] args) throws InterruptedException
{
JFrame frame = new JFrame("Frame");
CityScape jpe = new CityScape();
frame.add(jpe);
frame.setSize(800, 750);
frame.setBackground(Color.BLACK);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
System.out.println(frame.getContentPane().getSize());
while (true)
{
jpe.move(); //Updates the coordinates
jpe.repaint(); //Calls the paint method
Thread.sleep(10); //Pauses for a moment
}
}
}

建筑类(生成建筑物的类):

import java.awt.*;

public class Buildings
{

private int maxX = 784;
private int maxY = 712;
private int width = (int)(Math.random()*100+100);
private int height = (int)(Math.random()*350+100);
private int rows = Math.round((height)/25);
private int columns = Math.round(width/25);

public void addBuilding()
{
RememberBuildings.addBuilding();
}

public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;

Color transYellow = new Color (255, 255, 0, 59);

g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, maxX, maxY);

g2d.setColor(Color.WHITE);
g2d.fillRect(5, 5, 25, 25);

int a = 0;

for (int i =10; i<634; i+=(a+10))//buildings
{

g2d.setColor(Color.GRAY);
g2d.drawRect(i, maxY-height, width, height);
g2d.fillRect(i, maxY-height, width, height);


rows = Math.round((height)/25);
columns = Math.round(width/25);

for (int j = 1; j<=columns; j++)//windows
{
for (int k = 1; k<=rows; k++)
{
g2d.setColor(Color.BLACK);
g2d.drawRect(i+5*j+20*(j-1), (maxY-height)+5*k+20*(k-1), 20, 20);
if (Math.random()<0.7)
{
g2d.setColor(Color.YELLOW);
g2d.fillRect(i+5*j+20*(j-1), (maxY-height)+5*k+20*(k-1), 20, 20);
}
else
{
g2d.setColor(Color.BLACK);
g2d.fillRect(i+5*j+20*(j-1), (maxY-height)+5*k+20*(k-1), 20, 20);
g2d.setColor(transYellow);
g2d.fillRect(i+5*j+20*(j-1), (maxY-height)+5*k+20*(k-1), 20, 20);
}
}
}
addBuilding();
a = width;
height = (int)(Math.random()*462+100);
width = (int)(Math.random()*100+100);

}
}
}

RememberBuildings 类(重点是向 ArrayList 添加一个实例):

import java.util.*;
public class RememberBuildings
{
public static ArrayList<Buildings> buildingList = new ArrayList<Buildings>();

public static void addBuilding()
{
buildingList.add(new Buildings());
}
}

最后是我的 UFO 类(创建飞过的 UFO):

import java.awt.*;
import javax.swing.*;
public class UFO extends JPanel
{
private int x = 20; //x and y coordinates of the ball
private int y = 20;
private int xa = 1;
public void move() //Increase both the x and y coordinates
{
if (x + xa < 0) {
xa = 1;
}
if (x + xa > 784-75)
{
xa = -1;
}
x = x + xa;
}
public void paint(Graphics g)
{
super.paint(g); //Clears the panel, for a fresh start
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.LIGHT_GRAY);
g2d.fillOval(x,y,75,25); //Draw the ball at the desired point
}
}

Example

最佳答案

  • 避免覆盖 paint,而是使用 paintComponent。在进行任何自定义绘制之前始终调用 super 绘制方法,以确保维护绘制链。参见 Painting in AWT and SwingPerforming Custom Painting了解更多详情
  • 请注意,Swing 不是线程安全的,从事件调度线程的上下文之外更新任何组件(或组件可能依赖的任何变量)是不明智的。一个简单的解决方案可能是使用 Swing Timer 而不是 while (true) 循环和 Thread.sleep。参见 How to use Swing Timers了解更多详情。
  • 您还应该只在事件调度线程的上下文中创建和修改 UI 组件,请参阅 Initial Threads了解更多详情
  • 如果您的代码无法正常工作,您应该考虑提供 runnable example这证明了你的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的困惑和更好的响应。提供不可运行且缺少类的代码会让人很难知道它为什么不起作用以及如何修复它。

关于java - 从 ArrayList 重新绘制类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642097/

25 4 0