Dieses Problem betrifft eine Java-Anwendung, die darauf ausgelegt ist, mehrere Bälle auf einer Schnittstelle darzustellen, die von den Rändern abprallen. Der Benutzer hat das Zeichnen eines einzelnen Balls erfolgreich implementiert, stößt jedoch beim Versuch, einen zweiten Ball hinzuzufügen, auf Probleme, da dieser den ersten Ball überschreibt.
Um dieses Problem zu beheben, kann eine Liste von Bällen erstellt und durchlaufen werden um jeden Ball zu zeichnen, aber der Benutzer hat Schwierigkeiten, beide Bälle zum Inhaltsbereich hinzuzufügen.
Das Hauptproblem ist die Platzierung von zwei undurchsichtige Komponenten übereinander liegen, was möglicherweise dazu führt, dass die eine die andere verdeckt. Um dieses Problem zu beheben:
Ein verbessertes Codebeispiel, das diese enthält Modifikationen:
public class Balls { public Balls() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TheBalls()); frame.setSize(400, 400); frame.setVisible(true); } }); } public class TheBalls extends JPanel { public TheBalls() { setLayout(null); // Randomize the speed and direction... add(new Ball("red", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20)))); add(new Ball("blue", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20)))); } } public class Ball extends JPanel implements Runnable { Color color; int diameter; long delay; private int vx; private int vy; public Ball(String ballcolor, int xvelocity, int yvelocity) { if (ballcolor == "red") { color = Color.red; } else if (ballcolor == "blue") { color = Color.blue; } else if (ballcolor == "black") { color = Color.black; } else if (ballcolor == "cyan") { color = Color.cyan; } else if (ballcolor == "darkGray") { color = Color.darkGray; } else if (ballcolor == "gray") { color = Color.gray; } else if (ballcolor == "green") { color = Color.green; } else if (ballcolor == "yellow") { color = Color.yellow; } else if (ballcolor == "lightGray") { color = Color.lightGray; } else if (ballcolor == "magenta") { color = Color.magenta; } else if (ballcolor == "orange") { color = Color.orange; } else if (ballcolor == "pink") { color = Color.pink; } else if (ballcolor == "white") { color = Color.white; } diameter = 30; delay = 100; vx = xvelocity; vy = yvelocity; new Thread(this).start(); } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; int x = getX(); int y = getY(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(color); g.fillOval(0, 0, 30, 30); //adds color to circle g.setColor(Color.black); g2.drawOval(0, 0, 30, 30); //draws circle } @Override public Dimension getPreferredSize() { return new Dimension(30, 30); } public void run() { try { // Randamize the location... SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { int x = (int) (Math.round(Math.random() * getParent().getWidth())); int y = (int) (Math.round(Math.random() * getParent().getHeight())); setLocation(x, y); } }); } catch (InterruptedException exp) { exp.printStackTrace(); } catch (InvocationTargetException exp) { exp.printStackTrace(); } while (isVisible()) { try { Thread.sleep(delay); } catch (InterruptedException e) { System.out.println("interrupted"); } try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { move(); repaint(); } }); } catch (InterruptedException exp) { exp.printStackTrace(); } catch (InvocationTargetException exp) { exp.printStackTrace(); } } } public void move() { int x = getX(); int y = getY(); if (x + vx < 0 || x + diameter + vx > getParent().getWidth()) { vx *= -1; } if (y + vy < 0 || y + diameter + vy > getParent().getHeight()) { vy *= -1; } x += vx; y += vy; // Update the size and location... setSize(getPreferredSize()); setLocation(x, y); } } }
Alternativ könnte ein Container zur Unterbringung der Bälle erstellt werden, in dem die Bälle selbst keine Komponenten sind, sondern als virtuelle Konzepte mit ausreichenden Informationen existieren, um das Abprallen zu ermöglichen Oberflächen.
Es ist wichtig zu beachten, dass das bereitgestellte Code-Snippet ein separates verwendet Thread für jeden Ball, was sich auf die Systemressourcen auswirken kann, wenn die Anzahl der Bälle zunimmt. Um dieses Skalierbarkeitsproblem zu lösen, kann ein einzelner BounceEngine-Thread verwendet werden, um alle Ballbewegungen zu verarbeiten.
Das obige ist der detaillierte Inhalt vonWie verhindert man überlappende springende Bälle in einer Java-Anwendung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!