JFrame repaint() verbieten

Maik639

Erfahrenes Mitglied
Hallo,

ich brauche für eine applikation eine möglichkeit das repaint vom JFrame zu deaktivieren,
lösungen die mir NICHT helfen werden:

Code:
public void paint(Graphics g) {}

------------------------------------

public void setIgnoreRepaint(boolean ignoreRepaint) {
	super.setIgnoreRepaint(ignoreRepaint);
}

------------------------------------

setIgnoreRepaint(true);

Vielen dank schonmal imvoraus =),

grüße maik
 
Du könntest das repaint einfach überschreiben und nur einmal ausführen, danach blocken, sowas in der Richtung wie:

Java:
boolean first = true;

@Override
public void repaint(Graphics g) {
  if (first) {
    super.repaint(g);
    first = false;
  }
}
Das ist jetzt nur zur Darstelllung, es muss syntaktisch nicht korrekt sein(insb. bei der Funktionssignatur bin ich mir nicht sicher), aber ich denke das reicht, damit du ne Vorstellung hast, was ich meine.

Gruß
Matt
 
Zuletzt bearbeitet von einem Moderator:
hm das klappt auch nicht... hab ich glaube ich eh schonmal versucht...
Also ich male ein bild auf den Hintergrund eines JFrame und ziehe dann
eine makierung, ähnlich wie bei windows, wenn man einen bereich auf dem desktop auswählt mit gedrückter maustaste.. so, damit das funktioniert muss ich den JComponent den ich dafür verwende repainten... mein prob ist, sobald das passiert, ist das bild im hintergrund weg.. also sieht man nicht was man auswählt
 
also ich brauche im prinzip nur eine möglichkeit, die dafür sorgt, das das bild das auf dem hintergrund ist, "persist" wird, es also niemals verschwindet... das könnte auf einem Jframe oder jpanel sein...
 
joa ist halt mitten ausm programm rausgeholt jetzt, aber ist alles bei was man dafür brauch.. musst nur ne main() einfügen.

Code:
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class SnippingTool extends JFrame{
	
	private BufferedImage image;
	private BufferedImage bufferedImage;
	private Rectangle screenSize, captureSize;
	private GraphicsEnvironment env;
	private Graphics2D g2d;
	private GraphicsDevice[] devices;
	private Dimension dimension;
	private MouseMotionListener mousemotionlistener;
	private MouseListener mouselistener;
	private Point startDrag, endDrag;
	private SelectOnFrame selectOnFrame;
	private Color white = new Color(255, 255, 255, 100);
	
	public SnippingTool() {
		setUndecorated(true);
		setAlwaysOnTop(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
		devices = env.getScreenDevices(); 
		dimension = Toolkit.getDefaultToolkit().getScreenSize();
		screenSize = new Rectangle(0, 0, dimension.width * devices.length, dimension.height);
		setBounds(screenSize);
		
		try {
			bufferedImage = new Robot().createScreenCapture(screenSize);
			image = new Robot().createScreenCapture(screenSize);
		} catch (AWTException e) {
			e.printStackTrace();
		}
		
		startDrag = new Point(0, 0);
		endDrag = new Point(0, 0);
		addListener();
		
		selectOnFrame = new SelectOnFrame();
		add(selectOnFrame, BorderLayout.CENTER);
		
		setVisible(true);
	}
	
	public void paint(Graphics g) {
		g2d = (Graphics2D) image.createGraphics();
		g2d.setColor(white);
		g2d.fill(screenSize);
		g2d.drawImage(image, null, 0, 0);
		g.drawImage(image, 0, 0, this);	
	}
	
	public void addListener() {
		mouselistener = new MouseListener() {
			public void mouseReleased(MouseEvent ev) {
				setVisible(false);
			} 
			public void mousePressed(MouseEvent ev) {
				startDrag = new Point(ev.getX(), ev.getY());
			}
			public void mouseEntered(MouseEvent ev) { } 
			public void mouseExited(MouseEvent ev) { } 
			public void mouseClicked(MouseEvent ev) { } 
		};
		addMouseListener(mouselistener);
		
		mousemotionlistener = new MouseMotionListener() {
	        public void mouseDragged(MouseEvent ev) {
	          endDrag = new Point(ev.getX(), ev.getY());
	          selectOnFrame.setPoints(startDrag, endDrag);
	        }
			public void mouseMoved(MouseEvent ev) { }
		};
		addMouseMotionListener(mousemotionlistener);
	}

	public BufferedImage getScreenshot() {
		if ((startDrag.y < endDrag.y) && (startDrag.x < endDrag.x)) {
			captureSize = new Rectangle(startDrag.x, startDrag.y, endDrag.x - startDrag.x, endDrag.y - startDrag.y);
		} else if ((startDrag.x > endDrag.x) && (startDrag.y < endDrag.y)) {
			captureSize = new Rectangle(endDrag.x, startDrag.y, startDrag.x - endDrag.x, endDrag.y - startDrag.y);
		} else if ((startDrag.y > endDrag.y) && (startDrag.x < endDrag.x)) {
			captureSize = new Rectangle(startDrag.x, endDrag.y, endDrag.x - startDrag.x, startDrag.y - endDrag.y);
		} else if ((startDrag.y > endDrag.y) && (startDrag.x > endDrag.x)) {
			captureSize = new Rectangle(endDrag.x, endDrag.y, startDrag.x - endDrag.x, startDrag.y - endDrag.y);
		}
		return bufferedImage.getSubimage(captureSize.x, captureSize.y, captureSize.width, captureSize.height);
	}
}

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;

public class SelectOnFrame extends JComponent {
	
	private Color darkblue = new Color(0, 150, 225, 255);
	private Color lightblue = new Color(0, 150, 225, 50);
	private Point startDrag = new Point(0, 0);
	private Point endDrag = new Point(0, 0);
	private Shape shapeMakeRectangle;
	
	public void setPoints(Point startDrag, Point endDrag) {
		this.startDrag = startDrag;
		this.endDrag = endDrag;
		repaint();
	}
	
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		g2.setColor(new Color(0, 150, 225));
		if (startDrag != null && endDrag != null) {
			shapeMakeRectangle = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
			g2.setColor(darkblue);
			g2.draw(shapeMakeRectangle);
			g2.setColor(lightblue);
        	g2.fill(shapeMakeRectangle);
		}
	}

	public Rectangle2D.Float makeRectangle(int x1, int y1, int x2, int y2) {
		return new Rectangle2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
	}
}
 
Hallo,

ich verstehe nicht ganz warum du das repaint abschalten möchtest.
In deinem Code zeichnest du doch das Image immer wieder.
Wenn du repaint deaktivieren würdest, könnte das zu Problemen führen da manche auch repaints vom Frame angestoßen werden, also der repaint der Components die sich im Frame befinden.

Gruß

Sascha
 
Du kannst ja mal meinen code kopieren und eine main() eunfügen, dann wirst du sehen was mein problem ist.

Kurz nochmal mein Problem:

Ich möchte ein platformunabhängiges SnippingTool schreiben, allerdings sobald ich einen bereich auswähle, wird der hintergrund weiß, das muss ich verhindern, auf dem hintergrund muss immer das bufferedimage zu sehen sein
 
Hab mir deinen Code jetzt mal angeschaut.
Es wäre besser, wenn du nicht die paint-Methode des Fensters überschreibst, sondern besser eine Component schreibst, welche ein Hintergrundbild darstellen kann.
Diese sollte man dann als ContentPane setzen. Für den Auswahlrahmen eignet sich am besten die Glasspane des Fensters.

Java:
import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JComponent;
import javax.swing.JFrame;
 
public class SnippingTool extends JFrame{
    
    private BufferedImage image;
    private BufferedImage bufferedImage;
    private Rectangle screenSize, captureSize;
    private GraphicsEnvironment env;
    private Graphics2D g2d;
    private GraphicsDevice[] devices;
    private Dimension dimension;
    private MouseMotionListener mousemotionlistener;
    private MouseListener mouselistener;
    private Point startDrag, endDrag;
    private SelectOnFrame selectOnFrame;
    private Color white = new Color(255, 255, 255, 100);
    
    public SnippingTool() {
        setUndecorated(true);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
        devices = env.getScreenDevices(); 
        dimension = Toolkit.getDefaultToolkit().getScreenSize();
        screenSize = new Rectangle(0, 0, dimension.width * devices.length, dimension.height);
        setBounds(screenSize);
        
        try {
            bufferedImage = new Robot().createScreenCapture(screenSize);
            image = new Robot().createScreenCapture(screenSize);
        } catch (AWTException e) {
            e.printStackTrace();
        }
        
        startDrag = new Point(0, 0);
        endDrag = new Point(0, 0);
        addListener();
        
        selectOnFrame = new SelectOnFrame();
        setGlassPane(selectOnFrame);
        selectOnFrame.setVisible(true);
        
        getContentPane().add(new PicturePanel(image));
        
        setVisible(true);
    }
    
    
    
    public void addListener() {
        mouselistener = new MouseListener() {
            public void mouseReleased(MouseEvent ev) {
                setVisible(false);
            } 
            public void mousePressed(MouseEvent ev) {
                startDrag = new Point(ev.getX(), ev.getY());
            }
            public void mouseEntered(MouseEvent ev) { } 
            public void mouseExited(MouseEvent ev) { } 
            public void mouseClicked(MouseEvent ev) { } 
        };
        addMouseListener(mouselistener);
        
        mousemotionlistener = new MouseMotionListener() {
            public void mouseDragged(MouseEvent ev) {
              endDrag = new Point(ev.getX(), ev.getY());
              selectOnFrame.setPoints(startDrag, endDrag);
            }
            public void mouseMoved(MouseEvent ev) { }
        };
        addMouseMotionListener(mousemotionlistener);
    }
 
    public BufferedImage getScreenshot() {
        if ((startDrag.y < endDrag.y) && (startDrag.x < endDrag.x)) {
            captureSize = new Rectangle(startDrag.x, startDrag.y, endDrag.x - startDrag.x, endDrag.y - startDrag.y);
        } else if ((startDrag.x > endDrag.x) && (startDrag.y < endDrag.y)) {
            captureSize = new Rectangle(endDrag.x, startDrag.y, startDrag.x - endDrag.x, endDrag.y - startDrag.y);
        } else if ((startDrag.y > endDrag.y) && (startDrag.x < endDrag.x)) {
            captureSize = new Rectangle(startDrag.x, endDrag.y, endDrag.x - startDrag.x, startDrag.y - endDrag.y);
        } else if ((startDrag.y > endDrag.y) && (startDrag.x > endDrag.x)) {
            captureSize = new Rectangle(endDrag.x, endDrag.y, startDrag.x - endDrag.x, startDrag.y - endDrag.y);
        }
        return bufferedImage.getSubimage(captureSize.x, captureSize.y, captureSize.width, captureSize.height);
    }
    
    public static void main(String[] args) {
		new SnippingTool().setVisible(true);
	}
    
    public static class PicturePanel extends JComponent{
    	private BufferedImage image;

		public PicturePanel(BufferedImage image) {
			super();
			this.image = image;
			Graphics2D g2d = image.createGraphics();
			g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
			g2d.setColor(Color.white);
			g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
			g2d.dispose();
		}
    	
    	@Override
    	protected void paintComponent(Graphics g) {
    		
            g.drawImage(image, 0, 0, this); 
    	}
    }
}

Bei Swing sollte man die paintComponent-Methode überschreiben und nicht die paint-Methode. Die sollte man nur bei AWT überschreiben.

Gruß

Sascha
 
Zurück