Enregistrer l'image à partir d'un Composite après le tirage
Je suis débutant en java, mon premier projet est d'attirer, et enregistrer une image à partir d'un Composite, mon tirage est fait, mais je ne peux pas l'enregistrer après je dessine dans un Composite :(, Donc pouvez-vous m'aider à le résoudre
quand j'ouvre l'image après le tirage, Il ne contient rien 🙁
voici mes codes:
package image;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class paint extends JFrame{
private Point points[] = new Point[10000];
private Point pointends[] = new Point[10000];
private int pointCount = 0;
private JButton save_btn;
public paint()
{
panel paint2 = new panel();
add(paint2,BorderLayout.CENTER);
}
private class panel extends JPanel
{
private paint my_paint;
public panel()
{
setBackground(Color.WHITE);
save_btn = new JButton();
save_btn.setText("123");
this.add(save_btn);
ButtonHandler handler1 = new ButtonHandler();
save_btn.addActionListener(handler1);
MouseHandler handler = new MouseHandler();
this.addMouseMotionListener(handler);
this.addMouseListener(handler);
}
private class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0) {
//TODO Auto-generated method stub
savefile();
}
}
@Override
protected void paintComponent(Graphics g)
{
//TODO Auto-generated method stub
super.paintComponent(g);
for(int i = 0;i <pointCount;i++)
{
g.setColor(Color.RED);
g.drawLine(points[i].x, points[i].y, pointends[i].x, pointends[i].y);
}
}
private class MouseHandler extends MouseAdapter
{
@Override
public void mouseDragged(MouseEvent e)
{
//TODO Auto-generated method stub
pointends[ pointCount-1] = e.getPoint();
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
//TODO Auto-generated method stub
super.mousePressed(e);
if(pointCount < points.length)
{
points[ pointCount ] = e.getPoint();
pointends[ pointCount ] = e.getPoint();
pointCount++;
repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
//TODO Auto-generated method stub
super.mouseReleased(e);
/*pointends[pointCount]=e.getPoint();
repaint();
pointCount++;
*/
}
}
}
public void savefile()
{
BufferedImage image2 = new BufferedImage(panel.WIDTH, panel.HEIGHT, BufferedImage.TYPE_INT_RGB);
JFileChooser jFile = new JFileChooser();
jFile.showSaveDialog(null);
Path pth = jFile.getSelectedFile().toPath();
JOptionPane.showMessageDialog(null, pth.toString());
Graphics2D graphics2D = image2.createGraphics();
try {
ImageIO.write(image2, "", new File(pth.toString()));
} catch (IOException ox) {
//TODO: handle exception
ox.printStackTrace();
}
}
}
Respecter les conventions de nommage Java. Nom de la classe de NE PAS commencer par une minuscule.
OriginalL'auteur | 2013-10-27
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur 刘远圳
Créer BufferedImage pour stocker votre peinture. Lorsque vous peinture, peinture sur BufferedImage.
Lorsque vous avez besoin d'afficher de la peinture sur un Composite, tirage BufferedImage sur un Composite.
De cette façon, vous pouvez charger /enregistrer la peinture de fichier.
Quelque chose comme ceci:
OriginalL'auteur nullptr
Il y a une belle approche:
Tout ce qu'il fait: Il crée une image visible, taille du composant et
ARGB
type de support de la transparence. Puis il obtenir les graphiques et le passer au composant nous voulons avoir instantané de. Il peint cette composante de l'enfant, y compris tout composant tiré sur elle.Mise à jour: Vous pouvez utiliser le composant.print(Graphics g):
Mais cette fonction ne dessiner que le rendu graphique du composant, mais pas les composants enfants. Je l'ai testé.
Edit:
paint extends JFrame
classe peut avoir un joli nom, par exemple,PaintFrame extends JFrame
. Nom de la classe ne doit pas avoir un nom de fonction, la peinture est unverb
, c'est une fonction.panel extends JPanel
: pourquoi devrions-nous aller vers le bas le choix d'un nom de classe avec leur première lettre en minuscule? Nous pouvons donner notre nom de composant afin de refléter ce que nous faisons avec elle: comme, nous sommes en dessin alors que sur leMyCanvas extends JPanel
panel
votre première déclarationprivate paint my_paint;
: qu'est-ce que ça fait ici inutilement ?saveFile()
fonction appartient à laJFrame
et vous avez créé votrepanel
(sur lequel vous dessinez) locales à l'image du constructeur. Comment lesaveFile()
fonction y avoir accès? Déclarer votre peinture Panneau dans la classe JFrame contextepublic
ouprivate
.J'ai écrit d'une manière significative à lire la taille du composant à l'aide de
getWidth()
etgetHeight()
Mais vous écrivez:Et encore, j'ai entièrement écrit du code pour enregistrer l'image en tant que
png
à l'aide deImageIO.write(image, "png", "myFile.png")
fonction. Veuillez lire les réponses attentivement.Ressources suivantes peuvent être utiles:
ok, le composant que vous essayez d'attirer l'était-elle visible ? Il a besoin de la composante pour être visible à
setVisible(true)
. laissez-moi savoirComposants Swing, à l'exception de haut niveau des composants (JFrame, JDialog, JWindow), sont visibles par défaut. Vous n'avez pas besoin d'appeler manuellement le setVisible() la méthode.
oui, je voulais dire que là où il était déjà visible par le temps qu'il a l'intention de créer l'image. Je suis la mise à jour de la réponse avec une autre approche. Il doit travailler comme je l'ai testé
j'ai mis à jour la réponse. Voyez si cela fonctionne pour vous.
OriginalL'auteur Sage
L'Image De L'Écran vous permet d'enregistrer une image de n'importe quel composant.
Fonctionne très bien pour moi. Je viens juste de double cliquer sur l'image lors de l'utilisation de l'Explorateur Windows et l'image est affichée. Publier vos
SSCCE
montrant le problème.qu'est-ce que SSCCE !, Je suis newbie 🙁
avez-vous essayé Google?
OriginalL'auteur camickr