Applet mit Backgroundimage und Vordergrundelementen

Status
Nicht offen für weitere Antworten.

Prusik

Aktives Mitglied
Hallo zusammen

In einem Projekt haben wir ein Problem mit einem Applet. Das Applet soll im Hintergrund ein Stadtplan(winterthur_altstadt.JPG) anzeigen, darauf sind verschiedene anklickbare Objekte vorhanden. Das Bild einzeln einzufügen ist kein Problem. Nun möchten wir jedoch ein klickbares Element (Button beispielsweise) dazufügen.


Code:
public class Stadtplan extends JApplet {
    public void init() {
        this.setSize(1075,861);
        JLabel label = new JLabel(new ImageIcon("winterthur_altstadt.JPG"));
        Button but = new Button();
        but.setBackground(Color.YELLOW);
        Panel panel = new Panel();
        panel.add(label);
        this.getContentPane().add(panel);  

        but.setSize(10, 10);
        // auch mit but.setMaximumSize(new Dimension(10,10));
        this.add(but);
        
    }
}


Hier haben wir das Problem, dass der Button das ganze Appletfenster füllt, obwohl wir die grösse auf 10,10 beschränkt hatten.
Wenn wir das Bild über das Graphics-Objekt einfügen, ist der Button dann hinter dem Bild, und somit nicht sichtbar.

Vielen Dank für eure Tipps!
 

L-ectron-X

Gesperrter Benutzer
Das Hintergrundbild musst du entweder im JApplet oder in einem darin eingebetteten JPanel in dessen paintComponent()-Methode mit der drawImage()-Methode zeichnen.
Dann kannst entweder die Punkte zum Anklicken in einer Koordiatenberechnung festlegen und dann die Mausposition überwachen (Beispiel), oder JLabels oder JButtons an bestimmten Koordinaten positionieren.
 

Quaxli

Top Contributor
Mein Tipp: Laß die Buttons weg und ermittle die angeklickte Region einfach über den Punkt, den Dir MouseEvent.getPoint() liefert.

Die Karte zeichnest Du, wie schon von L-ectron-X beschrieben in der paintComponent-Methode.

Um das angeklickte Objekt zu ermitteln schlage ich zwei Methoden vor:

1. Die Einfache:

Du ermittelst die Koordinaten von kleinen Rechtecken auf Deinem Bild. Diese definierst Du als Klassenvariable vom Typ Rectangle und prüfst mit der Methode Rectangel.contains(..) ob der Mausklick innerhalb eines der vordefinierten Rechtecke ist und führst dann die geplante Aktion aus.

2. Die Schwierigere:

Du malst Dir eine "Schattenkarte". Die relevanten Punkte färbst Du mit unterschiedlichen Farben ein (z. B. Rathaus = gelb, Schule = rot, usw.) und färbst den Rest der Karte schwarz. Diese Bild lädst Du gleich am Anfang mit und hälst es als Objekt "im Hintergrund" - soll heißen im Speicher. Diese Schattenkarte wird niemals angezeigt!

Wenn jetzt Deine "richtige" Straßenkarte angeklickt wird, ermittlest Du den Farbwert des angeklickten Punktes von der "Schattenkarte" und führst je nach Farbwert die entsprechende Aktion aus.

Diese Methode ist etwas komplexer umzusetzen, aber dafür ist sie genauer, wenn es z. B. auf 2 Bereiche ankommt, die sehr nahe bei einander liegen, so daß man keine oder nur sehr kleine Rechtecke definieren könnte. Oder wenn Du z. B. sehr unterschiedlich geformte Bereiche hast, z. B. einen Fluß ermitteln willst.
 

Wildcard

Top Contributor
Wofür gibt es das Shape Interface und Polygone?
Um Rechenleistung zu sparen erst einen Bounding Box Test durchführen, dann fallen die meisten Polygone von Anfang an raus.
 

Quaxli

Top Contributor
Tja, wofür? Das frage ich mich auch. ;)

Prusik hat ja leider nicht genau gesagt, was er vorhat. Wenn es relativ einfache Bereiche sind, sind Polygone sicherlich sinnvoll. Wenn es komplexere Strukturen sind (ein Fluß) fände ich es eher umständlich ein Polygon zusammen zu frickeln.
Ist aber zugegebenermaßen eine persönliche Vorliebe. :)
 

Prusik

Aktives Mitglied
das mit dem Rathaus, der Schule, der Bibliothek, der Kirche, dem Kino und dem Bahnhof... (nicht vollständig), aber sind doch zählbar und nicht sehr kompliziert... Sonst könnten wir ja auch keinen Button darüber legen... also wir dachten uns das auch so, dass auf dem Bild die Punkte zu sehen sind - von dem her ist es ja schwieriger einen Bach zu nehmen, da man sonst gerade die ganze Stadt anmalen kann... Wobei so mit "onmouseover" wäre natürlich auch nicht schlecht.. also, wenn man mit der Maus über die Stadt fährt, sieht man die verschiedenen Objekte, die man anklicken kann... Heia.. ich habe viele Ideen, aber irgendwie fehlt mir die Technik...
Auf jeden Fall danke für die vielen Tipps, die ihr mir bis jetzt gegeben habt! Wir werden uns mal mit den verschiedenen Vorschlägen auseinandersetzen... Und das mit den Polygonen tönt jetzt für mich sehr angenehm, da mir das irgendwie bekannt vor kommt, wenn es so was ist wie hier: http://de.selfhtml.org/html/grafiken/verweis_sensitive.htm
 

Wildcard

Top Contributor
Im Prinzip das gleiche, nur kannst du mit Polygonen feiner Auflösen als mit Rechtecken.
Den Cursor zu ändern wenn er über einem 'hotspot' liegt ist eher trivial (Stichwort Shape#contains(Point))
 

Prusik

Aktives Mitglied
verstehe ich das richtig:
- Klasse die Shape implementiert, z.B. Polygon
- MouseListener, der bei jeder Mausbewegung überprüft, ob man "auf" einem Shape ist (contains(kord_x,kord_y)==true, bzw. bei Mausklick)
- (Hintergrund)-Bild mit g.getGraphics(..) gezeichnet

EDIT:
also folgende Klassen, die ich bastle:

Stadtplan (Hintergrundbild, Polygone definieren)
--> MouseAction (Bei Mausaction --> über Polygon?)
 

Wildcard

Top Contributor
Soweit richtig, bis auf getGraphics. Gezeichnet wird in paintComponent (Swing) bzw. paint (AWT).
 

Prusik

Aktives Mitglied
ihr seit super! es funktioniert!

Habe gerade noch eine Frage, die mit dem hier zusammenhängt:
Jetzt sieht es so aus:

Code:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class StadtPlanWinterthur extends Applet {

    String adr_stadtplan;
    Image pic;
    Polygon polytest;

    @Override
    public void init() {
       //MouseListener dazufügen
       this.addMouseListener(new myMouseListener());
       //Grösse festlegen
       this.setSize(555, 394);
       //Stadtplan laden
       adr_stadtplan="stadtplan_winterthur.jpg";
       pic = getImage(getCodeBase(),adr_stadtplan);

       //Polygon mit Eckpunkten definieren
       polytest = new Polygon();
       polytest.addPoint(0, 0);
       polytest.addPoint(0, 100);
       polytest.addPoint(100, 100);
       polytest.addPoint(100, 0);
       

       
    }

    @Override
    public void paint(Graphics g) {
        //Bild zeichen
        g.drawImage(pic, 0,0,this);        
    }
    
    class myMouseListener implements MouseListener{

        public void mouseClicked(MouseEvent e) {

              if(polytest.contains(e.getX(), e.getY())){
                  JFrame fenster = new JFrame("Testfenster");
              }
        }

        
    }
    


}
Nun meine Frage: jetzt will ich nicht nur ein Polygon speichern, sondern eine ganze Menge. Das gibt einen ziemlich langen und unübersichtlichen Code, wenn ich oben jedes Polygon initalisiere, unten im MouseListener für jedes Polygon eine if abfrage machen muss. Und wirklich objektorientiert ist das ja nicht, hab ich das Gefühl.
Nur stellt sich die frage, wie mach ich es besser?

Nun hab ich mir gedacht, ich mach eine Liste, in der alle polygone gespeichert sind. Danach finde ich problemlos raus, ob sich die Maus über einem Polygon befindet - doch nun, jedes Objekt macht ja was anderes - wie kann Beispielsweise jetzt beim einen ein Fenster öffnen, beim anderen ein Soundclip abspielen lassen, das müsste man ja irgendwie in die Liste speichern, denn sonst ist man ja wieder bei den if-Abfragen für jedes einzelne Objekt.
Ich hoffe ihr versteht, was ich mein und könnt mir einen Tipp geben.
 

Wildcard

Top Contributor
Eine möglichkeit wäre eine Klasse zu definieren, der man ein Polygon und eine Action setzen kann. Wenn ein Mausklick registriert wird, führt das Objekt die übergebene Action aus.
 

Prusik

Aktives Mitglied
hm... das versteh ich jetzt ehrlich gesagt nicht ganz....

ich versuchs mal so zu machen, wie ich das verstehen würde:

Der StadtPlanWinterthur-Klasse wird eine ArrayList von MouseClickPolygon dazugefügt, oke.. Die klasse MouseClickPolygon sähe etwa folgendermasen aus
Code:
class MouseClickPolygon{
     Polygon poly;

     //Konstruktor

     //Setter/Getter Methoden

}

aber wie speicher ich jetzt da die Action??
 

Prusik

Aktives Mitglied
hm entweder bin ich jetzt blöd oder weiss auch nicht.. auf jeden fall krieg ichs nicht hin...

also ich hab die Klasse MouseClickPolygon geschrieben:

Code:
import java.awt.Desktop.Action;
import java.awt.Polygon;

public class MouseClickPolygon {
    private Polygon polygon;
    private Action action;
    public MouseClickPolygon(){
        polygon = new Polygon();
    }
    
    public void setQuadratPoly(int x_oben, int y_oben, int x_unten, int y_unten){
        getPolygon().addPoint(x_oben, y_oben);
        getPolygon().addPoint(x_oben, y_unten);
        getPolygon().addPoint(x_unten, y_oben);
        getPolygon().addPoint(x_unten, y_unten);
    }

    public Polygon getPolygon() {
        return polygon;
    }

    public void setPolygon(Polygon polygon) {
        this.polygon = polygon;
    }

    public Action getAction() {
        return action;
    }

    public void setAction(Action action) {
        this.action = action;
    }
    
    
    

}

und nun rufe ich das in StadtPlanWinterthur2 auf:

Code:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Action;


public class StadtPlanWinterthur2 extends Applet {

    String adr_stadtplan;
    Image pic;
    Polygon polytest;
    MouseClickPolygon kirche;

    @Override
    public void init() {
       this.addMouseListener(new myMouseListener());
       this.setSize(555, 394);
       adr_stadtplan="stadtplan_winterthur.jpg";
       pic = getImage(getCodeBase(),adr_stadtplan);
       
[b]       kirche = new MouseClickPolygon();
       kirche.setQuadratPoly(0, 0, 100, 100);
       kirche.setAction(new Action(System.out.println("Hallo")));[/b]
       
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(pic, 0,0,this);   
    }

    


}

irgendwie hab ich das gefühl das ich etwas nicht verstande habe mit der action!
Er sagt auch javax.swing.Action sei abstrakt, und ich es daher nicht instanziieren soll...
 

Prusik

Aktives Mitglied
sorry für den Doppelpost.. aber wir stecken fest...

Wir haben schonmal festgestellt, dass es nicht das Interface Action ist, welches wir benutzen... Also müsste es doch das hier sein
http://java.sun.com/javase/6/docs/api/java/awt/Desktop.Action.html

richtig?

Nur wie wendet man das an? Ich kann bei bestem Willen kein Beispiel finden (google, java api). Habe noch nie mit enum-Typen gearbeitet, glaube das ist sowas...

Vielen Dank für eure Hilfe!
 

Prusik

Aktives Mitglied
sorry für den Doppelpost, aber ich möchte gerne noch die Lösung präsentieren, die ich gefunden habe, falls jemand ein ähnliches Probelm haben sollte.

Das mit der Action hab ich nicht hingekriegt, ich habs jetzt anders gelöst:

In der Klasse StadtPlanWinterthur.java speichere ich eine Liste von BuildingAction
Code:
   private List<BuildingAction> buildings;


BuildingAction ist eine abstrakte Klasse:
Code:
public abstract class BuildingAction {
   private Polygon mypoly;

    public Polygon getMypoly() {
        return mypoly;
    }
    
   public void setMypoly(Polygon mypoly) {
        this.mypoly = mypoly;
    }   
    
    public abstract void toDoWhenClicked();
    public abstract void PolygonSetzen();  
}

Nun erstelle ich für jedes Building eine Klasse, die gezwungen ist, anzugeben, was auszuführen ist, und wie das Polygon aussieht.

Code:
public class buildBahnhofAction extends BuildingAction{
    public buildBahnhofAction(){
        setMyPoly();
    }
    
    @Override
    public void toDoWhenClicked() {
        System.out.println("Bahnhof");
        //...
    }

    @Override
    public void PolygonSetzen() {
        Polygon poly = new Polygon();
        poly.addPoint(204, 244);
        poly.addPoint(104, 416);
        poly.addPoint(157, 432);
        poly.addPoint(248, 253);
        
        setMypoly(poly);
        
    }



}

Jetzt kann ich im MouseListener einfach durch die Liste durchgehen und die Action ausführen lassen:
Code:
 class myMouseListener implements MouseListener{
        public void mouseClicked(MouseEvent e) {            
            for(BuildingAction ba : buildings){
                if(ba.getMypoly().contains(e.getX(), e.getY())){
                    ba.toDoWhenClicked();
                }
            }
        }

    }
Manchmal ist die Lösung einfacher als die Frage ;) Wir haben haben uns in der Schule wirklich mehrere Lektionen damit rumgequält, wie man das jetzt lösen müsste... so einfach gehts... wenn man die Idee hat...

Vielen Dank an alle, die uns hier geholfen haben...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Applet: com.sun.deploy.security.BlockedException :-( Tools - Maven, Gradle, Ant & mehr 0
M Applet Applet legt Browser lahm Tools - Maven, Gradle, Ant & mehr 3
J Applet Aus anderer Browserinstanz Applet abfragen Tools - Maven, Gradle, Ant & mehr 2
P Linux Applet/Webstart Schriftunterschiede Tools - Maven, Gradle, Ant & mehr 3
E JMol -Applet Einbindung Tools - Maven, Gradle, Ant & mehr 0
T Applet Applet und IText wirft Incompatible magic value 1008813135 Fehler Tools - Maven, Gradle, Ant & mehr 6
P Applet Java Applet läuft im Browser nicht mehr (HTTPClient - NoClassDefFoundError) Tools - Maven, Gradle, Ant & mehr 3
P Applet Applet Signatur auf Server mit SSL-Zertifikat? Tools - Maven, Gradle, Ant & mehr 7
H Applet Applet wird nicht angezeigt Tools - Maven, Gradle, Ant & mehr 2
M Applet Applet funktioniert in Google Chrome nicht Tools - Maven, Gradle, Ant & mehr 2
O Applet "Anwendung kann nicht ausgeführt werden" Tools - Maven, Gradle, Ant & mehr 6
Q Applet Fehlermeldung bei Applet-Wechsel Tools - Maven, Gradle, Ant & mehr 4
T Daten per POST-Methode aus Java-Applet nach php-Script senden Tools - Maven, Gradle, Ant & mehr 3
R Applet friert Adresszeile des Firefox ein Tools - Maven, Gradle, Ant & mehr 2
K Applet als Jar-Datei in HTML einbinden Tools - Maven, Gradle, Ant & mehr 14
H Applet-Fehlermeldung Tools - Maven, Gradle, Ant & mehr 10
H Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 3
Q Applet Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 14
J Applet URL mittels TTS als Applet lesen lassen Tools - Maven, Gradle, Ant & mehr 40
F Applet verwischt, wenn Seite gescrollt wird Tools - Maven, Gradle, Ant & mehr 16
S Applet Applet mit C# öffnen: java.lang.SecurityException: Permission denied (WinXP) Tools - Maven, Gradle, Ant & mehr 8
J Applet-Quellcode einsehen Tools - Maven, Gradle, Ant & mehr 6
E Applet Applet und Datenbank Konzept Tools - Maven, Gradle, Ant & mehr 4
A Applet: Html Datei und Class Datei nicht im selben Verzeichnis Tools - Maven, Gradle, Ant & mehr 2
S Applet soll Textdatei von fremdem Server öffnen Tools - Maven, Gradle, Ant & mehr 8
E Java Applet bearbeiten Tools - Maven, Gradle, Ant & mehr 8
Quasar Wie signiere ich mein Applet richtig? Tools - Maven, Gradle, Ant & mehr 6
M mit Applet Javascript Aufrufen Tools - Maven, Gradle, Ant & mehr 2
S Applet and stop() method und gui blocked Tools - Maven, Gradle, Ant & mehr 4
A Applet Applet startet nach Einbinden auf Website nicht Tools - Maven, Gradle, Ant & mehr 4
A Applet, xxx.jar und hsqldb Tools - Maven, Gradle, Ant & mehr 4
T Webstart oder Applet Tools - Maven, Gradle, Ant & mehr 2
H Applet applet neu laden im browser Tools - Maven, Gradle, Ant & mehr 10
M Applet neustart Tools - Maven, Gradle, Ant & mehr 5
S Applet request unter Linux Tools - Maven, Gradle, Ant & mehr 14
S Applet GUI nicht im Webbrowser sichtbar Tools - Maven, Gradle, Ant & mehr 5
S Mittel Applet Datei an ein Webserver übertragen Tools - Maven, Gradle, Ant & mehr 2
M Applet in ClientServer J2EE Anwendung debugen Tools - Maven, Gradle, Ant & mehr 6
H Java Applet Problem beim einbinden in HTML Tools - Maven, Gradle, Ant & mehr 3
M Java3D Applet flackert wenn ein Button(HTML) gedrückt wird Tools - Maven, Gradle, Ant & mehr 11
S Policy mit Signiertem Applet verteilen Tools - Maven, Gradle, Ant & mehr 9
F Applet findet include nicht Tools - Maven, Gradle, Ant & mehr 15
L PHP + Java Applet Kommunikation Tools - Maven, Gradle, Ant & mehr 9
C Probleme mit Applet mit SQL im Browser Tools - Maven, Gradle, Ant & mehr 4
G Java-Applet Probleme beim Browser Tools - Maven, Gradle, Ant & mehr 14
G Textfile in Applet laden möglich? Tools - Maven, Gradle, Ant & mehr 2
A Java-Applet Sandbox deaktiviren? Tools - Maven, Gradle, Ant & mehr 2
B Java-Applet geht nicht (auf dem Webserver) Tools - Maven, Gradle, Ant & mehr 9
P Applet läuft nicht in Browser Tools - Maven, Gradle, Ant & mehr 21
V JAR-Datei eines (J)Applet funktioniert nicht - Help! Tools - Maven, Gradle, Ant & mehr 19
S Java Applet per Klick starten? Tools - Maven, Gradle, Ant & mehr 6
S Applet geht nicht Tools - Maven, Gradle, Ant & mehr 25
J Applet signieren Tools - Maven, Gradle, Ant & mehr 2
H Applet - Geschicklichkeitsspiel programmieren Tools - Maven, Gradle, Ant & mehr 16
U Jar funktioniert nicht als Applet Tools - Maven, Gradle, Ant & mehr 3
C Applet Frage Tools - Maven, Gradle, Ant & mehr 4
M Java Applet - enforce use of older JRE Tools - Maven, Gradle, Ant & mehr 3
N Wie Java-Programm zu Applet machen?! Tools - Maven, Gradle, Ant & mehr 2
W Webseite aus Applet öffnen Tools - Maven, Gradle, Ant & mehr 3
lumo Applet - resize Tools - Maven, Gradle, Ant & mehr 7
Icewind Applet reagiert nach neu laden der Webseite nicht mehr verlässlich auf KeyEvents Tools - Maven, Gradle, Ant & mehr 6
R Applet mit MySQL Tools - Maven, Gradle, Ant & mehr 3
A jar datei trotz zertifikat nich aus applet ausführbar Tools - Maven, Gradle, Ant & mehr 4
F Fehlende Applet Rechte Tools - Maven, Gradle, Ant & mehr 12
N [Applet] Button wir nach 5 secs Unsichtbar Tools - Maven, Gradle, Ant & mehr 2
N jar -> applet wie setzt man das am leichtesten um Tools - Maven, Gradle, Ant & mehr 7
V applet Java 1.6 -> 1.5 Problem ... wie mit Ant zu lösen? Tools - Maven, Gradle, Ant & mehr 7
F applet als JAR -> AccessControlException Tools - Maven, Gradle, Ant & mehr 3
grudge File in Applet laden Tools - Maven, Gradle, Ant & mehr 4
E Java Applet - Double Buffering Problem (Flackern) Tools - Maven, Gradle, Ant & mehr 6
R Applet mit bestimmter JRE ausführen Tools - Maven, Gradle, Ant & mehr 9
traysa Wie binde ich ein applet in eine jsp Tools - Maven, Gradle, Ant & mehr 3
D Mit dem Applet das DOM manipulieren? Tools - Maven, Gradle, Ant & mehr 3
ABstraCT Applet getCodeBase() Zugriff auf darüberliegendenden Ordner ? Tools - Maven, Gradle, Ant & mehr 1
S Java-Applet Steuerung IO Karte am Drucker-Port Tools - Maven, Gradle, Ant & mehr 4
P URL aus Applet öffnen? Tools - Maven, Gradle, Ant & mehr 7
ABstraCT Mit Applet in ne Datei auf seinem Server schreiben. Tools - Maven, Gradle, Ant & mehr 10
E Verzögerung beim Refresh (F5) mit einem Applet verursachen Tools - Maven, Gradle, Ant & mehr 16
deetee Applet Frage Tools - Maven, Gradle, Ant & mehr 2
S Fehler in einem Upload - Applet (nicht gelöst!!) Tools - Maven, Gradle, Ant & mehr 2
G Variable an zweites Applet übergeben Tools - Maven, Gradle, Ant & mehr 3
M Dringend: Sehr kompliziertes Applet Problem Tools - Maven, Gradle, Ant & mehr 4
O Javascript kommuniziert mit Applet? Tools - Maven, Gradle, Ant & mehr 2
H Spracherkennung mit Applet / Policy bzw. Security Fehler Tools - Maven, Gradle, Ant & mehr 2
zilti Nerviger Hinweis bei Applet- und WS-Fenstern - wieso? Tools - Maven, Gradle, Ant & mehr 3
S Datei-/Verzeichniszugriff von signiertem Applet Tools - Maven, Gradle, Ant & mehr 6
G Signiertes Applet installieren? Tools - Maven, Gradle, Ant & mehr 3
G Applet mit Parameter aus JavaScript Tools - Maven, Gradle, Ant & mehr 5
A Applet Maus Koordinaten ohne MouseMotionListener Tools - Maven, Gradle, Ant & mehr 3
K Applet in Eclipse funktioniert, im Browser nicht Tools - Maven, Gradle, Ant & mehr 7
T Applet soll Java Programm starten Tools - Maven, Gradle, Ant & mehr 2
S Applet pai.nt? Tools - Maven, Gradle, Ant & mehr 3
S Applet und File-Object? Tools - Maven, Gradle, Ant & mehr 9
T Applet soll Datei lesen (darf es aber nicht.) Tools - Maven, Gradle, Ant & mehr 3
P Java-Applet funktioniert unter WINXP nicht Tools - Maven, Gradle, Ant & mehr 2
N Java 1.6 Applet auf älteren Versionen ausführbar? Tools - Maven, Gradle, Ant & mehr 4
G Signiertes Applet prüfen? Tools - Maven, Gradle, Ant & mehr 3
H Problem mit einen Applet Tools - Maven, Gradle, Ant & mehr 5
J Java Applet bei mouseover mit Tooltip Tools - Maven, Gradle, Ant & mehr 3
G Applet Security Problem Tools - Maven, Gradle, Ant & mehr 3

Ähnliche Java Themen

Neue Themen


Oben