Echemos un vistazo a las representaciones primero:
Simplemente suba el código.
Ajuste el botón y agregue el lienzo para dibujar algunos círculos y luego monitorear. . .
paquete cn.hncu.threaddemo.thread2; import java.awt.canvas; import java.awt.color; import java.awt.graphics; import java.awt.event.actionEvent; import java.awt.event.actionListener; import java.awt.event.focusevent; importar; import java.awt.event.focusListener; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jspinner; import javax.swing.timer; import javax.swing.event.changeevent; import javax.swing.shing.changeLevent; extiende Jframe implementa ChangeListener {ballscanvas ballscanvas privado; Spinner de Jspinner privado; public ballsjframe () {super ("pineball"); this.setBounds (300, 200, 400, 300); this.setDefaultCloseOperation (EXIT_ON_CLOSE); Color Colors [] = {Color.Red, Color.Green, Color.Blue, Color.Magenta, Color.cyan}; bola = nueva ballscanvas (colores, 100); this.getContentPane (). add (ball); // El valor predeterminado es la posición central jpanel panel = new JPanel (); this.getContentPane (). add (panel, "sur"); panel.add (new JLabel ("retraso")); spinner = new JSpinner (); spinner.setValue (100); panel.add (spinner); spinner.addchangelistener (esto); this.setVisible (verdadero); } @Override public void statechanged (ChangeEvent e) {int value = integer.ParseInt (""+spinner.getValue ()); ball.setDelay (valor); } public static void main (string [] args) {new BallsjFrame (); }} class Ballscanvas extiende Canvas implementa ActionListener, FocusListener {private Ball Balls []; // Almacenamiento de todas las bolas Temporizante privado temporizador; // javax.swing.timer public ballscanvas (color color [], int demora) {this.balls = new Ball [color.llength]; para (int i = 0, x = 40; i <colores.length; i ++, x+= 20) {this.balls [i] = new Ball (x, x, colores [i]); } // deja que el lienzo actual monitoree el evento de enfoque this.addfocusListener (esto); temporizador = nuevo temporizador (retraso, esto); timer.start (); } public void setDelay (int demora) {timer.setDelay (demora); } @Override public void Paint (Graphics g) {for (int i = 0; i <this.balls.length; i ++) {G.SetColor (Balls [i] .color); // deja que las coordenadas de cada bola --- (x coordenadas) bolas [i] .x = bolas [i] .left? bolas [i] .x-10: bolas [i] .x+10; // Cuando la bola golpea una pared, cambie la dirección de la pelota if (bolas [i] .x <= 0 || balls [i] .x> = this.getWidth ()-24) {Balls [i] .left =! Balls [i] .left; // Dirección de cambio} // ¿las coordenadas de cada bola cambian --- (y coordinadas) Balls [balls [i] .y] .y] ?y]. bolas [i] .y-10: bolas [i] .y+10; // Cuando la pelota golpea una pared, cambie la dirección de la pelota if (bolas [i] .y <= 0 || bolas [i] .y> = this.getheight ()-22) {Balls [i] .up =! Balls [i] .Up; // Dirección de cambio} G.Filloval (Balls [i] .x, Balls [i] .y, 20, 20); }} @Override public Void ActionPerformed (ActionEvent E) {//system.out.println("AAA "); repintador (); // Actualiza el lienzo. Llamar pintar (gráficos g)} @Override public void Focusgined (FocuseVent E) {timer.stop (); } @Override public void FocusLost (FocuseVent E) {timer.restart (); } bola de clase estática privada {int x, y; booleano arriba, izquierda; Color color; bola pública (int x, int y, color color) {this.x = x; this.y = y; this.color = color; arriba = izquierda = falso; }}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.