Guten Tag,
wie kann ich auf Variablen zugreifen die in einer anderen Klasse vorliegen?
Am besten gar nicht.
Definiere in der Klasse, in der die Variable definiert ist eine Methode und mach die Änderung an der Variablen dort.
bye
TT
Wie erstelle ich dann eine Methode auf die ich dann in der anderen Klasse auslösen kann, um diese Variable beispielsweise alle auf 0 zu setzen.
private int changeMe = 1;
public void change() {
this.changeMe = 0;
}
}
public class Bar {
public static void main(String[] args) {
Foo f = new Foo();
f.change();
}
}
such mal hier im Forum nach Tutorials/Buecher etc. Klingt nach dem Fehlen von Grundlagen
Methoden manipulieren Eigenschaften von Objekten.
private int x;
public MyClass() {
x = 5;
}
public void setX(int i) {
x = i;
}
}```
Um nun die Variable auf 0 zu setzen, brauchst du ein Objekt, also eine Instanz der Klasse MyClass.
```MyClass mc = new MyClass();```
Anschließend kannst du die Eigenschaften von deinem MyClass-Objekt manipulieren:
```mc.setX(0);```
Ich weiß gar nicht ob ich jetzt hier auch noch eine Frage dazustellen kann, mach das einfach mal:
Habe ein ähnliches Problem und zwar rufe ich aus meiner MainKlasse eine Methode auf in einer anderen Unterklasse, die beinhaltet das die Variabel zurück gesetzt werden, nur setzt er diese nicht zurück, zumindest arbeitet mein Programm weiter mit den alten Daten.
Exceptions gibt es auch nicht:
Main Klasse:
{
public void actionPerformed(ActionEvent event)
{
PicturePanel f = new PicturePanel();
f.ResetVariables();
}
}```
UnterKlasse:
``` public void ResetVariables()
{
try {
Rges = 0.0;
Uges = 0.0;
I = 0.0;
Rven = 0.0;
Uven = 0.0;
Lven = 0.0;
for (int i=0;i<7 ;i++ )
{
arrayR** = "0.0";
arrayU** = 0.0;
}
}
catch(Exception e) {
System.out.println(e);
}
} ```
Mach ich da irgendwas falsch, oder liegt es wohl an einer anderen Stelle im Code?
Du setzt die Variablen in einer ganz anderen Instanz zurück.
Sieh dir mal den Code in deiner Klasse ResetActionListener an. Da erzeugst du eine neue Instanz.
Du müsstest die Methode auf der Instanz aufrufen, mit der du gerade arbeitest.
Ich weiß jetzt nicht ob ich dich verstanden habe:
Aber diese ResetVariables liegt doch in einer eigenen Instanz, also hier:
{
private Image background;
int xpos, ypos;
double Rges = 0.0, Uges=0.0, I=0.0, Rven=0.0, Uven = 0.0, Lven = 0.0;
String[] arrayR = new String [7];
double arrayU[] = new double[7];
public void ResetVariables()
{
try {
Rges = 0.0;
Uges = 0.0;
I = 0.0;
Rven = 0.0;
Uven = 0.0;
Lven = 0.0;
for (int i=0;i<7 ;i++ )
{
arrayR** = "0.0";
arrayU** = 0.0;
}
}
catch(Exception e) {
System.out.println(e);
}
}
public PicturePanel() {..}
Also ich will über ein Mainmenu (welches sich in einer anderen Klasse befindet) mit dem Menuitem Reset die Variabeln aus der Klasse PicturePanel zurücksetzen.
Ich habe mal auch zu testzwecken hier so was ergänzt:
{
try {
Rges = 0.0;
Uges = 0.0;
I = 0.0;
Rven = 0.0;
Uven = 0.0;
Lven = 0.0;
System.out.println("Testen ob er was anzeigt");
for (int i=0;i<7 ;i++ )
{
arrayR** = "0.0";
arrayU** = 0.0;
}
}
catch(Exception e) {
System.out.println(e);
}
}
Und da kam auch der Satz “Testen ob er was anzeigt”, nachdem ich das Menüitem “Reset” geklickt habe
Ja, das kann schon alles sein. Aber warum kommt die Ausgabe?
Weil die Ausgabe auf der Console auch in deiner neuen Instanz existiert und aufgerufen werden kann, bzw. wird.
Du erzeugst eine neue (leere) Instanz, und die lebt auch nur sehr kurz. Nämlich nur in der actionPerformed()-Methode.
Du musst aber zum Resetten die Methode in der bereits erzeugten, aktuell benutzten Instanz aufrufen. Weil das Reset betrifft doch auch genau diese Instanz.
Mir fehlt es da irgendwie an dem Verständnis, wollte das nun so lösen:
PicturePanel.ResetVariabels();
Also im ActionListener.
Weil ich dachte, das ich ohne eine neue Instanz zu erzeugen eine Methode aus der anderen Klasse aufrufen kann damit.
Ich muss die doch auch in der Main Klasse haben, weil ja auch dort das ActionPerformed von dem Menuitem ist.
PicturePanel.ResetVariabels();
Das wäre ein statischer Methodenaufruf. Also auch nicht das was du brauchst…
Poste doch mal etwas mehr Code, am besten ein KSKB. Außerdem solltest du dir noch ein paar Grundlagen zur Objektorientierung anschauen, dir fehlen da scheinbar ein paar wichtige Dinge.
Wo erzeugst du denn dein PicturePanel-Objekt?
Habe jetzt mal den ganzen Code der jetzt nicht dafür gebraucht ist mal entfernt, hier: (Ist damit KSKB gemeint ?)
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.io.*;
public class Ventilator
{
JFrame f = new JFrame("Ventilator");
public String[] arraylokal;
public Ventilator()
{
initComponents();
}
private void initComponents()
{
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new PicturePanel());
f.pack();
f.setSize(980, 352);
f.setLocationRelativeTo(null);
MainMenu();
f.setVisible(true);
}
public void MainMenu()
// Menüleiste
{
JMenuBar jmb = new JMenuBar();
JMenu jmFile = new JMenu("Datei");
JMenuItem Reset = new JMenuItem("Alles löschen");
JMenuItem Save = new JMenuItem("Speichern");
JMenuItem Exit = new JMenuItem("Beenden");
jmFile.add(Reset);
jmFile.add(Save);
jmFile.addSeparator();
jmFile.add(Exit);
Reset.addActionListener(new ResetActionListener());
jmb.add(jmFile);
f.setJMenuBar(jmb);
}
// ActionListeners Start
class ResetActionListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
PicturePanel.ResetVariabels();
}
}
// ActionListeners Ende
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Ventilator();
}
});
}
}```
``` import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.ToolTipManager;
public class PicturePanel extends JPanel
{
private Image background;
int xpos, ypos;
double Rges = 0.0, Uges=0.0, I=0.0, Rven=0.0, Uven = 0.0, Lven = 0.0;
String[] arrayR = new String [7];
double arrayU[] = new double[7];
public void ResetVariables()
{
try {
Rges = 0.0;
Uges = 0.0;
I = 0.0;
Rven = 0.0;
Uven = 0.0;
Lven = 0.0;
for (int i=0;i<7 ;i++ )
{
arrayR** = "0.0";
arrayU** = 0.0;
}
}
catch(Exception e) {
System.out.println(e);
}
}
public PicturePanel() {
super(new GridBagLayout());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(background != null) {
g.drawImage(background, 0, 0, this);
}
}
}
Er stell dir mal ein Objekt PicturePanle als Membervariable deiner Klasse Ventilator, so wie auch das Frame Objekt (anstelle es anonym in deinem Frame zu erzeigen). Dann kannst du es in deinem Listener auch ansteuern.
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.io.*;
public class Ventilator
{
JFrame f = new JFrame("Ventilator");
public String[] arraylokal;
// hier bekannt machen
PicturePanel pp= new PicturePanel();
//...
private void initComponents()
{
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// hier wiederverwenden
f.add(pp);
f.pack();
f.setSize(980, 352);
f.setLocationRelativeTo(null);
MainMenu();
f.setVisible(true);
}
//..
// ActionListeners Start
class ResetActionListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
// hier wiederverwenden
pp.ResetVariabels();
}
}
..
}```
Wie schon von L-ectron-X erwähnt hast du die Variablen einer anderen Instanz zurückgesetzt. Du musst dir die Instanz, die du deinem Layout hinzufügst in einer Instanzvariablen merken:
public class Ventilator
{
private PicturePanel picturePanel;
// ...
private void initComponents()
{
picturePanel = new PicturePanel();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(picturePanel);
f.pack();
f.setSize(980, 352);
f.setLocationRelativeTo(null);
MainMenu();
f.setVisible(true);
}
// ...
class ResetActionListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
picturePanel.resetVariabels();
}
}
// ...
}
So setzt du die Variablen der richtigen Instanz zurück.
Lege dir in Ventilator eine private Variable an!
private PicturePanel picPanel;
In initComponents() von Ventilator erzeugst du das Objekt als erste Anweisung!
picPanel = new PicturePanel();
Zeile 22 ersetzt du dann mit:
f.add(picPanel);
…und schließlich in der actionPerformed()-Methode schreibst du:
picPanel.ResetVariables();
BTW: Methodennamen sollten mit einem kleinen, Klassennamen mit einem großen Buchstaben beginnen (Coding Conventions)
Also erstmal dankeschön.
Ich habe das wirklich absolut genauso wie ihr das gemacht habt, der Compiler sagt mir aber:
Ventilator.java:95:14: error: cannot find symbol
ppFrame.ResetVariabels();
^
symbol: method ResetVariabels()
location: variable ppFrame of type PicturePanel
1 error
Vergleiche mal, was du geschrieben hast.
Hahaha, wie peinlich :rolleyes:
Das kann jedem mal passieren, deswegen sollte man mit einer ordentlichen IDE arbeiten, die einem eine gescheite Auto Vervollständigung anbietet, dann passieren solche Fehler seltener