Großes Bild auf kleiner Fläche ausgeben?

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

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]

Das klingt irgendwie als würde ich mir eine Mikrowelle kaufen und diese dann in nen Backofen stellen :wink:

Kann ich nicht gleich die Grafik in das Jscrolldingsbums zeichnen?

Das klingt irgendwie als würde ich mir eine Mikrowelle kaufen
und diese dann in nen Backofen stellen :wink:

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

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 :frowning:
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

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

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]

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 :frowning:

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 :frowning:

Ü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

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 :frowning:

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 :frowning:

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

1 „Gefällt mir“
 jScrP\_Map.addMouseListener(new MouseAdapter() {
 public void MouseClicked(MouseEvent e){

Hier liegt der Hund begraben. Methoden sollte man deswegen immer klein schreiben :smile:
public void mouseClicked(MouseEvent e) ist ok. So hast du einfach eine Methode in den Adapter verfrachtet, die er jedoch nie ruft.

 e.consume();

Sollte man als letztes machen… aber nur wenn wirklich keiner mehr drauf hören soll und du das Standardverhalten aushebeln wills.

Michael

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