crear - jlabel en java
Java: el dibujo desaparece al minimizar JFrame (1)
Intento crear un software de pintura, pero he terminado con la cuestión de la desaparición de gráficos.
Mi clase es la siguiente:
public class CanvasFrame extends JPanel {
private Point lastMousePoint;
ArrayList<Point> location = new ArrayList<Point>();
public CanvasFrame() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
lastMousePoint = new Point (e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
g.drawLine(lastMousePoint.x, lastMousePoint.y, e.getX(), e.getY());
lastMousePoint = new Point(e.getX(), e.getY());
g.dispose();
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("Drawing with friends");
frame.getContentPane().add(new CanvasFrame(), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
}
La parte de dibujo del software funciona bien, pero a medida que el problema informa, el dibujo desaparece al minimizar.
He intentado trabajar con la anulación de Graphics g, así como guardar todos los puntos del mouse en una matriz, pero sin suerte. Al buscar no pude encontrar una solución para mi proyecto exacto, así que espero que ustedes puedan ayudar.
Arreglé tu código para que dibujes una línea mientras arrastras el mouse. Dibuja una nueva línea cuando suelta y presiona el botón izquierdo del mouse nuevamente.
Aquí están los cambios que hice al código.
Envolví el código JFrame en Runnable e invoqué la GUI de Swing con una llamada al método SwingUtilities invokeLater. El método invokeLater coloca la creación y la actualización de los componentes de la GUI de Swing en el hilo Despacho de evento . Oracle y yo exigimos que todos comiencen su aplicación Swing en el hilo de Despacho de Eventos.
Agregué el método paintComponent para pintar los puntos en la lista de ubicaciones.
Modifiqué los métodos del mouse para agregar puntos a la lista de ubicación.
Moví la información de tamaño del JFrame al JPanel. No nos importa el tamaño del JFrame. Nos importa el tamaño del panel de dibujo.
Aquí está el código:
package com.ggl.testing;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CanvasFrame extends JPanel {
private static final long serialVersionUID = -2454929744982913302L;
private List<Point> location = new ArrayList<Point>();
public CanvasFrame() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
location.clear();
location.add(e.getPoint());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
location.add(e.getPoint());
repaint();
}
});
setPreferredSize(new Dimension(800, 600));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (location.size() <= 0) {
return;
}
Point p = location.get(0);
for (int i = 1; i < location.size(); i++) {
Point q = location.get(i);
g.drawLine(p.x, p.y, q.x, q.y);
p = q;
}
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Drawing with friends");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new CanvasFrame(), BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(runnable);
}
}