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