Großes Bild auf kleiner Fläche ausgeben?

Von: , Frage gestellt am Mo, 25. Jul 2005

Hi WWWler.
Ich habe ein Bild das ist größer als meine Bildschirmauflösung.
nun möchte ich dieses Bild in nem Fenster sagen wir 800x800 ausgeben, und rechts daneben noch Platz haben um ein paar Infos dazu auszugeben.
Das Bild sollte also mit Scrollbalken ausgestattet sein, damit ich da hin und herscrollen kann.

bisher gebe ich das Bild so aus (Methode Paint()):
g.drawImage(image,0,y_start,null);

Wenn das dann klappt, wie ist das mit den MouseListenern?
Ich will die Koordinaten ausgeben allerdings dann nicht die Physikalischen sondern die relativen koordinaten abhängig davon wie weit ich gescrollt habe.
Ich hoffe das war einigermaßen verständlich.

Gruß Wizard of War

10 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: Großes Bild auf kleiner Fläche ausgeben?

    Hallo,

    warum tust Du das Bild nicht in ein JLabel (als Icon) und dieses dann zum Betrachten in eine JScrollPane. Nur noch die PreferredSize gesetzt und fertig.

    Gruß

    Peter [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: Großes Bild auf kleiner Fläche ausgeben?

      Das klingt irgendwie als würde ich mir eine Mikrowelle kaufen und diese dann in nen Backofen stellen ;-)

      Kann ich nicht gleich die Grafik in das Jscrolldingsbums zeichnen?

      • Antwort von nach 2 Stunden 0 hilfreich
        Re^3: Großes Bild auf kleiner Fläche ausgeben?

        Das klingt irgendwie als würde ich mir eine Mikrowelle kaufen
        und diese dann in nen Backofen stellen ;-)

        Kann ich nicht gleich die Grafik in das Jscrolldingsbums
        zeichnen?
        Doch, fast, aber das macht die Microwelle viel besser!

        Versuchs mal und lass Dich überraschen.

        Gruß

        Peter

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: Großes Bild auf kleiner Fläche ausgeben?

          OK, ich habs jetzt probiert, aber es funzt noch nicht so wie ich das will hier ist mein bisheriger Code:

          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          public class test
          {
          public static void main( String args[]) {
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
          ImageIcon icon = new ImageIcon("BILD.JPG");
          JLabel jLabel_Map= new JLabel( icon );
          JScrollPane jScrP_Map = new JScrollPane( jLabel_Map );
          jScrP_Map.setPreferredSize(new Dimension(600, 400));
          frame.getContentPane().add( jScrP_Map);
          frame.pack();
          frame.show();
          }
          }
          

          Soweit so gut, jetzt wird das Bild in nem Scorllbereich angezeigt.
          Wie kriege ich nun meine restlichen Textareas, Buttons und Labels rechts daneben?
          Ausserdem scheint das NullLayout nicht bei Swing zu funzen :-(
          Wie soll ich denn jetzt meine Komponenten schön genau Platzieren?
          Dann möchte ich auf dem Bild auch rummalen können, und Cursorpositionen in den Textareas rechts daneben anzeigen lassen, aber nicht nur die absolute Cursorposition, sondern auch die relativ zum kompletten Bild (das ja nur Ausschnittsweise dargestellt wird).

          Wäre schön wenn du mir auch dabei helfen könntest.

          Gruß Wiz

        • Antwort von nach 2 Tagen 0 hilfreich
          Re^4: Großes Bild auf kleiner Fläche ausgeben?

          Soo, ich hab jetzt ein Borderlayerout.
          Im Zentrum die JScrollPane und im Osten ein normales Frame um meine Textareas anzuzeigen.

          Jetzt ist aber noch mein Problem, wie kriege ich einen Mouselistener an den blöden JScrollPane und wie kriege ich einen Actionlistener an den Frame dran?

          Gruß Wizard of War

          • Antwort von nach 2 Tagen 0 hilfreich
            Re^5: Großes Bild auf kleiner Fläche ausgeben?

            Wozu brauchst du das?

            Du machst folgendes

            JPanel p1 = new JPanel();
            p1.setLayout(new BorderLayout());
            JLabel lab = new JLabel( img );
            JScrollPane sp = new JScrollPane(lab);
            p1.add(sp, BorderLayout.CENTER);


            Dann solltest Du das Image sehen und wenn es größer ist als die angezeigte Fläche kommen automatisch die Scrollbars hinzu. Das Scrollen funktioniert auch schon.

            Die Listener bekommst Du dann, wenn Du die entsprechenden add-Methoden hast.
            xxx.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            tuEtwas();
            }
            });
            genauso mit dem MouseAdapter (statt Listener, damit Du nicht so viele Methoden überschreiben musst)
            xxx.addMouseListener(new MouseAdapter() {
            ...
            });

            Übrigens: Du darfst nie AWT und Swing Elemente mischen. (AWT liegt immer VOR den Swing)

            Gruß

            Peter


            Gruß

            Peter

            PS: es kann übrigens auch animierte gifs. [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

            • Antwort von nach 2 Tagen 0 hilfreich
              Re^6: Großes Bild auf kleiner Fläche ausgeben?

              Wozu brauchst du das?
              damit ich die Koordinaten des mauszeigers zur laufzeit in der Textfield ausgeben, und ich mit den Layouts nicht zufrieden bin und deshalb alles von Hand setze im NullLayout. Du machst folgendes

              JPanel p1 = new JPanel();
              p1.setLayout(new BorderLayout());
              JLabel lab = new JLabel( img );
              JScrollPane sp = new JScrollPane(lab);
              p1.add(sp, BorderLayout.CENTER);


              Dann solltest Du das Image sehen und wenn es größer ist als
              die angezeigte Fläche kommen automatisch die Scrollbars hinzu.
              Das Scrollen funktioniert auch schon.
              Jap, das funzt soweit schon... Die Listener bekommst Du dann, wenn Du die entsprechenden
              add-Methoden hast.
              genauso mit dem MouseAdapter (statt Listener, damit Du nicht
              so viele Methoden überschreiben musst)
              xxx.addMouseListener(new MouseAdapter() {
              ...
              });
              Irgendwie klappt das nicht

              jScrP_Map.addMouseListener(new MouseAdapter() {
              public void MouseClicked(MouseEvent e){
              e.consume();
              x_bild = e.getX();
              y_bild = e.getY();
              System.out.println(x_bild+","+y_bild);
              };
              });
              

              Bisher bin ich es immer gewohnt einen Frame zu benutzen, diesen Frame im public meineKlasse() mit this zu verknüpfen und dann einfach zu schreiben:
              addMouseMotionListener(this);
              dann kann ich alle MouseMotion Events in extra Methoden abfragen und das hat bisher geklappt aber dies will alles bei Swing nicht so klappen :-(

              Ich starte mit public class meineKlasse extends JFrame implements ActionListener, MouseListener, MouseMotionListener

              Und dann erwartet java natürlich sämtliche ListenerMethoden, ansich kein Problem.
              Aber mit deinem Codeschnipsel definiere ich ja den Mouseclicked Event in der main Funktion und da macht er nicht mit, weil er das global erwartet.
              Und wenn der Global da ist dann wird der nicht erreicht und selbst das was ich oben schreibe wird nicht ausgeführt irgendwie :-( Übrigens: Du darfst nie AWT und Swing Elemente mischen. (AWT
              liegt immer VOR den Swing)
              Hmm, muss ich aber, es sei denn du sagst mir wie ich bei Swing Objekte Punktgenau platzieren kann, dann nehme ich von mir aus auch den AWT-Panel raus der jetzt noch rechts neben meinem Scrollpane liegt. Gruß

              Peter
              Vielen Dank für deine Mühe!
              Gruß Wizard of War

            • Antwort von nach 2 Tagen 1 hilfreich
              Re^7: Großes Bild auf kleiner Fläche ausgeben?

              Wozu brauchst du das?
              damit ich die Koordinaten des mauszeigers zur laufzeit in der
              Textfield ausgeben, und ich mit den Layouts nicht zufrieden
              bin und deshalb alles von Hand setze im NullLayout.
              Igitt, besser einmal ein gutes richtiges Layout gemacht als mit einem Null-Layout gearbeitet. Ich habe früher Kundendialoge so zusammengebaut und immer wieder kamen wünsche wie: alles etwas enger/weiter zusammen, Text und Label etwas verrücken. Da wird man wahnsinnig mit der Zeit. Du machst folgendes

              JPanel p1 = new JPanel();
              p1.setLayout(new BorderLayout());
              JLabel lab = new JLabel( img );
              JScrollPane sp = new JScrollPane(lab);
              p1.add(sp, BorderLayout.CENTER);


              Dann solltest Du das Image sehen und wenn es größer ist als
              die angezeigte Fläche kommen automatisch die Scrollbars hinzu.
              Das Scrollen funktioniert auch schon.
              Jap, das funzt soweit schon... Die Listener bekommst Du dann, wenn Du die entsprechenden
              add-Methoden hast.
              genauso mit dem MouseAdapter (statt Listener, damit Du nicht
              so viele Methoden überschreiben musst)
              xxx.addMouseListener(new MouseAdapter() {
              ...
              });
              Irgendwie klappt das nicht
              Ich glaube, das war noch was. Mach mal addToolTipText(""); Da war was mit der Initialisierung komisch. Da musste man erst den ToolTip setzen.

              jScrP_Map.addMouseListener(new MouseAdapter() {
              public void MouseClicked(MouseEvent e){
              e.consume();
              x_bild = e.getX();
              y_bild = e.getY();
              System.out.println(x_bild+","+y_bild);
              };
              });
              

              Bisher bin ich es immer gewohnt einen Frame zu benutzen,
              diesen Frame im public meineKlasse() mit this zu verknüpfen
              und dann einfach zu schreiben:
              addMouseMotionListener(this);
              dann kann ich alle MouseMotion Events in extra Methoden
              abfragen und das hat bisher geklappt aber dies will alles bei
              Swing nicht so klappen :-(
              Geht eigentlich genauso.
              Ich starte mit public class meineKlasse extends JFrame
              implements ActionListener, MouseListener, MouseMotionListener

              Und dann erwartet java natürlich sämtliche ListenerMethoden,
              ansich kein Problem.
              Aber mit deinem Codeschnipsel definiere ich ja den
              Mouseclicked Event in der main Funktion und da macht er nicht
              mit, weil er das global erwartet.
              Und wenn der Global da ist dann wird der nicht erreicht und
              selbst das was ich oben schreibe wird nicht ausgeführt
              irgendwie :-(
              in die main-Funktion gehötr nichts ausser: MeineAnwendung xxx = new MeineAnwendung();
              Der Rest gehört in den Konstruktor.
              Bei mehreren Konstruktoren sind dies hierarchisch geordnet. Übrigens: Du darfst nie AWT und Swing Elemente mischen. (AWT
              liegt immer VOR den Swing)
              Hmm, muss ich aber, es sei denn du sagst mir wie ich bei Swing
              Objekte Punktgenau platzieren kann, dann nehme ich von mir aus
              auch den AWT-Panel raus der jetzt noch rechts neben meinem
              Scrollpane liegt.
              Das geht genauso wie beim AWT.
              Dass ein JFrame auf die ContentPane malt hast Du ja offensichtlich schon rausbekommen. Den Listener zum Öffnen und Schließen machst Du mit setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
              Die ContentPane hat als LayoutManager das BorderLayout und das JPanel das FlowLayout(FlowLayout.CENTER))

              Viele Grüße

              Peter

              PS: ein gutes Buch über Swing Oberflächen ist D. Geary: Mastering the AWT (Swing) Bd 2. (Bd 1 geht über das alte AWT) Gruß

              Peter
              Vielen Dank für deine Mühe!
              Gruß Wizard of War

            • Antwort von nach 6 Tagen 0 hilfreich
              Re^8: Großes Bild auf kleiner Fläche ausgeben?

              in die main-Funktion gehötr nichts ausser: MeineAnwendung xxx
              = new MeineAnwendung();
              Der Rest gehört in den Konstruktor.
              Bei mehreren Konstruktoren sind dies hierarchisch geordnet.
              Das war es, ich hatte ein Beispiel für JFrames aus dem Buch "Java ist auch eine Insel" abgeschrieben und da haben die alles in der Main() gemacht.
              Nachdem das Zeugs nun endlich wieder im Konstruktor steht, funzt das ganze!

              Vielen lieben Dank!

              Gruß Wizard of War



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!