Rechtecke auf Bild zeichnen

Martwig

Mitglied
Hallo zusammen,
ich bitte zu verzeihen, dass es sich bei meinem ersten Post gleich um eine Frage handelt ;-).
Und zwar brauch ich Hilfe bei meinem aktuellen Problem.

Ich möchte gern Rechtecke auf ein Bild zeichnen. Allerdings habe ich keine Idee, wie ich das Zeichnen "ruckelfrei" hinbekomme. Das Rechteck verschwindet durch das "repaint" nach kurzer Zeit wieder, wenn ich mit dem Mauszeiger auf einer Stelle bleibe. Außerdem würde ich gern ein Rechteck, wenn es einmal gezeichnet wurde, nicht wieder löschen. Es sollen also mehrere Rechtecke gezeichnet werden können.

Java:
    public void mouseReleased(MouseEvent e) {
        Graphics gPaint = image.getGraphics();
        gPaint.drawRect(Rect.x, Rect.y, e.getX()-Rect.x, e.getY()-Rect.y);
    }

    public void mouseDragged(MouseEvent e) {
        Rect.width = e.getX()-Rect.x;
        Rect.height = e.getY()-Rect.y;
        thisPanel.repaint();
    }

public class myImagePanel extends JPanel {
        @Override
    protected void paintComponent (Graphics g) {
        super.paintComponent(g);
        if ((Rect!= null) && (image != null)) {
            Graphics gPaint = image.getGraphics();
            gPaint.drawRect(Rect.x, Rect.y, Rect.width, Rect.height);
        }
    }

Würde mich freuen wenn jemand einen Tipp hat!
Mario
 
Zuletzt bearbeitet:

Landei

Top Contributor
Wenn ich das richtig sehe, malst du nur auf das Graphics-Objekt vom Bild, nicht auf das übergebene Graphics g. Wahrscheinlich hilft schon ein g.drawImage(0, 0, image, null) oder so am Ende
 

Martwig

Mitglied
Danke für die Antwort. Was soll das "gPaint.drawImage(image,0, 0, null);" denn machen? Verstehe ich nicht so richtig. Wichtig wäre vll. auch noch zu erwähnen, dass es sich bei dem Bild um ein DisplayJAI handelt.
 

Martwig

Mitglied
Ich habe noch etwas rumgesucht und folgende Anleitung gefunden: Handbuch der Java-Programmierung, 5. Auflage

Das habe ich erst mal so übernommen. Nun ist mein Problem, dass ich die Rechtecke auf ein Bild zeichnen will, er sie aber darunter zeichnet. Ich würde mich freuen, wenn noch jemand eine Idee hat. Hier der Code:

Java:
    public void mousePressed(MouseEvent e) {
        paintRect= new Rectangle();
        paintRect.x=e.getX();
        paintRect.y=e.getY();
    }

    public void mouseReleased(MouseEvent e) {
       if (paintRect.width > 0 || paintRect.height > 0) {
         drawlist.addElement(paintRect); //private Vector drawlist
       }
       repaint();
     }

//...
    public void mouseDragged(MouseEvent e) {

       int x = e.getX();
       int y = e.getY();
       if (x > paintRect.x && y > paintRect.y) {
         paintRect.width = x - paintRect.x;
         paintRect.height = y - paintRect.y;
       }
       repaint();
     }



public class MyImagePanel extends JPanel {        
        @Override
     protected void paintComponent (Graphics g) {
         super.paintComponent(g);
         Rectangle r;
         Enumeration e;
         thisPanel.add(srcScrollPaneImage); //eine ScrollPane, die ein Bild "srcdj" enthält

         Graphics gTemp = srcdj.getGraphics(); //weil ich ja auf das Bild zeichnen will
         for (e = drawlist.elements(); e.hasMoreElements(); ) {
             r = (Rectangle)e.nextElement();
             gTemp.drawRect(r.x, r.y, r.width, r.height);
         }
         if (paintRect.x > 0 || paintRect.y > 0) {
            gTemp.drawRect(paintRect.x, paintRect.y, paintRect.width, paintRect.height);
        }
    }
}
Danke! Mario
 

André Uhres

Top Contributor
Wie der Name sagt, soll "paintComponent" die Komponente zeichnen und nicht noch eine Komponente hinzuzufügen.
Man könnte vielleicht zum Bildpanel eine Rechteckkomponente hinzufügen, die sich in Grösse und Position anpassen lässt.
 

Martwig

Mitglied
Hallo,
ich werde das mal versuchen. Mit dem Schreiben in die paintComponent()-Methode wollte ich vermeiden, dass die Rechtecke bei einem repaint gelöscht werden. Gibt es nicht so was wie eine durchsichtige Zeichenfläche, die ich auf mein Bild legen kann?

Danke,
Mario
 
Zuletzt bearbeitet:

Martwig

Mitglied
Ich habe mich etwas in JavaBeans eingelesen, komme aber trotzdem überhaupt nicht weiter. Ich brauche mehrere Rechtecke auf dem Bild. Geht das mit den Komponenten? Und wo soll ich die Rechtecke denn zeichnen, wenn nicht in der paint-Methode? Schließlich sollen sie ja nicht verschwinden, wenn das Fenster neu gezeichnet wird.
Ich würde mich freuen, wenn noch jemand einen Tipp für mich hätte.
Danke!
 

André Uhres

Top Contributor
Java:
/*
 * ImageMarker.java
 *
 * Benutzt die Klasse JComponentBounds:
 * http://wiki.byte-welt.net/wiki/JComponentBounds
 *
 * Hier wird ein "mainpanel" mit OverlayLayout benutzt. Darin sind ein "imagePanel"
 * und ein überlagertes "markerPanel". Die Methode "addMarker(markerPanel)" fügt
 * neue Marker hinzu.
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;

public class ImageMarker extends JFrame {

    private final static String FILENAME = "Picture1.jpg";
    private JPanel mainpanel;
    private Rectangle marker;
    private JLabel lbMarkerBounds;
    private JButton btAdd;
    private final JPanel markerPanel;

    public ImageMarker() {
        super("ImageMarker");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        mainpanel = new JPanel() {

            @Override
            public boolean isOptimizedDrawingEnabled() {
                return false;
            }
        };
        mainpanel.setLayout(new OverlayLayout(mainpanel));
        markerPanel = new JPanel(null);
        markerPanel.setOpaque(false);

        Picture imagePanel = new Picture(FILENAME);

        mainpanel.add(markerPanel);//zuerst den Marker Panel (vorne)
        mainpanel.add(imagePanel);//dann die Bildkomponente (hinten)

        add(new JScrollPane(mainpanel));
        lbMarkerBounds = new JLabel();
        add(lbMarkerBounds, BorderLayout.NORTH);
        btAdd = new JButton("Add Marker");
        btAdd.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {
                addMarker(markerPanel);
            }
        });
        add(btAdd, BorderLayout.SOUTH);
    }

    private void addMarker(final JPanel markerPanel) {
        final JLabel markerLabel = new JLabel();
        markerLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        markerLabel.setOpaque(true);
        markerLabel.setBackground(new Color(50, 50, 50, 50));
        markerLabel.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
        marker = new Rectangle(0, 0, 100, 100);
        int m = JComponentBounds.MARGIN;
        final JComponentBounds markerBounds = new JComponentBounds(markerLabel,
                marker.x - m, marker.y - m, true);
        markerBounds.setSize(marker.width + m * 2, marker.height + m * 2);
        markerPanel.add(markerBounds);
        markerBounds.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(final ComponentEvent e) {
                displayBounds();
            }

            @Override
            public void componentMoved(final ComponentEvent e) {
                displayBounds();
            }

            private void displayBounds() {
                marker = markerBounds.getComponentRect();
                lbMarkerBounds.setText(marker.toString());
            }
        });
        markerPanel.revalidate();
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                new ImageMarker().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}

class Picture extends JComponent {

    private BufferedImage image;
    private String filename;

    public Picture(String filename) {
        this.filename = filename;
    }

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            try {
                image = ImageIO.read(getClass().getResource(filename));
                setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
                revalidate();
            } catch (Exception ex) {
                System.out.println("Bild nicht gefunden: " + filename);
                image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
            }
        }
        Rectangle r = g.getClipBounds();
        g.drawImage(image, r.x, r.y, r.width + r.x, r.height + r.y,
                r.x, r.y, r.width + r.x, r.height + r.y, null);
    }

    public void setFilename(final String filename) {
        this.filename = filename;
        image = null;
        repaint();
    }
}
 

Martwig

Mitglied
Vielen, vielen... Dank! Ein Rundum-Sorglos-Packet habe ich jetzt echt nicht erwartet. Ich saß wirklich einige Tage an diesem Problem! :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ronbot77 JavaFX Rechtecke werden nicht neu gezeichnet AWT, Swing, JavaFX & SWT 8
J Rechtecke mittels getWidth AWT, Swing, JavaFX & SWT 1
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
M Rechtecke drehen AWT, Swing, JavaFX & SWT 15
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
3 2D-Grafik Rechtecke auf Bilder legen und auslesen AWT, Swing, JavaFX & SWT 4
P Kreise Rechtecke AWT, Swing, JavaFX & SWT 5
A Kollisionsabfrage schiefer Rechtecke AWT, Swing, JavaFX & SWT 5
D Rechtecke verschieben? AWT, Swing, JavaFX & SWT 2
N Autos (Rechtecke) in zufälligen Abständen von fahren lassen AWT, Swing, JavaFX & SWT 7
G Rechtecke beschriften AWT, Swing, JavaFX & SWT 3
F Zeichenbrett für Rechtecke mit Hindernissen AWT, Swing, JavaFX & SWT 17
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
E JavaFX Bild einfügen AWT, Swing, JavaFX & SWT 6
G paintComponents zerstückelt Bild AWT, Swing, JavaFX & SWT 0
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B JPanel und png-Bild AWT, Swing, JavaFX & SWT 2
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
C Bild in JFrame AWT, Swing, JavaFX & SWT 8
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
T Mit getSubimage ruckelt das Bild AWT, Swing, JavaFX & SWT 7
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
A Bild in JLabel skalieren AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
D Bild bewegen mit Tastendruck AWT, Swing, JavaFX & SWT 7
H Bild wird nicht angezeigt, Fehlercode unverständlich AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen


Oben