Zeichnen auf ein Bild und Scrollen

Status
Nicht offen für weitere Antworten.

knl

Mitglied
Moin,

Ich möchte in meinem Programm ein Bild karte.png anzeigen lassen, welches allerdings größer als das Fenster ist. Außerdem möchte ich Striche usw darauf zeichnen können.

Um es mit Scrollbars anzeigen zu lassen, habe ich es als ImageIcon in ein JLabel gestackt und dann mit einem JScrollpane angezeigt, was auch wunderbar funktioniert hat. Allerdings weiß ich nun nicht, wie ich darauf zeichnen kann. Ich kenne mich nicht gut mit dieser paint geschichte aus und möchte wissen, wie ich es am besten anstelle, dass ich auf dieser Karte jetzt beispielsweise Wege einzeichnen kann. Eignet sich vielleicht ein JPanel besser dafür? Aber wie kann ich Zeichnungen hinzufügen?
 

Marco13

Top Contributor
Wenn du das Bild als BufferedImage mit ImageIO lädst und selbst in ein JPanel zeichnest, kannst du dir auch mit [c]bufferedImage.getGraphics()[/c] das Graphics des Bildes holen und dort reinzeichnen.
 

knl

Mitglied
Edit: Jetzt habe ich es geschafft, die Karte immerhin anzuzeigen :D Mein Problem ist jetzt nur noch, wie ich so etwas wie ein inline Frame in HTML hinkriege - die Karte soll also in einem Fenster fester Größe mit Scrollbalken angezeigt werden. Habe schon mit JScrollPane herumgespielt, wie unten zu sehen, aber kein vernünftiges Ergebnis bekommen.
Meine Frage ist also, wie ich ein JScrollPane mit fester Größe positioniere, in dem wiederum ein JPanel inklusiv Bild angezeigt wird, auf dem herumgemalt werden kann.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Karte extends JFrame {

  Image karte_img = Toolkit.getDefaultToolkit().getImage("karte.png");
  JPanel karte = new JPanel();
  JScrollPane scroll_karte = new JScrollPane(karte);

  public Wegfehler(String title) {
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 800;
    int frameHeight = 700;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    karte.setPreferredSize(new Dimension(200,200));
    cp.add(scroll_karte);

    setResizable(false);
    setVisible(true);
  }
  
  public void paint(Graphics g){
    g.drawImage(karte_img,0,0,karte);
  }
  
  public static void main(String[] args) {
    new Wegfehler("Wegberechnung");
  }
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor

1. Was ist der Unterschied zwischen BufferedImage, Image und ImageIcon? Was soll ich benutzen?

Ein BufferedImage ist (STARK vereinfacht gesagt) ein Image, das mehr Manipulationsmöglichkeiten bietet - unter anderem, etwas in das Bild reinzuzeichnen... Ein ImageIcon ist eine Component, die "Automatisch" ein Image zeichnet, sich an dessen Größe anpasst usw. - ist aber für deine Zwecke vermutlich weniger geeignet.

2. Worin soll ich es zeichnen? JPanel?
Jo...
3. Wie zeiche ich es dort rein? Mit g.drawImage()?
Hmhm.

Mein Versuch sieht so aus, es wird allerdings nichts angezeigt:

Das kann damit zusammenhängen, dass du setLayout(null) gemacht (und dem DrawingPanel keine Größe gegeben) hast... Sollte man nicht machen

Java:
// For [url]http://www.java-forum.org/allgemeine-java-themen/89491-zeichnen-auf-ein-bild-und-scrollen.html#post565765[/url]

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

public class Karte extends JFrame {

  BufferedImage karte_img = null;
  DrawingPanel karte = null;

  public Karte(String title)
  {
    super(title);

    try
    {
        karte_img = ImageIO.read(new File("image.jpg"));
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }


    Graphics g = karte_img.getGraphics();
    g.drawString("Auf das Bild geschrieben und gemalt", 10, 10);
    g.fillOval(30,30,10,10);


    karte = new DrawingPanel(karte_img);

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 800;
    int frameHeight = 700;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    cp.add(karte);
    karte.setBounds(0,0,karte_img.getWidth(), karte_img.getHeight());

    setResizable(false);
    setVisible(true);
  }

  public static void main(String[] args) {
    new Karte("Wegberechnung");
  }
}

class DrawingPanel extends JPanel{
  Image img;
  DrawingPanel(Image img){
    this.img = img;
  }
  public void paintComponent(Graphics g){
    super.paintComponent (g);
    g.drawImage(img,0,0,this);
  }
}
 

knl

Mitglied
Danke für deine Antwort, so schnell habe ich damit nicht gerechnet :D Ich habe meinen vorigen Post editiert, mein Bild nun zwar angezeigt wird, mir allerdings der Scrollbalken fehlt <.<
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Man sollte NICHT in der paint-Methode eines JFrames rumpfuschen - mach' es so wie vorher, mit dem DrawingPanel, das war schon gut. Für die Scrollsache:

Java:
// In der DrawingPanel getPreferredSize überschreiben:

class DrawingPanel extends JPanel{
  Image img;
  DrawingPanel(Image img){
    this.img = img;
  }

  public Dimension getPreferredSize()
  {
     return new Dimension(img.getWidth(), img.getHeight());
  }


  public void paintComponent(Graphics g){
    super.paintComponent (g);
    g.drawImage(img,0,0,this);
  }
}


// Beim Hinzufügen zur ContentPane: (Du solltest dir unbedingt 
// LayoutManager ansehen - im Speziellen sollte man fast nie 
// das "null"-Layout verwenden....

    //cp.setLayout(null); // WEG
    //cp.add(karte); // WEG

    JScrollPane sp = new JScrollPane(karte);
    cp.setLayout(new GridLayout(1,1));
    cp.add(sp);
 

knl

Mitglied
Ok, danke für deine Hilfe, die Karte wird jetzt fensterfüllend und mit Scrollbalken angezeigt, da sie ziemlich groß ist. Wie kann ich aber nun die Größe des ScrollPanes ändern? wenn ich
Java:
scroll_karte.setPreferredSize(karte.getPreferredSize());
benutze, wird das gesamte Fenster benutzt - und bei
Java:
scroll_karte.setBounds(20,20,500,500);
auch - nur ohne Scrollbalken !
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Habe ein svg bild, kann ich das zu svg koordinaten umrechnen, damit ich den Umriss zeichnen kann? Wenn ja wie? Allgemeine Java-Themen 1
G Bild neu zeichnen Allgemeine Java-Themen 13
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
F Linie zeichnen Allgemeine Java-Themen 35
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
P Zeichnen Allgemeine Java-Themen 18
S Best Practice Diagramm zeichnen Allgemeine Java-Themen 0
C Tortendiagramm zeichnen Allgemeine Java-Themen 3
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
D Baum zeichnen hilfe Allgemeine Java-Themen 4
B Zeichnen einer verschiebbaren Linie Allgemeine Java-Themen 3
I 2D-Grafik Polygon mit Double Werten zeichnen Allgemeine Java-Themen 4
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
E Tool/Programm zum Zeichnen von UML Diagrammen Allgemeine Java-Themen 14
F 2D-Grafik drawString (scharf zeichnen lassen) Allgemeine Java-Themen 13
J Teil eines Image/ImageIcon zeichnen Allgemeine Java-Themen 2
D Lösung Differentialgl. mit RungeKutta + Kurve zeichnen Allgemeine Java-Themen 3
U Zeichnen mit JFrame. Allgemeine Java-Themen 5
lenniii zeichnen Allgemeine Java-Themen 2
N Tepich zeichnen Allgemeine Java-Themen 8
S Problem mit Zeichnen Allgemeine Java-Themen 8
L Buffered Image teilweise zeichnen Allgemeine Java-Themen 6
B Tool zum Zeichnen von Systemarchitektur Allgemeine Java-Themen 2
MasterEvil Lib zum zeichnen von Baumdiagrammen? Allgemeine Java-Themen 4
O TimeSeriesChart Linien Fetter Zeichnen Allgemeine Java-Themen 2
B Programmablaufgraph erstellen und zeichnen Allgemeine Java-Themen 2
H Sinusähnliche Kurve mit Paint zeichnen! Allgemeine Java-Themen 3
E Pixelweise auf einem JPanel/JLabel o.ä. zeichnen Allgemeine Java-Themen 4
L Linien, Recktecke und Elipsen zeichnen ohne Image Allgemeine Java-Themen 2
R Grafiken. direkt zeichnen Allgemeine Java-Themen 5
S Auf vorhandenes Window zeichnen? Allgemeine Java-Themen 2
G BufferedImage zeichnen Allgemeine Java-Themen 4
S Vierecke zeichnen Allgemeine Java-Themen 18
T Rechtecke usw mit Paint auf Panel zeichnen Allgemeine Java-Themen 5
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
J Fenster mit paint Methode selbst zeichnen Allgemeine Java-Themen 3
A Zeichnen mit JAVA ! Allgemeine Java-Themen 3
T Linien-Diagramm zeichnen Allgemeine Java-Themen 9
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
OnDemand Prüfen ob Bild defekt ist Allgemeine Java-Themen 4
Y Bild in JPanel setzen Allgemeine Java-Themen 2
Kirby.exe Bild im Zentrum spiegeln Allgemeine Java-Themen 14
I Apache POI Bild in Word ersetzen Allgemeine Java-Themen 15
OnDemand Bild prüfen ob defekt Allgemeine Java-Themen 3
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
K Bild in einem anderen Bild suchen Allgemeine Java-Themen 12
R Compiler-Fehler Bild per E-Mail versenden Allgemeine Java-Themen 3
M Java- Bild gewissen Anzahl von Sekunden anzeigen?! Allgemeine Java-Themen 4
RalleYTN 2D-Grafik Bild mit bilinearer Interpolation skalieren Allgemeine Java-Themen 31
RalleYTN 2D-Grafik Bild ohne AWT, Swing und JavaFX rotieren Allgemeine Java-Themen 12
S Telefonbuch mit Bild Allgemeine Java-Themen 4
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
T Neuen Kanal in Bild (TIFF) einfügen à la Photoshop Allgemeine Java-Themen 2
Z Zahlen aus Bild auslesen Allgemeine Java-Themen 1
X Bild -> lokale Variable -> DB -> lokale Variable Allgemeine Java-Themen 3
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
R HtmlUnit: Canvas als Bild speichern Allgemeine Java-Themen 0
E am häufigsten vorkommenden Farben aus einem Bild Allgemeine Java-Themen 5
S Bild in Raster Allgemeine Java-Themen 1
S Bild in Frame Allgemeine Java-Themen 0
F Punkte in einem Bild finden Allgemeine Java-Themen 10
A Bild aufteilen für getData Allgemeine Java-Themen 3
P Wie füge ich ein Bild in die GUI ein? Allgemeine Java-Themen 7
F ImageJ: Linien und Schnittpunkte in Bild Allgemeine Java-Themen 1
A mit getClassLoader Bild laden Allgemeine Java-Themen 8
E Bild abspeichern Allgemeine Java-Themen 5
D Face.com - Gesicht im Bild finden Allgemeine Java-Themen 3
N Input/Output Bild von WebSite laden? Allgemeine Java-Themen 3
A Input/Output Bild in Java einlesen und analysieren! Allgemeine Java-Themen 8
S programm um bild auszulesen Allgemeine Java-Themen 2
R Bild offenbar zu groß um geladen zu werden? Allgemeine Java-Themen 12
K Quadrat in einem Bild erkennen Allgemeine Java-Themen 33
B Bild verschieben Allgemeine Java-Themen 6
T Bild in jar Paket einbinden Allgemeine Java-Themen 9
D Bild Typ bestimmen Allgemeine Java-Themen 9
0 2D-Grafik Bild einfärben Allgemeine Java-Themen 8
A Bild zusammenbauen! Allgemeine Java-Themen 5
A Bild von Webcam aufzeichnen Allgemeine Java-Themen 14
V 2D-Grafik Bild transparent machen. Allgemeine Java-Themen 4
H Bild einscannen und speichern Allgemeine Java-Themen 29
E Bild mit Listener einfügen Allgemeine Java-Themen 3
B Bild in String einbauen? Allgemeine Java-Themen 3
C Bild auf HDD speichern Allgemeine Java-Themen 4
X Bild aus dem Netz von URL runterladen und in GUI einbinden. Allgemeine Java-Themen 3
F Bild (Point) mit scrollen lassen Allgemeine Java-Themen 5
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
B Bild- und Texterkennung Allgemeine Java-Themen 4
S Tracing eines Bildes (a.ka. Bild vektorisieren)..? Allgemeine Java-Themen 2
destroflyer *.dds-Bild anzeigen Allgemeine Java-Themen 12
F Bild aus externer Quelle laden und Skalieren? Allgemeine Java-Themen 11
X Bild im Memory zwischen speichern Allgemeine Java-Themen 11
R JAI - RGB Bild in 3 Einzelbilder zerlegen Allgemeine Java-Themen 4
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
A Möglichkeiten, ein Bild schnell auszuwerten Allgemeine Java-Themen 56
D Java Thread, Bild wird nur am Ende gezeichnet Allgemeine Java-Themen 5
data89 Barcodes in Bild erkennen Allgemeine Java-Themen 17
S Bild anhand von Koordinaten einteilen Allgemeine Java-Themen 7
K Transparente Bilder in Bild positionieren und speichern. Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben