MouseEvents mit Parameterübergabe?

Status
Nicht offen für weitere Antworten.

wingeddog

Neues Mitglied
Hallo.

Als Neuling und das nicht nur in diesem Forum, sondern auch allgemein in der Grafikprogrammierung, musste ich nun feststellen, das ich nun an meine Grenzen gestoßen bin. Bisher habe ich immer irgendwas herausgefunden, aber diesmal stecke ich echt fest:

Also... ich habe ein Programm geschrieben (mit ECLIPSE), welches aus einer XML Datei Informationen in ein Speicherarray ablegt und die vorher abgespeicherten Bilder wieder Lädt.

Die XML Datei sieht z.B. so aus:

Code:
<?xml version="1.0" encoding="UTF-8" ?> 
- <grafikPanel>
 - <kachel>
      <bild>images/11.jpg</bild> 
      <x-position>0</x-position> 
      <y-position>0</y-position> 
      <Name>Hintergrundbild</Name> 
      <Inhalt>leer</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
 </kachel>
- <kachel>
      <bild>images/12.jpg</bild> 
      <x-position>0</x-position> 
      <y-position>1</y-position> 
      <Name>Hintergrundbild</Name> 
      <Inhalt>leer</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
 </kachel>
- <kachel>
      <bild>images/13.jpg</bild> 
      <x-position>0</x-position> 
      <y-position>2</y-position> 
      <Name>Hintergrundbild</Name> 
      <Inhalt>leer</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
      </kachel>
- <kachel>
      <bild>images/14.jpg</bild> 
      <x-position>0</x-position> 
      <y-position>3</y-position> 
      <Name>Hintergrundbild</Name> 
      <Inhalt>leer</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
  </kachel>
- <kachel>
      <bild>images/15.jpg</bild> 
      <x-position>0</x-position> 
      <y-position>4</y-position> 
      <Name>Hintergrundbild</Name> 
      <Inhalt>leer</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
  </kachel>
- <kachel>
      <bild>images/rohr_rechts.jpg</bild> 
      <x-position>1</x-position> 
      <y-position>0</y-position> 
      <Name>Rohr rechts</Name> 
      <Inhalt>Benzin</Inhalt> 
      <Richtung>rechts</Richtung> 
      <Zustand>voll</Zustand> 
  </kachel>
- <kachel>
      <bild>images/ecke_l-u.jpg</bild> 
      <x-position>1</x-position> 
      <y-position>1</y-position> 
      <Name>Ecke unten links</Name> 
      <Inhalt>Benzin</Inhalt> 
      <Richtung>Richtungslos</Richtung> 
      <Zustand>voll</Zustand> 
 </kachel>

Diese Daten dienen dazu um Grafiken in in einer bestimmten Reihenfolge anzuordnen (das wird über die Koordinaten gemacht). Die Grafiken haben natürlich auch Zusatzinformationen. Wenn ich nun auf eine dieser Grafiken mit dem Mauszeiger drücke, dann soll eine Art Hinweisfenster aufpoppen und mir die Zusatzinformationen liefern.
Definiert sind die Bilder über Koordinaten.

Mein größtes Problem ist jetzt dieses Hinweisfenster aufpoppen zu lassen. So etwas habe ich noch nie gemacht und Beispiele habe ich dazu auch keine gefunden.
Vor allem weil ich dem MouseEvent ja anscheinend Parameter mitgeben muss um auch die richtigen Infos zum Bild anzeigen zu lassen. So zum Beispiel, wenn ich das Bild im speicher[5][2] auswählen will, muss dann im Hinweisfenster stehen
Name: Reaktor
Inhalt: Benzin
Richtung: rechts
Zustand: voll

Die Infos bekomme ich mit ein paar get-Methoden aus einer extra Klasse namens "class Komponente()". Das soll also nicht das Problem sein, aber ich muss ja erst einmal die Eigenschaften des Objektes mit übergeben.

Hier ist mal eben der Quellcode meines Programmes:

Code:
package viewer;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

//import java.util.Iterator;
//import java.util.List;
//import java.util.ListIterator;

public class viewer
    extends JFrame
    implements ActionListener {

  // Definition verschiedener Abstandshalter	
  public static Dimension HGAP10 = new Dimension(10, 1);
  public static Dimension HGAP20 = new Dimension(20, 1); //links
  public static Dimension VGAP20 = new Dimension(1, 20); //oben
  public static Dimension VGAP15 = new Dimension(1, 15); //auswahlboxen
  public static Dimension HGAP30 = new Dimension(30, 1); //Schachfeld links

  JFrame frame;
  boolean isReset = true; //Rücksetszustand zum löschen der Anzeige

  Object[] bilder = new Object[11]; //Speicher für ImageIcons (Basisbilder)
  Komponente[][] speicher = new Komponente[5][5]; //Interner Zwischenspeicher
  JPanel zeichnen = new JPanel(); //ZeichenPanel in dem alle Icons angezeigt werden
  JLabel l, l1, l2;
  JLabel l11, l12, l13, l14, l15, l21, l22, l23, l24, l25, l31, l32, l33, l34,
      l35, l41, l42, l43, l44, l45, l51, l52, l53, l54, l55;
  JLabel[][] kachel = new JLabel[5][5]; // Kachel array zum effektieven arbeiten
  JMenuItem i1, i2, i3;
  JButton zurueck, laden;
  Hinweisfenster info = new Hinweisfenster();

  
//Initialisieren der Komponenten in dem Bildspeicher bilder (Basisbilder)
  public void createViewer() {

    viewer.setDefaultLookAndFeelDecorated(true); // Alternative Fensteransicht setzen

    bilder[0] = new ImageIcon("images/rohr_rechts.jpg");
    bilder[1] = new ImageIcon("images/rohr_links.jpg");
    bilder[2] = new ImageIcon("images/rohr_unten.jpg");
    bilder[3] = new ImageIcon("images/rohr_oben.jpg");

    bilder[4] = new ImageIcon("images/ecke_r-o.jpg");
    bilder[5] = new ImageIcon("images/ecke_l-o.jpg");
    bilder[6] = new ImageIcon("images/ecke_r-u.jpg");
    bilder[7] = new ImageIcon("images/ecke_l-u.jpg");

    bilder[8] = new ImageIcon("images/reaktor.jpg");
    bilder[9] = new ImageIcon("images/behaelter.jpg");
    bilder[10] = new ImageIcon("images/ventil.jpg");

	// Layout für das HintergrundPanel setzen
    JPanel demoPanel = new JPanel();
    demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));

	// Layout für das AnzeigePanel setzen
    JPanel innerPanel = new JPanel();
    innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));

	// demoPanel.add(Box.createRigidArea(VGAP20));
    demoPanel.add(innerPanel);
	// demoPanel.add(Box.createRigidArea(VGAP20));

	// Panel für Buttons
    JPanel comboBoxPanel = new JPanel() {
      public Dimension getMaximumSize() {
        return new Dimension(getPreferredSize().width,
                             super.getMaximumSize().height);
      }
    };
    comboBoxPanel.setLayout(new BoxLayout(comboBoxPanel, BoxLayout.Y_AXIS));
    comboBoxPanel.add(Box.createRigidArea(VGAP15));

	// Füllen des restlichen Bereiches
    comboBoxPanel.add(new JPanel(new BorderLayout()));

	// Erzeugen des Grafikbereiches
    JPanel grafikPanel = new JPanel() {
      public Dimension getMaximumSize() {
        return new Dimension(getPreferredSize().width,
                             getPreferredSize().height);
      }
    };
    grafikPanel.setLayout(new BorderLayout());

	// 3D-Rahmen, der eingelassen sein kann
    grafikPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
    zeichnen.setLayout(new GridLayout(5, 5));

	// Initialisieren der Basisbilder im AnzeigePanel sowie der Objekte im Speicher
    basic();

	// Defaultbilder anzeigen lassen im grafikPanel	
    firstpaint();

    grafikPanel.add(zeichnen, BorderLayout.CENTER);

	// Hinzufügen der Buttons and Bild Panels zum innerPanel
    innerPanel.add(Box.createRigidArea(HGAP20));
    innerPanel.add(comboBoxPanel);
    innerPanel.add(Box.createRigidArea(HGAP30));
    innerPanel.add(grafikPanel);
    innerPanel.add(Box.createRigidArea(HGAP20));

	// Menüleiste erstellen
    JMenu me1 = new JMenu("Datei");
    i1 = new JMenuItem("Öffnen", 'Ö');
    i1.addActionListener(this);
    i3 = new JMenuItem("Beenden", 'B');
    i3.addActionListener(this);
    me1.add(i1);
    me1.addSeparator();
    me1.add(i3);

    JMenu me2 = new JMenu("Info");
    JMenuItem i4 = new JMenuItem("Projekt 2004");
    me2.add(i4);

    JMenuBar bar1 = new JMenuBar();
    bar1.add(me1);
    bar1.add(me2);

	// Panel für die Buttons "Laden" und "Zurücksetzen"
    JPanel unten = new JPanel();
    unten.setLayout(new FlowLayout());

	// "Zurücksetzen" Button
    zurueck = new JButton("Zurücksetzen");
    zurueck.setHorizontalAlignment(JButton.CENTER);
    zurueck.addActionListener(this);

	// "Laden" Button
    laden = new JButton("Laden");
    laden.setHorizontalAlignment(JButton.CENTER);
    laden.addActionListener(this);

    unten.add(laden);
    unten.add(zurueck);

    // Fenster definieren
    JFrame frame = new JFrame("Viewer");
    /* Anzeiegen des Fensters in der Bildschirmmitte durch Subtraktion von
	 * Bildschirm- und Fenstergröße.
 	 * Die Fesntergröße wird unveränderlich gesetzet.
 	 */
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
    frame.setSize(new Dimension(700, 540)); 
    frame.setLocation( (d.width - frame.getSize().width) / 2, 
                      (d.height - frame.getSize().height) / 2); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(bar1, BorderLayout.NORTH);
    frame.getContentPane().add(demoPanel, BorderLayout.CENTER);
    frame.getContentPane().add(unten, BorderLayout.SOUTH);
    demoPanel.setPreferredSize(new Dimension(700, 540));
    frame.setResizable(false); 
    frame.pack();
    frame.show();
  }

//Fülen des Speicher Arrays  mit den default Icons (11.jpg - 55.jpg)
  private void basic() {

    /* Durchlaufen des zweidimmensionalen Komponente-Arrays
     * um den Speicher mit Komponente Objekten zu füllen.
     * Dabei werden an der richtigen Stelle alle Hintergrundbilder gelegt,
     * sowie default Eigenschaften vergeben.
     */
    for (int j = 0; j < 5; j++) {
      for (int i = 0; i < 5; i++) {
        speicher[i][j] = new Komponente(new ImageIcon("images/" + (i + 1) +
            (j + 1) + ".jpg") , "Hintergrundbild", "Richtungslos", "leer");
      }
    }
  }

//Bildspeicher zurücksetzen
  private void back() {

    /* Durchlaufen des zweidimmensionalen ImageIcon-Arrays
     * um die ImageIcons aus dem Speicher neu in dem
     * AnzeigePanel darzustellen
     */
    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < 5; j++) {
        (kachel[i][j]).setIcon(speicher[i][j].getIcon());
      }
    }
    isReset = true;
  }

//Erstmaliges füllen des zeichnen Panels mit dem speicher
  private void firstpaint() {

    /* Durchlaufen des zweidimmensionalen ImageIcon-Arrays
     * um erstmalig die Anzeige-JLabels zu erzeugen und dem
     * zeichen Panels hinzuzufügen.Dabei werden wieder die
     * Bilder wieder aus dem Speicher geholt.
     */
    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < 5; j++) {
      	//String koor = 
        //JLabel koor = new JLabel();
        kachel[i][j] = new JLabel();
        (kachel[i][j]).setIcon(speicher[i][j].getIcon());
        zeichnen.add(kachel[i][j]);
      }
    }
  }

//erzeugte XML Datei laden und anzeigen
  private void laden() {

    String dateiname = "export"; // Default Dateiname

    /* Öffnen eines Datei-Auswahlfensters, der dem ausgewählten Dateiname
     * dem XML Parser somit zugänglich macht.
     */
    try {
      FileDialog fileDlg = new FileDialog(this, "Datei öffnen", FileDialog.LOAD);
      fileDlg.show();

      dateiname = fileDlg.getDirectory();
      dateiname = dateiname.concat(fileDlg.getFile());

    }
    catch (NullPointerException n) {
      System.err.println(n);
    }

    /*Einlesen mit dem SAX Builder
     *Erzeugen eines neuen JDOM Documents, in das eingelsen werden kann
     */
    Document doc = null;

	// Einlesen der ausgewählten XML-Datei in das JDOM Document
    try {

      SAXBuilder builder = new SAXBuilder();
      doc = builder.build(new File(dateiname));

    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    
	// Das root-Element erzeugen als zentraler Zugrifspunk in dem Document
    Element root = doc.getRootElement();

    //List elementListe = root.getChildren();
    /*
             Iterator listenIterator = root.getContent().listIterator();
             while ( listenIterator.hasNext())
             {
            Element e = (Element)listenIterator;
            System.out.println(e.getText());
             }
     */

	/* Malen der Bilder auf den Kacheln durch Auslesen des ersten Elements und dann
	 * löschen dessen um erneut das erste Element lesen zu können.
	 * Dazu wird das gesammte Document durchlaufen und die jeweiligen
	 * Elemente ausgelesen
	 */ 
	 
    for (int i = 0; i < 25; i++) {

      //Laufvariablen erstellen zum Anspeichern der Arryposition
      int x = Integer.parseInt( (root.getChild("kachel").getChild("x-position")).
                               getText());
      int y = Integer.parseInt( (root.getChild("kachel").getChild("y-position")).
                               getText());
	  // Erzeugen des ImageIcons aus dem Element und anzeigen im Fenster
      kachel[x][y].setIcon(new ImageIcon( (root.getChild("kachel").getChild(
          "bild")).getText()));

      //Speicherupdate mit den ausgelesenen Eigenschaften des Elements
      speicher[x][y].setName( (root.getChild("kachel").getChild("Name")).
                             getText());
      speicher[x][y].setInhalt( (root.getChild("kachel").getChild("Inhalt")).
                               getText());
      speicher[x][y].setDirection( (root.getChild("kachel").getChild("Richtung")).
                                  getText());
      speicher[x][y].setState( (root.getChild("kachel").getChild("bild")).
                              getText());

      //Löschen des ersten Elements um da dadrunter liegende Element einzulesen
      root.removeChild("kachel");

    }
	// Zurücksetzen des Rücksetszustandes
    isReset = false;

  }

// ActionListener für Buttons und Menü
  public void actionPerformed(ActionEvent e) {

	// "Zurücksetzen" Button
	// Zurücksetzen der Anzeige auf Defaultbilder
    if (e.getSource() == zurueck) {
      if (!isReset) {
        back();
      }
    }

	// "Laden" Button
	// Einlesen der XML-Datei auslösen
    else if (e.getSource() == laden) {
      laden();
      info.createFenster("Name", "Inahlt", "Richtung", "Zustand"); 	// <------- so wird das aufgerufen !!!
      
    }

	// Menü Datei/Laden
	// Einlesen der XML-Datei auslösen
    else if (e.getSource() == i1) {
      laden();
    }

    else if (e.getSource() == i3) {
      System.out.println("\nProgram closed ...");
      System.exit(0);
    }
  }
  
  private void showinfo(){
  	
  	
  }

  public static void main(String[] args) {
    viewer view = new viewer();
    view.createViewer();
  }

}

Aber ich wäre auch schon überglücklich, wenn mir jemand sagen könnte wie ich das mit einfachen MouseEvents hinbekomme. Nur das sich bei mir ein PopFenster öffnet.

Es drängt leider auch ein wenig, weil ich das Programm am Montag fertig haben muss. Bitte daher um schnellstmöglich antwort.

Grüße
 
B

Beni

Gast
Für solch kleine Dialoge aller Art eignet sich das JOptionPane immer noch am besten. Es hat da ein paar Beispiele in der API.
Das Viech verarbeitet auch HTML, also kannst du aus deinen Informationen kurz einen HTML-codierten String erstellen.

Für den MouseListener:
Den fügst du einfach hinzu, und benutzt ihn, wie der ActionListener.

Code:
Component component = ... // Die Oberfläche die abgehört werden soll
MouseListener mouseListener = ... // Die Instanz des MouseListeners, die alle Ereignisse bemerken soll

component.addMouseListener( mouseListener );

Und einen MouseListener schreiben, ist einfach:
Code:
public class Listener implements MouseListener{
  public void mouseClicked(MouseEvent e){
  }

  public void mouseEntered(MouseEvent e){
  }

  public void mouseExited(MouseEvent e){
  }

  public void mousePressed(MouseEvent e){
  }

  public void mouseReleased(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();

    // Aufgrund der Position der Maus die Komponente finden
     ...

     JOptionPane.showMessageDialog( ... );
  }
}
 

wingeddog

Neues Mitglied
DANKE DANKE! Genau das was ich gesucht habe. Damit kann ich arbeiten. Falls ich noch fragen hab, komm ich nochmal wieder!!!

Ihr seit echt super hier!!!!

Nur mal zur Info, wegen dem JOptionPane:

Für das Infofenster hatte ich mir schon in mühevoller Arbeit ein eigenes Fenster zusammenschustert. Die 4 Strings die dem createFenster übergeben werden, werden von einer eigenen Klasse (class Komponente) aus dem Programm gelesen. So habe ich mir gedacht, das ich an die Strings des createFenster die Komponenten übergebe. Ansonsten hätte ich die Strings selber rauslesen müssen und dann hätte ich den speicher public machen müssen. Das wäre nicht so toll gewesen.

Code:
public class Hinweisfenster extends JDialog implements ActionListener{
	
	
	JFrame frame = new JFrame();
			
	public void createFenster (String name, String inhalt, String richtung, String zustand) {
				
		//Hinweisfenster.setDefaultLookAndFeelDecorated(true);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setLocation( (d.width - getSize().width ) / 4,(d.height- getSize().height) / 4 );
		frame.setSize(new Dimension(500,300));
		frame.setTitle("Infodialog");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
		JPanel innerPanel = new JPanel();
		//innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
		innerPanel.setLayout(new GridLayout(4, 2, 3, 2));
		innerPanel.setPreferredSize(new Dimension(200, 70));
		//JLabel LabelName = new JLabel("Name: "+ name);
		//JLabel LabelInhalt = new JLabel ("Inhalt:" +inhalt);
		//JLabel LabelRichtung = new JLabel ("Rivhtung: "+ richtung);
		//JLabel LabelZustand = new JLabel ("Zustand"+ zustand);
		
		innerPanel.add(new JLabel("Name:"));
		innerPanel.add(new JLabel (name));
		innerPanel.add(new JLabel ("Inhalt:"));
		innerPanel.add(new JLabel (inhalt));
		innerPanel.add(new JLabel ("Richtung:"));
		innerPanel.add(new JLabel (richtung));
		innerPanel.add(new JLabel ("Zustand:"));
		innerPanel.add(new JLabel (zustand));
		
		frame.getContentPane().add(innerPanel, BorderLayout.CENTER);
		frame.setResizable(false);
		
		JButton b = new JButton( "OK" );
		b.addActionListener(this);
		frame.getContentPane().add( b, BorderLayout.SOUTH );
		
		frame.pack();
		frame.show();
		
		
	}
	
	 public void actionPerformed( ActionEvent e ) {
		frame.dispose();
			
			
	 }
}

-------------------------------------------------------------------------------------------------------------------------
Code:
public class Komponente {
	
	
private	ImageIcon 	icon;
private	String 		name;
private	String 		richtung;
private	String 		inhalt;
private	String	 	state;

//Defaulkonstruktor

Komponente(){
	icon = 		null;
	name = 		"basisbild";
	richtung = 	"undefiniert";
	inhalt = 	"unbekannt";
	
			
};

//Konstruktor
Komponente (ImageIcon icon, String name , String richtung, String inhalt){
	
	this.icon = icon;
	this.name = name;
	this.richtung = richtung;
	this.inhalt = inhalt;
		
};

public void setState (String zustand){
	this.state = zustand;
}

public String getName(){
	return this.name;
}

public String getRichtung(){
	return this.richtung;
}

public String getInhalt(){
	return this.inhalt;
}

public ImageIcon getIcon(){
	return this.icon;
}

public String getState(){
	
	return state;
	
}

public void setIcon (ImageIcon icon){
	this.icon = icon;
}

public void setName(String name){
	this.name = name;
}

public void setInhalt(String inhalt){
	this.inhalt = inhalt;
}
public void setDirection (String richtung){
	this.richtung = richtung;
}
}//Konstruktor
 
P

Paul Panther

Gast
Hallo,

wenn man schon so einen Listener baut, wa kommt dann eigentlich da rein?

Code:
Component component = ... // Die Oberfläche die abgehört werden soll 

MouseListener mouseListener = ... // Die Instanz des MouseListeners, die alle Ereignisse bemerken soll


ciao
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben