paintComponent no funciona si es invocado por la función recursiva?

  1. Quiero ver todos los puntos uno tras otro pero solo veo 1 punto. ¿Qué cambio cambio para ver todos los puntos ?
  2. En System.out puede ver 10 veces “set” y luego 2 veces “paintComponent”. ¿Qué debo cambiar para que después de cada vez que se lo llame cambie el “paintComponente”?

=============================================== =============================

 public class exampe extends JPanel { int x; int y; public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.fillOval(x-2,y-2,4,4); System.out.println("paintComponent"); } public void set(int X, int Y) { x = X; y = Y; System.out.println("set"); super.repaint(); } public static void main(String args[]) { int e=1; JFrame frame = new JFrame("TEST"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); exampe ex= new exampe(); JScrollPane scroll = new JScrollPane(ex); frame.getContentPane().add(scroll); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); for(int i=0; i< 10; ++i) ex.set(e+i,e+i); } } 

* EXPLICACIÓN SIMPLE EN CUANTO A QUÉ PODRÍA SOLO VER LA ÚLTIMA ACTUALIZACIÓN: *

Una cita tomada de Filthy Rich Clients por Chet Haase y Romain Guy

 It is important to note that repaint requests get “coalesced,” or combined. So, for example, if you request a repaint and there is already one on the queue that has not yet been serviced, then the second request is ignored because your request for a repaint will already be fulfilled by the earlier request. This behavior is particularly helpful in situations where many repaint requests are being generated, perhaps by very different situations and components, and Swing should avoid processing redundant requests and wasting effort. 

Pruebe con esto, y pregunte lo que no está claro para usted:

 import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.swing.*; public class PointsExample { private CustomPanel contentPane; private Timer timer; private int x = 1; private int y = 1; private ActionListener timerAction = new ActionListener() { public void actionPerformed(ActionEvent ae) { contentPane.set(x, y); x++; y++; if (x == 450) timer.stop(); } }; /* * This is just JFrame, that we be * using as the Base for our Application. * Though here we are calling our * JPanel (CustomPanel), whose * paintComponent(...) method, we had * override. */ private void createAndDisplayGUI() { JFrame frame = new JFrame("Locate Mouse Position"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); contentPane = new CustomPanel(); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); timer = new Timer(100, timerAction); timer.start(); } public static void main(String\u005B\u005D args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new PointsExample().createAndDisplayGUI(); } }); } } class CustomPanel extends JComponent { private int x; private int y; public void set(int a, int b) { x = a; y = b; repaint(); } @Override public Dimension getPreferredSize() { return (new Dimension(500, 500)); } @Override public void paintComponent(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); Graphics2D g2 =(Graphics2D) g; g2.fillOval(x, y, 4, 4); } } 

Aquí está el código, que le permitirá echar un vistazo a sus puntos mientras itera dentro de un ciclo for, aunque este enfoque es altamente desaconsejado, por muchos inconvenientes asociados con él. Aunque pruebe con esto en lugar de llamar a repaint() llame a paintImmediately (int …) o paintImmediately (Rectángulo rect)

 import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.swing.*; public class PointsExample { private CustomPanel contentPane; private Timer timer; private int x = 1; private int y = 1; /* * This is just JFrame, that we be * using as the Base for our Application. * Though here we are calling our * JPanel (CustomPanel), whose * paintComponent(...) method, we had * override. */ private void createAndDisplayGUI() { JFrame frame = new JFrame("Locate Mouse Position"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); contentPane = new CustomPanel(); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); for (int i = 0; i < 500; i++) { contentPane.set(x, y); x++; y++; if (x == 450) break; } } public static void main(String\u005B\u005D args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new PointsExample().createAndDisplayGUI(); } }); } } class CustomPanel extends JComponent { private int x; private int y; public void set(int a, int b) { x = a; y = b; paintImmediately(0, 0, getWidth(), getHeight()); } @Override public Dimension getPreferredSize() { return (new Dimension(500, 500)); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.fillOval(x, y, 4, 4); } } 

1: la primera línea de paintComponent() debería ser tu super.paintComponent()

2: ¿por qué llamas super.repaint (), simplemente repaint()

Tu drow debería ser así.

 public class drow extends JPanel { ........... @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 =(Graphics2D) g; } public void set_list(LinkedList  p){ Points =p; repaint(); } 

prueba con esto Espero que esto sea simplemente una estructura, tu paintComponent () no está dibujando nada.

EDITAR

 public void set_list(LinkedList  p){ Points =p; System.out.println("set_ist");// 1:First this line will be displayed then.. repaint();//2: Then this is called, which in turn calls your `paintComponent()` } 

Ahora cuando se paintComponent() su paintComponent() tiene

 system.out.println("paintComponent"); //3: so now this will be displayed. 

¿Dónde está el problema aquí?

EDITAR- TEMPORIZADOR DE BALANCEO

Tu código estaba bien, pero el procesamiento de la función es mucho más rápido que la actualización de la GUI, por eso no pudiste ver los cambios frente a ti. La forma en que estaba haciendo, de llamar a thread.sleep () entre las llamadas a funciones para ralentizar su llamada, no era un buen enfoque. Para cualquier cosa de tiempo en el swing, use el temporizador de swing, cambié tu código para el temporizador de swing.

Usando Swing Timer:

 public class exampe extends JPanel implements ActionListener { int x; int y; int temp = 0; public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.fillOval(x - 2, y - 2, 4, 4); } public void set(int X, int Y) { x = X; y = Y; } public static void main(String args[]) { JFrame frame = new JFrame("TEST"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); exampe ex = new exampe(); JScrollPane scroll = new JScrollPane(ex); frame.getContentPane().add(scroll); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); Timer PointTimer = new Timer(1000, ex); PointTimer.setInitialDelay(1000); PointTimer.start(); System.out.println("started"); } @Override public void actionPerformed(ActionEvent e) { // set(rand.nextInt(350), rand.nextInt(350)); set(temp+10,temp+10); temp=temp+2; repaint(); } }