tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
850
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    Hallo,

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public void paint(Graphics g) {}
     
    ------------------------------------
     
    public void setIgnoreRepaint(boolean ignoreRepaint) {
        super.setIgnoreRepaint(ignoreRepaint);
    }
     
    ------------------------------------
     
    setIgnoreRepaint(true);

    Vielen dank schonmal imvoraus =),

    grüße maik
     

  2. #2
    Matt297 Matt297 ist offline Mitglied Gold
    Registriert seit
    Oct 2008
    Beiträge
    181
    Du könntest das repaint einfach überschreiben und nur einmal ausführen, danach blocken, sowas in der Richtung wie:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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
     

  3. #3
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    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
     

  4. #4
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    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...
     

  5. #5
    Matt297 Matt297 ist offline Mitglied Gold
    Registriert seit
    Oct 2008
    Beiträge
    181
    Kannst du mal deinen Code hochladen? Dann lässt sich leichter herausfinden wo man ansetzen muss
     

  6. #6
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    joa ist halt mitten ausm programm rausgeholt jetzt, aber ist alles bei was man dafür brauch.. musst nur ne main() einfügen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    
     
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    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));
        }
    }
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  8. #8
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    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
     

  9. #9
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    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.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    
    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
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  10. #10
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    Hi,

    danke, ist jetzt alles so wie ichs brauche

    Grüße,

    Maik
     

Ähnliche Themen

  1. JFrame repaint durch anderen Thread blockiert
    Von Fabiian im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 19.10.10, 23:45
  2. Aus einem JFrame anderes JFrame starten
    Von maddos im Forum Java
    Antworten: 3
    Letzter Beitrag: 09.08.07, 12:24
  3. JFrame & paint - neues JFrame
    Von MRS im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 11
    Letzter Beitrag: 17.04.06, 23:39
  4. Ein JFrame aus einem anderem JFrame aufrufen!
    Von Lautsprecher im Forum Java
    Antworten: 1
    Letzter Beitrag: 14.11.05, 09:37
  5. Antworten: 2
    Letzter Beitrag: 07.09.05, 12:16