Swing Extern den Text eines nicht fetsgelegten Buttons bekommen.

DaCrazyJavaExpert

Bekanntes Mitglied
Hallo,
mit getText() kann man ja gewöhnlich den Textt einer Komponetente bekommen. Wie bekomme ich aber einen Text von einer Komponente, die ich nicht direkt aufrufe, sondern über eine Methode aufrufe? Also etwa so:
Ich habe hier die Methode, mir der ich den Textt eines unspezifischen Buttons bekommen will und ihn dann verarbeiten will:
Java:
private String addButtonsAction() {
        bill += getText() +  " "; // Ich möchte den Text eines Buttons bekommen.
        this.inputTxtArea.setText(bill);
        return bill;
    }
Die Methode will ich beim drücken eines Buttons, welcher in einer Liste ist ausführen:
Java:
private void addFeaturesToButton() {
        for (JButton button : buttons.getButtons()) {
            button.addActionListener(new ActionListener() {
               
                @Override
                public void actionPerformed(ActionEvent e) {
                    JButton b = (JButton) e.getSource();
                    b.addButtonsAction(); //Diese Methode will ich irgendwie aufrufen, ich weiß allerdings nicht wie ich es auf den spezifischen Button [button] der for-each-Schleife mache.
                }
            });
        }
    }
Ich hoffe mein Problem war vertsändlich formuliert und ihr könnt mir helfen. Vielen Dank.
 
Die Methode sollte nicht auf dem Button aufgerufen werden, sondern der jeweilige Button sollte der Methode übergeben werden, als Parameter.
 
Ich hab noch ein Problem, will dafür aber jetzt nicht umbedingt einen neuen Thread aufmachen - hat sowieso noch mit dem gleichen Projekt zu tun.
Also, ich habe mir eine statische getInstance Methode in einer Klasse erstellt um eine Instanz von ihr in einer anderen Klasse nutzen zu können. Allerdings kommt da eine Exception.
Meine getInstance-Methode sieht so aus:
Java:
private static Calculator calcInstance;   

public static Calculator getInstance() {
        if (calcInstance == null) {
            calcInstance = new Calculator();
        }
        return calcInstance;
    }

Und diese Methode rufe ich in einer anderen Klasse so auf:
Java:
private Calculator calc;

public Buttons() {
        this.calc = Calculator.getInstance();
}
Als Exception kommt eine StackOverflowException:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.awt.Component.setBackground(Unknown Source)
at javax.swing.JComponent.setBackground(Unknown Source)
at javax.swing.LookAndFeel.installColors(Unknown Source)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at de.m_ver.worktoolbox.gui.calculator.Calculator.<init>(Calculator.java:29)
at de.m_ver.worktoolbox.gui.calculator.Calculator.getInstance(Calculator.java:93)
Ich brauche die Instanz nur um JButtons aus der Klasse der Instanz in eine Liste (ein Stack) zu packen.
 
Mein Konstuktor sieht so aus:
Java:
public Calculator() {
        this.initialComponents();
        this.initialCalcButtons();
        this.buttons = new Buttons();
        this.addFeaturesToButton();
        this.refactorComponents();
    }
In dem sehe ich jetzt keinen Fehler. Es ist ja irgendwas mit dem getInstance
 
Ich habe keine Ahnung wo das getInstance() als erstes aufgerufen wird. Ich denke das ist aber nicht so ausschlaggebend. Sagen wir es wird irgendwo folgendes gemacht:
Code:
Calculator.getInstance()

Es wird per
Code:
if (calcInstance == null) {
festgestellt, dass ein Calculator Objekt erzeugt werden muss. Also gehts in dessen Konstruktor weiter:
Hier wird dann
Code:
new Buttons()
aufgerufen. In dessen Konstruktor wird aber folgendes gemacht:

Code:
this.calc = Calculator.getInstance();

Das heisst wir treffen wieder auf:
Code:
if (calcInstance == null) {
Jetzt könnte man erwarten, dass er dieses if überspringt, weil wir hier ja bereits waren und die Klassenvariable "calcInstance" gefüllt sein müsste...

Dem ist aber nicht so. Denn: wir haben den Konstruktor von Calculator() noch gar nicht verlassen. Das Calculator Objekt ist noch nicht fertig erzeugt und somit ist die Klassenvariable "calcInstance" immer noch null.
Hier findet also eine "Endlosschleife" statt. Von getInstance() -> new Calculator() -> new Buttons() -> getInstance() -> new Calculator() -> new Buttons() usw
 
Danke,
Calculator.getInstance() wird nur ein einziges mal aufgerrufen, und zwar im Konstruktor von der Klasse Buttons. Ich vertstehe es irgendwie nicht so ganz. Wie ändere ich es denn, dass diese getInstance Methode nicht immer wiederholt wird?
 
Ja im Constuktor von der Klasse Calculator:
Java:
public Calculator() {
        this.initialComponents();
        this.initialCalcButtons();
        this.buttons = new Buttons();
        this.addFeaturesToButton();
        this.refactorComponents();
    }
Und in der Klasse Buttons rufe ich getInstance so auf:
Java:
private Calculator calc;

public Buttons() {
        this.calc = Calculator.getInstance(); //hier, einmal im Konstruktor
        this.buttons = new Stack<JButton>();
        this.addButtonsFeatures();
    }
 
Das muss auch noch irgendwo anders sein. Von selber führst sich ja kein Konstruktor aus. Wie gesagt entweder wird "Calculator.getInstance()" initial aufgerufen oder "new Buttons()"
Das ist aber auch egal. Fehler ist, dass durch den Aufruf von "new Buttons()" im Konstruktor von Calculator immer wieder "Calculator.getInstance()" aufgerufen wird. Nämlich weil getInstance() nie verlassen wird und somit die Klassen Variable "calcInstance" immer null sein wird. Darum wird immer wieder der Konstruktor von Calculator aufgerufen. Der ruft dann wieder den Konstruktor von Buttons auf usw.

Ich würde vorschlagen, du entfernst das Attribut "calc" aus der Klasse Buttons. Da Calculator eh ein Singleton ist, ist es meiner Meinung nach gar nicht notwendig es in ein Attribut zu legen. Wo du den Calculator brauchst, rufst du einfach Calculator.getInstance() auf und benutzt ihn so.
 
Gerne. Ansonsten könntest du dich mal mit dem Debugger beschäftigen. Wenn man damit so Schritt für Schritt durch den Code geht, sieht man am besten wie sich das Programm zur Laufzeit verhält.
 

Neue Themen


Zurück
Oben