Java : Swing : Masquer la fenêtre après bouton enfoncé
J'ai un bouton dans une java cadre que lorsqu'il est pressé, il lit une valeur dans un champ de texte et utilise cette chaîne comme un nom de port de la tentative de connexion à un périphérique série.
Si cette connexion est réussie, la méthode renvoie true, sinon elle retourne false. Si elle retourne true je veux le cadre de disparaître. Une série d'autres images spécifiée dans d'autres classes apparaissent alors avec des options pour contrôler le périphérique série.
Mon problème est le suivant: le bouton est connecté à une action de l'auditeur, lorsqu'il est pressé cette méthode est invoquée. Si j'essaie d'utiliser le cadre.setVisible(true); méthode java jette un résumé bouton d'erreur parce que je suis effectivement dire qu'il disparaisse à l'image contenant le bouton devant la presse le bouton de la méthode qu'il a quitté. Enlever le cadre.setVisible(true); autoriser le programme à exécuter correctement cependant, je suis reparti avec une belle persistance cadre de raccordement qui n'est plus d'aucune utilité.
Comment puis-je obtenir le cadre de disparaître en appuyant sur un bouton le bouton?
package newimplementation1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
*
* @author Zac
*/
public class ConnectionFrame extends JPanel implements ActionListener {
private JTextField textField;
private JFrame frame;
private JButton connectButton;
private final static String newline = "\n";
public ConnectionFrame(){
super(new GridBagLayout());
textField = new JTextField(14);
textField.addActionListener(this);
textField.setText("/dev/ttyUSB0");
connectButton = new JButton("Connect");
//Add Components to this panel.
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
add(textField, c);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
add(connectButton, c);
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
boolean success = Main.mySerialTest.initialize(textField.getText());
if (success == false) {System.out.println("Could not connect"); return;}
frame.setVisible(false); //THIS DOES NOT WORK!!
JTextInputArea myInputArea = new JTextInputArea();
myInputArea.createAndShowGUI();
System.out.println("Connected");
}
});
}
public void actionPerformed(ActionEvent evt) {
//Unimplemented required for JPanel
}
public void createAndShowGUI() {
//Create and set up the window.
frame = new JFrame("Serial Port Query");
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//Add contents to the window.
frame.add(new ConnectionFrame());
frame.setLocation(300, 0);
//Display the window.
frame.pack();
frame.setVisible(true);
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
System.out.println("Exiting Gracefully");
Main.mySerialTest.close();
((JFrame)(e.getComponent())).dispose();
System.exit(0);
}
});
}
}
JFrame
. Petits éléments de l'INTERFACE utilisateur peut être sauté dans une JDialog
ou JOptionPane
tout un CardLayout
ou une variété de composants Swing peut être utilisé pour inclure plus d'une INTERFACE utilisateur (ou "écran") dans un récipient.Pour mieux aider plus tôt, après une SSCCE.
OriginalL'auteur Zac | 2011-09-07
Vous devez vous connecter pour publier un commentaire.
Votre problème est avec cette ligne:
Vous êtes en train de créer un nouveau ConnectionFrame objet, et donc l'image de votre bouton essaie de fermer n'est pas le même que celui affiché, et c'est la source de votre problème.
Si vous le remplacez,
de sorte que les deux JFrames sont un et le même, les choses peuvent fonctionner plus en douceur.
Mais, cela étant dit, l'ensemble de votre conception sent mauvais et j'avais le repenser en plus de la programmation orientée objet et moins statique de la mode. Aussi, utiliser des boîtes de dialogue où les boîtes de dialogue sont nécessaires, pas de cadres, et plutôt que de dialogues envisager de permutation des points de vue (JPanels) via CardLayout comme une meilleure option encore.
Moi-même, j'avais créer un "stupide" GUI pour cela, celui qui crée un Composite (ici dans mon exemple, il s'étend d'un Composite pour des raisons de simplicité, mais je préfère éviter l'extension de si pas nécessaire), et je voudrais que celui qui est de l'appel de ce code de décider quoi faire avec l'information via un certain contrôle. Par exemple,
De nouveau, quelque chose en dehors de l'interface utilisateur graphique simple serait de prendre des décisions sur ce qu'il faut faire avec le texte que le champ contient et ce qui à faire avec l'interface graphique qui affiche de ce Composite:
Aussi, vous serez susceptibles de faire toute connexion à un thread d'arrière-plan afin de ne pas geler votre GUI, probablement un SwingWorker. Peut-être quelque chose comme ceci:
Wow merci à tous ceux qui ont répondu très rapidement. J'ai posté cette question, puis s'en alla pour 15 minutes de réflexion il pourrait y avoir 1 réponse si j'avais de la chance ... et il y en avait 4!
veuillez voir le modifier à ma réponse ci-dessus.
OriginalL'auteur Hovercraft Full Of Eels
L'exécution de votre extrait de code (après retrait et de peaufinage autour de l'classes personnalisées), déclenche une NPE. La raison est que l'image que vous r'accès est null. Et c'est parce qu'il n'est jamais ensemble. Mieux vaut ne pas compter sur n'importe quel champ, laissez le bouton de trouver sa toplevel ancêtre et de masquer le fait que, comme dans
windowForComponent
. Doit être accepté comme une réponseOriginalL'auteur kleopatra
Votre code sera plus lisible si vous avez nommé JFrame instances xxxFrame, et un Composite instances xxxPanel. Nommage Composite instances xxxFrame rend les choses très déroutant.
Il serait également utile si vous avez collé la trace de la pile de l'exception.
Je soupçonne que le problème vient du fait que l'image est nulle. Cela est dû au fait que le champ de cadre n'est initialisée dans le createAndShowGUI méthode, mais cette méthode ne fait pas apparaître le panneau de connexion, mais une nouvelle, qui ont donc une valeur null champ de cadre:
Le code de createAndShowGUI doit contenir
plutôt que
OriginalL'auteur JB Nizet
pour le Swing de l'interface graphique est mieux de ne créer qu'une fois
JFrame
et un autre Niveau Supérieur Conteneurs seraitJDialog
ouJWindow
(onu-décoré par défaut),exemple simple ici
mieux serait de ré-utilisation de Haut-Niveau des Conteneurs, de créer beaucoup de Haut Niveau, les Conteneurs de l'Exécution (de mémoire possible manque)
OriginalL'auteur mKorbel