Foro sobre Java SE > Funcionamiento de paint()
El método ya lo usas en tu código: repaint()
Si quieres que se ejecute un bloque de código dentro de paintComponent, cuando se cumpla alguna condición externa (por ejemplo que se pulse o no un botón), puedes encerrar ese bloque dentro de un condicional if, con una variable externa asociada a dicha condición.
Muchas gracias choces. Efectivamente, coloque en cada evento de los botones un valor true a una variable booleana y dentro del paint, el código lo encerré en un if:
if(isPressedButton == true){
super.paint(g);
g.setColor (Color.red);
g.fillOval (lados, altura, 100, 100);
g.drawLine(lados-20,altura-20, 89, 23);
}
Cuando intento usar el método paintComponent() me dice que el método no está definido para el tipo JFrame. Supongo que debe utilizarse con un JPanel, pero no logro hacerlo.
¿Podrían indicarme como usar paintComponent con un JPanel y agregarlo al JFrame?
Yo empecé con JavaFX, ahí me va mejor, pero quisiera aprender Swing también.
Una última pregunta, disculpen si abuso de su confianza. ¿Quién tiene mayor performance a su punto de vista, o tiene más ventajas unoo sobre el otro, JavaFX o Swing?
Gracias.
Para JFrame se usa paint, y para JComponent y sus extensiones, como JPanel, se debe usar paintComponent
Si quieres usar tu propia versión de paintComponent de un JPanel, y añadirlo a un JFrame, debes declarar tu propio JPanel como una extensión de JPanel, y sobreescribir el método paintComponent.
class MiJPanel extends JPanel{
@Override
public void paintComponent(Graphics g) {
// tu código
super.paintComponent(g);
}
]
Añades ese MiJPanel a tu JFrame como un componente más del mismo.
Entrar en comparaciones entre Swing y JavaFX puede llevar a varios callejones sin salida.
Yo uso Swing de manera general, y JavaFX dentro de Swing, donde Swing no ofrece iguales o mejores soluciones, por ejemplo gráficos de negocio (charts) y animaciones complejas.
A la fecha, Swing es una tecnología muy madura, con soluciones para todo, y una enorme cantidad de código publicado. No está muy claro si JavaFX tendrá el suficiente éxito como para, eventualmente, desplazar a Swing como UI.
Por otra parte, Swing ha tenido, desde siempre, muy "mala prensa" con el asunto del rendimiento.
La verdad es que los mayores problemas de rendimiento con Swing (animaciones aparte), se deben a lo mal que se usa. He visto tantas aberraciones y disparates hechas con Swing, que ya no me sorprendo de nada.
Muchas gracias choces, ahora todo está claro.
Gracias por tu ayuda. Un abrazo.
Hola, buenas tardes. Tengo una duda sobre el funcionamiento del método paint() o paintComponent de la clase Graphics.
Tengo el siguiente code:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Clase extends JFrame {
private JPanel contentPane;
private int lados = 300;
private int altura=300;
// Lanza la aplicacion
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Clase frame = new Clase();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
// Crea el Frame
public Clase() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 700,650);
// configuracion del panel
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton bi = new JButton("Izquierda");
bi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
lados=lados-10;
repaint();
}
});
bi.setBounds(105, 482, 89, 23);
contentPane.add(bi);
JButton bd = new JButton("Derecha");
bd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lados=lados+10;
repaint();
}
});
bd.setBounds(520, 482, 89, 23);
contentPane.add(bd);
JButton ba = new JButton("Debajo");
ba.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
altura += 10;
repaint();
}
});
ba.setBounds(520, 522, 89, 23);
contentPane.add(ba);
JButton bs = new JButton("Arriba");
bs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
altura -= 10;
repaint();
}
});
bs.setBounds(105, 522, 89, 23);
contentPane.add(bs);
}
public void paint(Graphics g)
{
super.paint(g);
g.setColor (Color.red);
g.fillOval (lados, altura, 100, 100);
}
}
Mi idea era que al presionar uno de los botones, el gráfico se muestre en el panel. Pero tan solo con ejecutar la clase me muestra el gráfico.
¿Por qué sucede esto? ¿Hay alguna manera de llamar al método para dibujar algo solo cuando así lo queramos?
Gracias de antemano.