Hallo Leute,
bis vor zwei Tagen hat das Programm noch soweit funktioniert, dass ich Bilder speichern konnte und sie im Panel wieder anzeigen konnte. Nach einigen Änderungen (um das Programm zu verkleinern) wird das Bild jetzt aber nicht mehr auf dem Panel angezeigt. Die Methode zum Laden des BIldes habe ich nicht verändert. Ich habe es über einen Bufferedreader mit new File und Path versucht und über Image und ImageIcon.
Das gemalte Bild wird leider nicht mehr angezeigt. Allerdings wird auch keine Exception geworfen.
Ich habe den Verdacht, dass das Bild zwar angezeigt, aber durch irgendetwas übermalt wird. Ich wüsste aber nicht durch was...
Kann mir zufällig jemand den Fehler zeigen?
Dann kann ich ihn hofftl. selbst korrigieren.
Klasse MeinPaint:
und die Klasse Drawing:
Vielen Dank schon mal
bis vor zwei Tagen hat das Programm noch soweit funktioniert, dass ich Bilder speichern konnte und sie im Panel wieder anzeigen konnte. Nach einigen Änderungen (um das Programm zu verkleinern) wird das Bild jetzt aber nicht mehr auf dem Panel angezeigt. Die Methode zum Laden des BIldes habe ich nicht verändert. Ich habe es über einen Bufferedreader mit new File und Path versucht und über Image und ImageIcon.
Das gemalte Bild wird leider nicht mehr angezeigt. Allerdings wird auch keine Exception geworfen.
Ich habe den Verdacht, dass das Bild zwar angezeigt, aber durch irgendetwas übermalt wird. Ich wüsste aber nicht durch was...
Kann mir zufällig jemand den Fehler zeigen?
Dann kann ich ihn hofftl. selbst korrigieren.
Klasse MeinPaint:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
public class MeinPaint extends JFrame {
private static final long serialVersionUID = 1L;
protected static final java.lang.String String = null;
JFrame frame;
JPanel hauptpanel, buttonPanel, buttons2Panel;
JLabel zeichnenPanel,bildDarstellen,bildname;
JPanel zeichnen = new JPanel();
static JButton malen, zeichnungenAnzeigen, annehmen;
private BufferedImage bd;
public MeinPaint() {
// Das Hauptframe wird erstellt
frame = new JFrame("Mein Paint Programm");
frame.setSize(1000, 750);
frame.setLocationRelativeTo(null);
frame.setLayout(new BorderLayout());
// Hierdrauf wird alles hinzugefügt
Container c = frame.getContentPane();
// Hier wird das Auswahlpanel angelegt
hauptpanel = new JPanel();
hauptpanel.setVisible(true);
hauptpanel.setLayout(null);
// Hierdrauf wird gezeichnet
zeichnenPanel = new JLabel();
zeichnenPanel.setLayout(new BorderLayout());
zeichnenPanel.setSize(1000, 750);
zeichnenPanel.setVisible(false);
// Hier liegen die Buttons
// Dieses Panel dient den Farbbuttons
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(12, 1));
buttonPanel.setSize(100, 650);
// Dieses Panel dient dem speichern/laden/zurück buttons
buttons2Panel = new JPanel();
buttons2Panel.setLayout(new GridLayout(1, 3));
buttons2Panel.setSize(900, 30);
// Die zwei Hauptmenübuttons werden hinzugefügt
malen = new JButton("Malen");
// Erstellen der Drawklasse
final Drawing draw = new Drawing();
draw.setSize(880, 750);
// Die Listener werden registriert
malen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hauptpanel.setVisible(false);
zeichnenPanel.setVisible(true);
}
});
// der zurück Button wird eingefügt
JButton zurueck = new JButton("zurück");
zurueck.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
hauptpanel.setVisible(true);
zeichnenPanel.setVisible(false);
}
});
JButton speichern = new JButton("Speichern");
speichern.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
File fileToSave = new File(
"C:\\Users\\Alexander Admin\\Desktop\\.jpeg");
// Variante funktioniert
String fileName = "C:\\Users\\Alexander Admin\\Desktop\\*.jpeg";
// Erstelle ein BufferedImage
int w = draw.getWidth();
int h = draw.getHeight();
float quality = 1f;
BufferedImage bi = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
Graphics2D big2d = bi.createGraphics();
// Male das JPanel in das BufferedImage
draw.paint(big2d);
Iterator<ImageWriter> iter = ImageIO
.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(quality);
try {
FileImageOutputStream fos = new FileImageOutputStream(
fileToSave);
if (fileToSave.exists()) {
}
if (fileName.equals(".jpeg")) {
String text = "";
}
// So wird das Bild gemalt und gespeichert
writer.setOutput(fos);
IIOImage img = new IIOImage((RenderedImage) bi, null, null);
writer.write(null, img, iwp);
JOptionPane.showMessageDialog(null, "Bild gespeichert");
// Und hiermit kann das BIld noch während das Programm läuft
// aufgerufen werden
fos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
draw.clear();
}
});
JButton laden = new JButton("laden");
laden.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int ergebnis = chooser.showOpenDialog(MeinPaint.this);
if (ergebnis == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
//Variante 2 //funktioniert nicht
// zeichnenPanel.setIcon(new ImageIcon(file.toString()));
//Variante 1
// aus dem File ein BIld erstellen
ImageIcon image = new ImageIcon(file.getAbsolutePath());
// Höhe und breite des labels das Panel wurde zum Label umfunktioniert
Rectangle rect = /*bildDarstellen*/zeichnenPanel.getBounds();
// Ein neues Image wird erstellt und diesem die Höhe und
// breite des Labels zugewiesen welches das Label hat
Image scaledImage = image.getImage()
.getScaledInstance(
rect.width, rect.height,
Image.SCALE_DEFAULT);
// es wird dem image ein neues bild zugewiesen welches die
// höhe und breite des labels hat
image = new ImageIcon(scaledImage);
// anschließend wird das bild auf das Label gesetzt
/*bildDarstellen*/zeichnenPanel.setIcon(image);
//der name des files wird angezeigt
// String name=file.getName();
// bildname.setText(name);
}else
JOptionPane.showMessageDialog(null, "Abgebrochen");
}
});
// Die Farbbuttons werden erstellt
JButton blau = new JButton("blau");
blau.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Blau();
}
});
JButton gruen = new JButton("grün");
gruen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Gruen();
}
});
JButton rot = new JButton("rot");
rot.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Rot();
}
});
JButton gelb = new JButton("gelb");
gelb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Gelb();
}
});
JButton schwarz = new JButton("blk");
schwarz.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Schwarz();
}
});
JButton cyan = new JButton("cyan");
cyan.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Cyan();
}
});
JButton magenta = new JButton("mg");
magenta.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Magenta();
}
});
JButton pink = new JButton("pink");
pink.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Pink();
}
});
JButton grau = new JButton("grau");
grau.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.Grau();
}
});
// der löschen button wird erstellt
JButton loeschen = new JButton("C");
loeschen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
draw.clear();
}
});
// alle Buttons werden der Zeichenfläche hinzugefügt
buttonPanel.add(blau);
buttonPanel.add(gruen);
buttonPanel.add(rot);
buttonPanel.add(gelb);
buttonPanel.add(schwarz);
buttonPanel.add(cyan);
buttonPanel.add(magenta);
buttonPanel.add(pink);
buttonPanel.add(grau);
buttonPanel.add(loeschen);
buttonPanel.add(speichern);
buttonPanel.setBackground(Color.LIGHT_GRAY);
// Hier werden die buttonpanels auf das zeichnenPanel geaddet
zeichnenPanel.add(buttonPanel, BorderLayout.WEST);
zeichnenPanel.add(buttons2Panel, BorderLayout.NORTH);
// das Bild worauf gemalt wird, wird hinzugefügt ebenso das buttonpanel
zeichnenPanel.add(draw, BorderLayout.CENTER);
buttons2Panel.add(loeschen);
buttons2Panel.add(laden);
buttons2Panel.add(zurueck);
//hier wird das Zeichnenpanel geaddet
frame.add(zeichnenPanel);
zeichnenPanel.setVisible(false);
// das hauptpanel wird auf das Frame geaddet
frame.add(hauptpanel);
// hier wird der button dem hauptpanel geaddet
hauptpanel.add(malen);
hauptpanel.setVisible(true);
// Die Buttons werden angelegt
malen.setSize(80, 60);
// Nur das Hauptpanel ist zuerst sichtbar
// Das Hauptframe wird angezeigt
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new MeinPaint();
}
}
und die Klasse Drawing:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
/*--------------------------WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------------*/
public class Drawing extends JComponent
{
//Auf WAS! möchte ich zeichnen
Image img;
BufferedImage icon;
ImageIcon ii;
Graphics g;
//Mit WAS! möchte ich zeichnen
Graphics2D g2d=(Graphics2D)g;
//WAS! sind die Werte
int currentX,currentY,oldX,oldY;
// MeinPaint mp=null;
// Zeichen z;
public Drawing()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
oldX=e.getX();
oldY=e.getY();
}
public void mouseClicked(MouseEvent e)
{
currentX=e.getX();
currentY=e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
currentX=e.getX();
currentY=e.getY();
g2d.drawLine(oldX,oldY,currentX,currentY);
oldX=currentX;
oldY=currentY;
repaint();
}
});
}
public void paintComponent(Graphics g)
{
try {
icon=ImageIO.read(new File("C:\\Users\\Alexander Admin\\Desktop\\.jpeg"));
g.drawImage(icon, 0, 0, null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(img==null)
{
img=createImage(getSize().width,getSize().height);
g2d=(Graphics2D) img.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
else if(img!=null)
{
g.drawImage(img, 0, 0, this);
}
}
//In der clear Methode wir zunächst die Farbe weiß gesetzt. Dann ein weißes Rechteckt gemalt und anschließend die Farbauswahl
//wieder auf schwarz gesetzt
public void clear()
{
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setPaint(Color.BLACK);
repaint();
}
public void Blau()
{
g2d.setPaint(Color.BLUE);
repaint();
}
public void Gruen()
{
g2d.setPaint(Color.GREEN);
repaint();
}
public void Rot()
{
g2d.setPaint(Color.RED);
repaint();
}
public void Gelb()
{
g2d.setPaint(Color.YELLOW);
repaint();
}
public void Schwarz()
{
g2d.setPaint(Color.BLACK);
repaint();
}
public void Cyan()
{
g2d.setPaint(Color.CYAN);
repaint();
}
public void Magenta()
{
g2d.setPaint(Color.MAGENTA);
repaint();
}
public void Pink()
{
g2d.setPaint(Color.PINK);
repaint();
}
public void Grau()
{
g2d.setPaint(Color.GRAY);
repaint();
}
}
Vielen Dank schon mal