 |
12.05.2005, 15:00
| Nach oben
#1 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 539
| Color lässt sich nicht verändern
Die "Hauptklasse" ruft diese Klasse auf: PHP-Code: class ownDesign extends JDialog implements ActionListener { ZeichnenTet mal = new ZeichnenTet(); String[] str = { "<html>Alle Werte von<br>0 - 255<html>", "Rotwert", "Grünwert", "Blauwert", "Bestätigen" }; String[] str2 = { "<html>1. Hintergrund-<br>farbe<html>", "<html>2. Hintergrund-<br>rahmen<html>", "<html>3. Deadline<br>4. Punktestand<html>", "<html> 5. Steinfarbe<br>6. Steinrahmen<html>" }; JPanel pane = new JPanel(); JPanel[] vorschau = new JPanel[6]; JButton[] oks = new JButton[6]; JButton uebernehmen = new JButton("Ändern"); JTextField[] werte = new JTextField[18]; JLabel[] beschriftung = new JLabel[5]; JLabel[] legende = new JLabel[str2.length]; public ownDesign() { setSize(500, 300); pane.setLayout(new GridLayout(8, 4, 5, 5)); uebernehmen.addActionListener(this); for (int a = 0; a < str.length; a++) { beschriftung[a] = new JLabel(str[a]); pane.add(beschriftung[a]); } for (int a = 0; a < 6; a++) { vorschau[a] = new JPanel(); pane.add(vorschau[a]); vorschau[a].setBackground(Color.black); for (int b = a * 3; b < a * 3 + 3; b++) { werte[b] = new JTextField(0 + "", 3); pane.add(werte[b]); } oks[a] = new JButton("OK"); oks[a].addActionListener(this); pane.add(oks[a]); } for (int a = 0; a < str2.length; a++) { legende[a] = new JLabel(str2[a]); pane.add(legende[a]); } pane.add(uebernehmen); setContentPane(pane); } public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == uebernehmen) { try { mal.back = new Color(Integer.parseInt(werte[0].getText()), Integer.parseInt(werte[1].getText()), Integer.parseInt(werte[2].getText())); mal.rahmenBack = new Color(Integer.parseInt(werte[3].getText()), Integer.parseInt(werte[4].getText()), Integer.parseInt(werte[5].getText())); mal.deadline = new Color(Integer.parseInt(werte[6].getText()), Integer.parseInt(werte[7].getText()), Integer.parseInt(werte[8].getText())); mal.punktestand = new Color(Integer.parseInt(werte[9].getText()), Integer.parseInt(werte[10].getText()), Integer.parseInt(werte[11].getText())); mal.stein = new Color(Integer.parseInt(werte[12].getText()), Integer.parseInt(werte[13].getText()), Integer.parseInt(werte[14].getText())); mal.rahmenStein = new Color(Integer.parseInt(werte[15].getText()), Integer.parseInt(werte[16].getText()), Integer.parseInt(werte[17].getText())); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Bitte Werte zwischen 0 und 255 eingeben", "Fehler!", JOptionPane.ERROR_MESSAGE); } } else { for (int a = 0; a < 6; a++) { if (source == oks[a]) { try { vorschau[a].setBackground(new Color(Integer.parseInt(werte[a * 3].getText()), Integer.parseInt(werte[a * 3 + 1].getText()), Integer.parseInt(werte[a * 3 + 2].getText()))); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Bitte Werte zwischen 0 und 255 eingeben", "Fehler!", JOptionPane.ERROR_MESSAGE); } } } } } }
und diese ändert dann Colorwerte in der Klasse ZeichnenTet. Nur werden die nicht übernommen :confused: . Wenn ich dagegen in meiner Klasse von der ich ownDesign aufrufe die Werte für ZeichnenTet ändere funktioniert das einwandfrei. Woran liegt das?
|
| |
12.05.2005, 15:08
| Nach oben
#2 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
Was bedeutet sie werden nicht übernommen?
Wenn ich dich richtig verstehe:
Du hast in der Hauptklasse auch eine Instanz von ZeichnenTet() und möchtest die hierheraus ändern?
Gruß
Sparrow
|
| |
12.05.2005, 15:21
| Nach oben
#3 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 539
|
Ich möchte von dieser Klasse aus die Farben einer anderen Klasse ändern. Wenn ich das ganze von der Hauptklasse aus mache (die Farben ändern), dann funktioniert das einwandfrei, aber wenn ich es von ownDesign mache, klappt das nicht :confused:
|
| |
12.05.2005, 16:05
| Nach oben
#4 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
Versuch mal bitte foldends: PHP-Code: try {
mal.back = new Color(Integer.parseInt(werte[0].getText()), Integer.parseInt(werte[1].getText()), Integer.parseInt(werte[2].getText()));
mal.rahmenBack = new Color(Integer.parseInt(werte[3].getText()), Integer.parseInt(werte[4].getText()), Integer.parseInt(werte[5].getText()));
mal.deadline = new Color(Integer.parseInt(werte[6].getText()), Integer.parseInt(werte[7].getText()), Integer.parseInt(werte[8].getText()));
mal.punktestand = new Color(Integer.parseInt(werte[9].getText()), Integer.parseInt(werte[10].getText()), Integer.parseInt(werte[11].getText()));
mal.stein = new Color(Integer.parseInt(werte[12].getText()), Integer.parseInt(werte[13].getText()), Integer.parseInt(werte[14].getText()));
mal.rahmenStein = new Color(Integer.parseInt(werte[15].getText()), Integer.parseInt(werte[16].getText()), Integer.parseInt(werte[17].getText()));
}
System.out.println(mal.back);
System.out.println(mal.rahmenBack);
Mal schauen ob die Variablen in der Klasse ankommen, oder die Variablen in der Klasse als final oder private sind.
Also, eigentlich sollte es jetzt zur Ausgabe der Werte der Varianblen kommen.
Gib mir mal ein Schema deines Programms, wird diese Klasse ZeichnenDet irgendwo im Programm nochmal verwendet?
Und wenn ja, warum?
Gruß
Sparrow
|
| |
13.05.2005, 07:45
| Nach oben
#5 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 539
|
ZeichnenTet, wird noch von meiner Hauptklasse benutzt. Jup, werte kommen an! Das komische ist, wenn ich das ganze so umschreibe, dass ich eine Methode in der Klasse ZeichnenTet habe, der ich dann die jeweiligen Werte übergebe und mit diesen dann direkt in der Klasse die Farben ändere (also praktisch so: PHP-Code: class ZeichnenTet extends JPanel { ... void changeColor(... die ganzen Farben übergeben) { back = new Color(... werte); backRahmen = new Color(... werte); ... } } class ownDesign extends JDialog implements ActionListener { ZeichnenTet mal = new ZeichnenTet(); ... mal.changeColor(... werte) }
), dann stimmen sie zwar, wenn ich sie ausgebe in der Methode changeColor, aber beim Neuzeichnen nicht mehr. Hoff ich konnt mich einigermaßen klar ausdrücken, dass was ich geschrieben hab verwirrt mich nämlich selbst |
| |
13.05.2005, 09:02
| Nach oben
#6 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
wenn ich dich richtig vertanden habe, dann hast du vergessen die Instanz von ZeichnenTet aus der Hauptklasse nach ownDesign zu übergeben: PHP-Code: class ownDesign extends JDialog implements ActionListener {
ZeichnenTet mal; // Change by sparrow@jforum
String[] str = { "<html>Alle Werte von<br>0 - 255<html>", "Rotwert", "Grünwert", "Blauwert", "Bestätigen" };
String[] str2 = { "<html>1. Hintergrund-<br>farbe<html>", "<html>2. Hintergrund-<br>rahmen<html>", "<html>3. Deadline<br>4. Punktestand<html>", "<html> 5. Steinfarbe<br>6. Steinrahmen<html>" };
JPanel pane = new JPanel();
JPanel[] vorschau = new JPanel[6];
JButton[] oks = new JButton[6];
JButton uebernehmen = new JButton("Ändern");
JTextField[] werte = new JTextField[18];
JLabel[] beschriftung = new JLabel[5];
JLabel[] legende = new JLabel[str2.length];
public ownDesign(ZeichnenTet mal) { // Change by sparrow@jforum
this.mal = mal; // Change by sparrow@jforum
setSize(500, 300);
pane.setLayout(new GridLayout(8, 4, 5, 5));
uebernehmen.addActionListener(this);
for (int a = 0; a < str.length; a++) {
beschriftung[a] = new JLabel(str[a]);
pane.add(beschriftung[a]);
}
for (int a = 0; a < 6; a++) {
vorschau[a] = new JPanel();
pane.add(vorschau[a]);
vorschau[a].setBackground(Color.black);
for (int b = a * 3; b < a * 3 + 3; b++) {
werte[b] = new JTextField(0 + "", 3);
pane.add(werte[b]);
}
oks[a] = new JButton("OK");
oks[a].addActionListener(this);
pane.add(oks[a]);
}
for (int a = 0; a < str2.length; a++) {
legende[a] = new JLabel(str2[a]);
pane.add(legende[a]);
}
pane.add(uebernehmen);
setContentPane(pane);
}
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == uebernehmen) {
try {
mal.back = new Color(Integer.parseInt(werte[0].getText()), Integer.parseInt(werte[1].getText()), Integer.parseInt(werte[2].getText()));
mal.rahmenBack = new Color(Integer.parseInt(werte[3].getText()), Integer.parseInt(werte[4].getText()), Integer.parseInt(werte[5].getText()));
mal.deadline = new Color(Integer.parseInt(werte[6].getText()), Integer.parseInt(werte[7].getText()), Integer.parseInt(werte[8].getText()));
mal.punktestand = new Color(Integer.parseInt(werte[9].getText()), Integer.parseInt(werte[10].getText()), Integer.parseInt(werte[11].getText()));
mal.stein = new Color(Integer.parseInt(werte[12].getText()), Integer.parseInt(werte[13].getText()), Integer.parseInt(werte[14].getText()));
mal.rahmenStein = new Color(Integer.parseInt(werte[15].getText()), Integer.parseInt(werte[16].getText()), Integer.parseInt(werte[17].getText()));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,
"Bitte Werte zwischen 0 und 255 eingeben",
"Fehler!",
JOptionPane.ERROR_MESSAGE);
}
}
else {
for (int a = 0; a < 6; a++) {
if (source == oks[a]) {
try {
vorschau[a].setBackground(new Color(Integer.parseInt(werte[a * 3].getText()), Integer.parseInt(werte[a * 3 + 1].getText()), Integer.parseInt(werte[a * 3 + 2].getText())));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,
"Bitte Werte zwischen 0 und 255 eingeben",
"Fehler!",
JOptionPane.ERROR_MESSAGE);
}
}
}
}
}
}
Instanzierung von ownDesign in der Hauptklasse dann wie folgt: PHP-Code: OwnDesign ownDesign = new OwnDesign(deineInstanzVonZeichnenTetInHauptklasse);
Ich hoffe das ist dein Problem
|
| |
13.05.2005, 09:07
| Nach oben
#7 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 539
|
Jo, so funktionierts! Ich bin begeistert! Wenn du mir jetzt noch erklärst warum das so ist, bin ich glücklich  . So hab ich das nämlich noch nie gemacht und ich weiß auch nicht wirklich warum es jetzt funktioniert und vorher nicht.:confused:
|
| |
13.05.2005, 10:00
| Nach oben
#8 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
Ok, ich versuchs.
Allerdings bin ich nicht so der Erklärbär, sag ruhig wenn ich es nicht verständlich rüberbringe.
Also hier der Versuch der Erklärung
Du hattest in ownDesign ein Objekt names mal erstellt.
mal ist eine Instanz von ZeichnenTet
Da du direkt in der 1. Zeile das Objekt ownDesign mit new ZeichnenTet() instanzierst, läuft hier eine Instanz der Klasse die nichts mit der Klasse aus deiner Hauptklasse zu tun hat.
Kleines Beispiel:
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
Sop, wir haben gerade 2 Instanzen eines JPanels angelegt.
Wenn wir jetzt auf panel1 Komponenten einfügen tauchen sie ja auc nicht auf panel2 auf.
Das selbe Problem hattest du bei deinem Programm.
Auch wenn du die gleichen objektnamen vergeben hast, da
1. neu instanziert wurde
2. die Instanzierung in einer völlig anderen Klasse geschah (siehe sichtbarkeit von Variablen und Objekten)
war es eine völlig eigene Instanz.
Mit den von mir geänderten Codesegmenten, so übrigens üblich in Java, hast du einfach die Instanz deiner MalenDet Klasse aus der Hauptklasse mit in die neue Klasse übergeben.
Dort gibt es ebenfalls ein Objekt mit dem Namen 'mal', angelegt als Klassenobjekt (Klassenvariable) und mit dem
this.mal = mal;
weist du einfach nur dem Klassenobjekt die übergebene Instanz zu.
Im Prinzip tust du nichts anderes als:
JPanel panel1 = new JPanel();
JPanel panel2 = panel1;
Alternativ hättest du Übrigens auch eine Instanz deienr Hauptklasse an ownDesign übergeben können, das darin enthaltene Objekt mal als public definieren können und dann direkt onwDesign mit
deineHautklassenInstanz.deineDetMalenInstanz.
darauf zugreifen können.
Gruß
Sparrow
|
| |
13.05.2005, 10:04
| Nach oben
#9 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 539
|
Perfekt! Danke!
|
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | Thema durchsuchen | | | | |