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