zurückgeben, einen Variablen Wert an Haupt-auf den button klicken
Möchte ich, dass main drucken soll Hallo (in einem pop-up Dialog box) jedesmal, wenn der button angeklickt wird. So entwarf ich das folgende Programm, aber es scheint nicht zu funktionieren. Das Programm wird kompiliert und ausgeführt Prima, aber wenn ich auf die Schaltfläche klicke, sehe ich nicht die Dialog-box aufspringen. Ich habe die getter und setter der booleschen variable (button_clicked), dessen Wert geprüft wird in der main () - block.
Bitte helfen Sie, wenn Sie wissen..
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class abc extends JFrame implements ActionListener{
boolean button_clicked = false;
JButton b1;
abc(){
this.setSize (400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.createUI();
}
void createUI(){
this.setLayout(null);
b1 = new JButton("x");
b1.setSize(110,30);
b1.setLocation(10,210);
this.add(b1);
b1.addActionListener(this);
}
public boolean isButton_clicked() {
return button_clicked;
}
public void setButton_clicked(boolean button_clicked) {
this.button_clicked = button_clicked;
}
public void actionPerformed(ActionEvent arg0) {
button_clicked = true;
//I don't want to print the dialogue box from here..
//I want to keep everything under main()'s control.
}
}
public class tempMain extends JFrame {
public static void main(String[] args) {
abc temp = new abc();
temp.setVisible(true);
while(true){
if(temp.isButton_clicked())
JOptionPane.showMessageDialog(null, "Hello");
}
}
}
- Sie sollten nie mit einer while-Schleife so. Dies hat eine Menge design-Fehler. Deine While-Schleife 1 werden Essen, bis die CPU-denn es schläft nie. Wenn Sie müssen, verwenden Sie eine while-Schleife wie diese dann zumindest stellen es in einen neuen thread und Schlaf den Faden nach jeder iteration. Jedoch ist dies immer noch ein schlechtes design.
- Warum die Kommentare in Ihrem code? Wenn du gehst, darauf zu bestehen, dass bad-design für Ihr Programm, zumindest rechtfertigen Sie den Grund dafür.
- Ich vermute, dass der Kommentar ist ein Plädoyer für ein nicht modales Dialogfeld aus, und spielen Sie die
PropertyChangeListener
Karte. - Ihre Vermutung ist genauso gut wie jeder andere, da der ursprüngliche poster scheint nicht preisgeben wollen, die motivation hinter seiner Anfrage.
- Ich habe meine Beweggründe für solch ein design in einer Antwort unten..
- Meine app verlangt von mir, dies zu tun. Eigentlich ist der drucken-Dialog-Anweisung war nur ein Haltepunkt, um zu überprüfen, ob die Steuerung wird wieder in Haupt -, unter bestimmten Voraussetzungen, oder nicht. (Die Kontrolle wird wieder an die main aber die button_clicked Wert wird nie 'wahr' oder etwas, was ich Schätze). In das eigentliche Programm, das dialoguebox Linie wird ersetzt mit einem code, der halten muss, das warten auf eine Benutzereingabe. Das ist, warum diese eine Weile verwendet wird. Ich werde versuchen, es umzusetzen in einem anderen thread. Vielen Dank für das heads-up..
- Ich habe keine Ahnung was das ist.. ich studieren werde, über die es weiter..
- wenn Sie auf der Suche nach guten modularen Programm-design, der Haupt-Logik und den Status Ihrer Programm sollte nicht einmal in Ihrem GUI-Klassen, sondern in Ihrem Modell-Klassen, wieder eine la MVC als pro meinen anderen Kommentar.
- Es gibt ein gutes Beispiel von Hovercraft hier, genannt hier.
- vielen Dank für das Beispiel.. ich denke, dadurch wird mein Leben viel leichter sein, wenn ich es verstehe.
- Bitte lernen Sie die java Namenskonventionen halten. Und während Sie an zu lernen: nie-immer manuelle Dimensionierung/Anordnung der Komponenten, das ist die exklusive Aufgabe eines geeigneten LayoutManager.
- was ist, wenn ich will, um die Komponenten zu identifizieren, die als pro mein Wunsch, und nicht eine vordefinierte layout..??
- Sie wollen nicht, dass immer, auch wenn Sie es noch nicht wissen 🙂 Und selbst wenn Sie es wirklich wollen: schreiben Sie einen LayoutManager, der genau das tut, was Sie wollen.
- Ich werde beachten Sie, dass!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits betont, eine Reihe von Menschen, die Sie Konzept und design sind fehlerhaft. Werde ich nicht weiter eingehen, da es bereits behandelt worden, aber als Anregung könnte man versuchen...
Und in Ihrem
abc
Klasse...Bewegen Sie den
JOptionPane.showMessageDialog()
rufen Sie an unter deractionPerformed()
- Methode und löschen Sie diewhile()
Sache unter denmain
Methode.Möchten Sie vielleicht, darüber zu Lesen, "Wie Schreibt man eine Action-Listener" zu helfen, Sie bei der Implementierung eines
ActionListner
im code.Die grundlegende Idee für den code wäre:
JButton
actionPerformed()
- und schreiben Sie Ihre Logik zu zeigen, wird ein Dialogfeld. "Wie Machen Sie Dialoge" wäre ein weiteres nützliches tutorial für Euch.JButton
, die Kontrolle zu übertragen, um ein anderes Objekt. Würde Ihrabc
Klasse haben Referenz auf eine Instanz der eigenen Klasse? Wenn ja, dann können Sie over-ride dieactionPerformed()
und rufen Sie die entsprechende Methode der anderen KlasseAls @Quinman darauf hingewiesen, den dein code-design ist wirklich fehlerhaft. Ich verstehe, dass Sie nicht möchten, setzen Sie die JOptionPane unter der actionperformed-Methode aus irgendeinem persönlichen Grund, den ich nicht verstehe. Basierend auf dieser Prämisse, dass ich denke, dass die beste Lösung wäre die Einrichtung eines callback, das heißt, Ihr JFrame wissen die main-Klasse und nennen Sie es, wenn auf die Schaltfläche geklickt wird.
Ist es möglich, dass dieser Mechanismus unabhängig von der main-Klasse. Bitte überprüfen Sie die Observer design pattern, um zu verstehen, wie das geht.
Dein code hat auch ein weiteres Manko - wenn die Schaltfläche geklickt wird, bekomme ich unendlich Hello-Nachrichten. Um das zu vermeiden, sollten Sie die button_clicked variable auf false. Ich erwähne nur, dass so ein allgemeiner Tipp, für die in Wahrheit du solltest wirklich loszuwerden, die damit beschäftigt zu warten, dass Ihr, während verursacht.
Suchen Sie vielleicht für eine ungebunden dialog. In diesem Beispiel, die Haupt-panel, benannt
Observer
, hört einObservedPanel
in einen dialog. Durch die Verwendung einesPropertyChangeListener
alle änderungen an den dialog sofort in das main-panel.Ausgehend von den Kommentaren, die Sie zur Verfügung gestellt, das Sie wiederverwenden möchten Ihre
abc
- Klasse (die hat einen sehr schlechten Namen und entspricht nicht dem Java naming standards) für verschiedene Zwecke, so dass Sie nicht aufnehmen wollen, der code, der ausgeführt wird, wenn Sie die Taste in derabc
Klasse.Gibt es mehrere Lösungen für diese (wo die erste ist meine bevorzugte eine)
Action
im Konstruktor Ihrerabc
Klasse und einige, dieAction
zu denJButton
. Auf diese Weise die Klasse, die Konstrukte derabc
Instanz ist verantwortlich für das Verhalten, wenn die Taste gedrückt wirdabc
Abstrakt und lassen Sie IhreActionListener
Anruf, dass eine abstrakte Methode. Sie können dann die konkreten Implementierungen dieser Klasse, jedes mal, wenn Sie wollen, sich anders Verhalten.Weitere Hinweise auf den code:
while( true )
Schleifenull
layout und die Verwendung einerLayoutManager
statt