Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Erste SchritteIn Klasse B die Methode aus Klasse A in Klasse A ausführen
bin schon lange auf der Suche und finde keine Lösung. Ich habe folgendes vor:
Es gibt Klasse A und Klasse B
Ich habe in Klasse B einen Button, der in Klasse A eine Methode ausführen soll. Diese Methode steht auch in Klasse A.
Wenn ich jetzt in der Klasse B "KlasseA meineKlasse = new KlasseA" -> "meineKlasse.Methode()" schreibe, ist das ja Quatsch. Dann wird die Methode nämlich in Klasse B ausgeführt. Soll aber in Klasse A ausgeführt werden.
Hat jemand ein Codebeispiel oder ähnliches?
Ist das überhaupt verständlich oder wird mein Code gebraucht?
Wenn ich jetzt in der Klasse B "KlasseA meineKlasse = new KlasseA" -> "meineKlasse.Methode()" schreibe, ist das ja Quatsch. Dann wird die Methode nämlich in Klasse B ausgeführt.
In der Klasse B wird eine Methode auf einem Objekt der Klasse A aufgerufen. Der Inhalt der Methode läuft natürlich im Kontext der Klasse A mit den für dieses Objekt (gerade) gesetzten Eigenschaften weil diese die Klasse B (hoffentlich) gar nicht kennt.
Danke. Hab zwar nur zur Hälfte verstanden aber das hat wohl gereicht.
Die Methode ist jetzt static. Dafür musste ich auch das anzusprechende Object auf static setzen. Jetzt geht es aber, da ich kein "new" mehr benutze.
Danke. Hab zwar nur zur Hälfte verstanden aber das hat wohl gereicht.
Die Methode ist jetzt static. Dafür musste ich auch das anzusprechende Object auf static setzen. Jetzt geht es aber, da ich kein "new" mehr benutze.
Sorry, dachte das wäre klar.
Ich habe diese zwei Klassen. Durch "mousePressed" aus Klasse "MouseL" soll die Methode "changeBalken()" aus Klasse "Start" ausgeführt werden, so das ich die Änderung auch sehe. Das "System.out.println..." aus der Methode "changeBalken()" wird ausgeführt und ist auch in der Konsole zu sehen.
Also zu Anfang wird ja mein JFrame erstellt und darin die ganzen Balken (sind JLabels). Durch einen Klick soll die Methode ausgeführt werden und den Wert ändern.
Java:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MouseL implements MouseListener {
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
Start myStart = new Start();
myStart.changeBalken();
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Java:
import java.awt.Color;
import java.util.Random;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Start extends JFrame implements ActionListener{
private JButton btnRunter;
public Balken[] balkens = new Balken[100];
private int balkenindex;
public Start(){
setSize(500,500);
setLayout(null);
Random zufall = new Random();
int posX = 0;
int posY = 0;
for (int i = 0; i < 20; i++){
Color farbe = new Color(zufall.nextInt(255),zufall.nextInt(255),zufall.nextInt(255));
balkens[i] = new Balken();
balkens[i].setBackground(farbe);
balkens[i].setBounds(posX, posY, 200, 20);
balkens[i].setText(String.valueOf(i));
balkens[i].setName(String.valueOf(i));
balkenindex = i;
balkens[i].getLabel();
//balkens[i].addMouseListener(new MouseL());
add(balkens[i]);
posY += 20;
}
balkens[17].setSize(100,20);
btnRunter = new JButton();
btnRunter.setBounds(200,0,200,20);
btnRunter.addActionListener(this);
add(btnRunter);
}
public void changeBalken() {
balkens[4].setText("Balken Nummer 4");
System.out.println("gehts?");
}
public static void main(final String args[]) {new Start().setVisible(true);}
}
class Balken extends JLabel {
private JLabel myLab = new JLabel();
public JLabel getLabel() {
setSize(225,20);
setOpaque(true);
addMouseListener(new MouseL());
return myLab;
}
}
[edit]DAS wird so überhaupt nichts ... denn wenn du von JFrame aus einen neuen Listener erstellst ... und in diesem wiederum ein neues JFrame ... dann wird das nicht nur zu ner endlos-rekursion und damit zu nem StackOverflowError ... sondern hat auch überhaupt keinen sinn da du mit völlig anderen objekten arbeitest
korrekterweise müsstest du (wie ich ja schon vermutet habe) MouseL eine instanz von Start mitgeben ... und das ging in dem du z.b. "new MouseL(this)" schreibst ... den konstruktor dann so
Java:
public MouseL(Start start) { this.start=start; }
und dann in der mousePressed() methode auf "start.changeBalken()" callst
dein code hat überhaupt null struktur und so wirklich OOP hast du auch noch nicht verstanden ... geschweige denn grundlagen von GUI-programmierung ...
ich würde dir erstmal empfehlen OOP zu lernen und danach GUI-entwicklung bevor du an diesem code weiterschreibst ...[/edit]
Wenn ich jetzt in der Klasse B "KlasseA meineKlasse = new KlasseA" -> "meineKlasse.Methode()" schreibe, ist das ja Quatsch. Dann wird die Methode nämlich in Klasse B ausgeführt. Soll aber in Klasse A ausgeführt werden.
wenn man sich den Stack ansieht dann stimmt das zwar schon irgendwie das A.someMethod() im kontext von B abläuft ... aber daran ändert sich nichts nur weil du STATIC nutzt ... denn dem STACK ist es eigentlich ziemlich egal ob er eine static method callt oder vorher ein objekt erzeugt und dann auf dieses den call los lässt ... das was in A.someMethod() abläuft läuft immer noch im stack und thread von B ... daran ändert static überhaupt nichts ...
generell ist das was du sagst recht wirr ... "A.someMethod() soll auch in A ablaufen, nicht in B" ... naja ... ähm ... dann musst du A auch einen eigenen thread und stack spendieren und dann in dessen loop irgendwie melden das "someMethod()" zu callen ist ... das wäre jetzt das einzige was dem was du hier sagst auch nur halbwegs ähnlich wäre
Java:
public class A implements Runnable
{
private boolean flag=false;
public A() { }
public void run()
{
while(true)
{
if(flag)
{
someMethod();
flag=false;
}
Thread.sleep(100);
}
}
private void someMethod()
{
// ...
}
public void setFlag()
{
flag=true;
}
}
Java:
public class B
{
// ...
public void someOtherMethod()
{
// ...
Thread aThread=new Thread(new A());
aThread.start();
// ...
aThread.setFlag();
// ...
}
// ...
}
das wäre jetzt das was dem was du hier ablässt am nächsten kommt ...
du machst aus A ein Runnable ... erzeugst einen neuen Thread dem du A übergibst ... startest diesen ... womit A seinen eigenen thread und stack erhält ... und callst dann irgendwann darauf die methode um das flag zu setzen ...
dann würde "someMethod" auch innerhalb von "A" ablaufen ... unabhängig von B ...
das was du gemacht hast ist absoluter mist ... denn in einer objekt-orientierten sprache prozedual zu schreiben und mit static um sich zu werfen ist eigentlich so ziemlich das falscheste was geht ... zu mal es deiner frage : "someMethod in A laufen lassen" nicht hilft ... denn egal ob static oder nicht ... wenn du "someMethod" in B callst ... läuft die methode auch im thread von B ab ... punkt ...
[edit]DAS wird so überhaupt nichts ... denn wenn du von JFrame aus einen neuen Listener erstellst ... und in diesem wiederum ein neues JFrame ... dann wird das nicht nur zu ner endlos-rekursion und damit zu nem StackOverflowError ... sondern hat auch überhaupt keinen sinn da du mit völlig anderen objekten arbeitest
korrekterweise müsstest du (wie ich ja schon vermutet habe) MouseL eine instanz von Start mitgeben ... und das ging in dem du z.b. "new MouseL(this)" schreibst ... den konstruktor dann so
Java:
public MouseL(Start start) { this.start=start; }
und dann in der mousePressed() methode auf "start.changeBalken()" callst
dein code hat überhaupt null struktur und so wirklich OOP hast du auch noch nicht verstanden ... geschweige denn grundlagen von GUI-programmierung ...
ich würde dir erstmal empfehlen OOP zu lernen und danach GUI-entwicklung bevor du an diesem code weiterschreibst ...[/edit]
Danke. Warscheinlich habe ich das gesucht. Das mein Code null Struktur hat, weiß ich auch. Das wird zu Testzwecken viel hin und her geschrieben. Soll kein wirkliches Programm werden.
das was du gemacht hast ist absoluter mist ... denn in einer objekt-orientierten sprache prozedual zu schreiben und mit static um sich zu werfen ist eigentlich so ziemlich das falscheste was geht ... zu mal es deiner frage : "someMethod in A laufen lassen" nicht hilft ... denn egal ob static oder nicht ... wenn du "someMethod" in B callst ... läuft die methode auch im thread von B ab ... punkt ...
heisen sin prinzipiell nicht dazu da sie in top-level-Klassen zu implementieren, die werden in anonymen Klassen dort implementiert, wo sie gebraucht werden. In Deinem Fall in der Klasse
Code:
Start
nach Zeile 26. Natürlich wird so eine anonyme Klasse mit so vielen Methoden unübersichtlich, daher gibt es für solche Interfaces bereits abstrakte Default-Implementierungen mit leeren Methoden (die also nichts tun...). Die heißen üblicher Weise Adapter, in diesem Fall [JAPI]MouseAdapter[/JAPI]. Das würde dann so aussehen:[JAVA=26] balkens = new Balken();
balkens.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
Balken klickZiel = ((Balken)arg0.getSource())
klickZiel.setText("geklickt wurde auf Balken: "+klickZiel.getName()); // einen Namen zu vergeben war 'ne gute Idee
}
}); [/code]
Deine Klasse
Code:
MouseL
kannst Du also löschen.
Die innere Klasse
Code:
Balken
gehört streng genommen auch gelöscht. Was Du da tust könntest Du auch nach der Zeile 26 noch machen. Wenn Du diese Konfigurationen gern zusammenfassen willst (was Du auch solltest), dann in einer Methode von
Code:
Start
Die arbeit so zu verteilen ist jeden falls nicht gut.
Danke. Warscheinlich habe ich das gesucht. Das mein Code null Struktur hat, weiß ich auch. Das wird zu Testzwecken viel hin und her geschrieben. Soll kein wirkliches Programm werden.
hat damit nichts zu tun ... es geht um den fakt das der code an sich müll ist ... und das du es dir so falsch angewöhnen wirst wenn du da nicht schnell was gegen unternimmst ... zu mal deine ausdrucksweise auch stark zu wünschen übrig lässt ...
und das STATIC hier hilft liegt nur daran das du dann nicht mehr mit zwei verschiedenen objekten sondern nur noch mit einer klasse arbeitest ... und sowas geht in OOP mal überhaupt nicht ...