Minimierung eines Fensters

Status
Nicht offen für weitere Antworten.

Brain

Aktives Mitglied
Hallo!!!
Ich habe folgendes Problem: Ich habe ein kleines Programm, mit dem man zeichnen kann, gemacht. Wenn ich das Fenster minimiere, dann verschwindet das Gezeichnete. Könnte mir mal bitte jemand sagen, wie ich es machen kann, dass das Gezeichnete nicht verschwindet?
Danke für jede Antwort!!!
 
Ich nehm mal an du zeichnest, und machst sonst gar nix?

... auch nicht das Bild speichern ...

Du musst auf ein separates Bild zeichnen, und anschliessend dieses Bild darstellen lassen.

z.B. so was:
Code:
public class Painter extends JPanel{ // z.B. ein JPanel, oder was du halt verwendest
  private Image img = ... // welche Sorte du gerne haben möchtest
  private Graphics imgGraphics;

  public Painter(){
    imgGraphics = img.createGraphics();  // Diese Graphics brauchen wir später
  }

  // Hier wird etwas zu dem Bild hinzugefügt
  public void fillNewOval( int x, int y, int w, int h, Color color ){
    imgGraphics.setColor( color );
    imgGraphics.fillOval( x, y, w, h );
    repaint();  // Neuzeichnen des Panels auf den Bildschirm
  }

  // Hier wird das Bild auf den Bildschirm gezeichnet
  public void paintComponent( Graphics g ){
    g.drawImage( img, 0, 0, this );
  }
}

mfg Beni
 
Also Ich versteh's nicht ganz... Hier ist der Quelltext:

Code:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class CDraw extends Frame implements ActionListener {

	CMeinJPanel m_malflaeche;
	int m_Ypos, m_Xpos;

	public static void main(String[] args) {
		CDraw auswahl = new CDraw("Draw");

		auswahl.pack();
		auswahl.setSize(800, 600);
		auswahl.show();
		auswahl.setResizable(false);

	}

	CDraw(String titel) {
		super(titel);

		class CFensterLauscher extends WindowAdapter {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		}

		final MenuBar menue_leiste = new MenuBar();

		Menu menu1 = new Menu("Datei");
		MenuItem prog_item1 = new MenuItem("Beenden");
		prog_item1.addActionListener(this);
		menu1.add(prog_item1);
		menu1.setFont(new Font("Serif", Font.BOLD, 14));

		menue_leiste.add(menu1);

		setMenuBar(menue_leiste);

		m_malflaeche = new CMeinJPanel();
		add(m_malflaeche);

		addWindowListener(new CFensterLauscher());

	}

	class CMeinJPanel extends Canvas {
		class CMeinMausAdapter extends MouseAdapter {
			public void mousePressed(MouseEvent e) {
				m_Xpos = e.getX();
				m_Ypos = e.getY();

				validate();
			}
		}

		class CMeinMausMotionAdapter extends MouseMotionAdapter {
			public void mouseDragged(MouseEvent e) {
				String str;

				Graphics tmp = m_malflaeche.getGraphics();
				m_Xpos = e.getX();
				m_Ypos = e.getY();
				setBackground(Color.WHITE);
				tmp.fillOval(m_Xpos, m_Ypos, 20, 20);
			}
		}

		CMeinJPanel() {
			addMouseListener(new CMeinMausAdapter());
			addMouseMotionListener(new CMeinMausMotionAdapter());

			setBackground(Color.WHITE);
		}
	}

	public void actionPerformed(ActionEvent e) {
		String quelle = e.getActionCommand();
		if (quelle.equals("Beenden")) {
			System.exit(0);
		}
	}
}

Was muss ich machen???
 
z.B. kannst Du es so abändern:
Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;


public class CDraw extends Frame implements ActionListener {

   CMeinJPanel m_malflaeche;
   int m_Ypos, m_Xpos;

   public static void main(String[] args) {
      CDraw auswahl = new CDraw("Draw");

      auswahl.pack();
      auswahl.setSize(800, 600);
      auswahl.show();
//      auswahl.setResizable(false);
   }

   public CDraw(String titel) {
      super(titel);

      class CFensterLauscher extends WindowAdapter {
         public void windowClosing(WindowEvent e) {
            System.exit(0);
         }
      }

      final MenuBar menue_leiste = new MenuBar();

      Menu menu1 = new Menu("Datei");
      MenuItem prog_item1 = new MenuItem("Beenden");
      prog_item1.addActionListener(this);
      menu1.add(prog_item1);
      menu1.setFont(new Font("Serif", Font.BOLD, 14));

      menue_leiste.add(menu1);

      setMenuBar(menue_leiste);

      m_malflaeche = new CMeinJPanel();
      add(m_malflaeche);

      addWindowListener(new CFensterLauscher());

   }
   
   class CMeinJPanel extends JPanel {  // <<< neu
     private Image img;  // <<< neu
     private Graphics graphics; // <<< neu
     
      class CMeinMausAdapter extends MouseAdapter {
         public void mousePressed(MouseEvent e) {
            m_Xpos = e.getX();
            m_Ypos = e.getY();

            validate();
         }
      }

      class CMeinMausMotionAdapter extends MouseMotionAdapter {
         public void mouseDragged(MouseEvent e) {
            String str;

            m_Xpos = e.getX();
            m_Ypos = e.getY();
            setBackground(Color.WHITE);
            graphics.fillOval(m_Xpos, m_Ypos, 20, 20);
            repaint();
         }
      }

      CMeinJPanel() {
         addMouseListener(new CMeinMausAdapter());
         addMouseMotionListener(new CMeinMausMotionAdapter());

         setBackground(Color.WHITE);
         
         recreateImage();  // <<< neu
      }
      
      public void paintComponent( Graphics g ){  // <<< neu
        int width = getWidth();
        int height = getHeight();
        
        if( width > 0 && height > 0 && 
            (img == null || img.getWidth( this ) != width || img.getHeight( this ) != height ))
          recreateImage();
        
        if( img != null && width > 0 && height > 0 )
          g.drawImage( img, 0, 0, this );
      }
      
      private void recreateImage(){  // <<< neu
        int width = getWidth();
        int height = getHeight();
        BufferedImage newImage = new BufferedImage( Math.max( 1, width), 
                                                    Math.max( 1, height), 
                                                    BufferedImage.TYPE_INT_RGB );
        
        Graphics newGraphics = newImage.createGraphics();
        
        if( graphics != null )
          graphics.dispose();
  
        if( width > 0 && height > 0 ){
          newGraphics.setColor( Color.white );
          newGraphics.fillRect( 0, 0, width, height );
        }
        
        newGraphics.setColor( Color.black );
          
        if( img != null )
          newGraphics.drawImage( img, 0, 0, this );
        
        img = newImage;
        graphics = newGraphics;
      }
      
   }

   public void actionPerformed(ActionEvent e) {
      String quelle = e.getActionCommand();
      if (quelle.equals("Beenden")) {
         System.exit(0);
      }
   }
}

:!: Ich hab Canvas durch JPanel ersetzt.

Jetzt wird einfach auf einem eigenständigen Bild gezeichnet, und diese Bild wird dann auf dem Bildschirm angezeigt.

mfg Beni
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben