2010-06-24 6 views
3

Je suis nouveau dans les boîtes de dialogue Java Swing/AWT (ce qui explique à quel point cette boîte de dialogue ressemble à un amateur, toute aide pour mieux l'organiser est la bienvenue :) et je suis difficulté à fermer cette fenêtre popUp lorsque l'un des deux JButtons sont cliqués.Comment fermer une fenêtre basée sur JFrame avec un événement clic JButton

je l'ai déjà des options éprouvées comme frame.dispose(), frame.setVisible(false) et même SwingUtilities.getWindowAncestor(this).dispose();

Encore une fois, ceci est une fenêtre secondaire invoquée par un autre cours d'exécution principal de processus, donc je veux juste cette fenêtre particulière popUp pour fermer et ne pas affecter la principale processus. Sinon, je pourrais utiliser System.exit

Comme je l'ai mentionné, toutes les autres suggestions pour améliorer l'aspect général de la boîte de dialogue sont appréciées.

Mon code entier est comme ci-dessous:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class UpgradePopupWindow extends JPanel implements ActionListener { 
    public static UpgradePopupWindow mainWindow; 

    static final long serialVersionUID = 0; 

    final String upgrade = "Continue Upgrade"; 
    final String restore = "Restore"; 

    JPanel panels; 
    JButton flashMe; 
    JButton helpMe; 
    JTextArea Message; 
    JFrame frame; 

    protected JTextArea addText(String text, boolean visible, int fontStyle) { 
    JTextArea textArea = new JTextArea(text); 

    textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$ 

    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setForeground(Color.WHITE); 
    textArea.setOpaque(false); 
    textArea.setVisible(visible); 
    textArea.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(textArea); 

    return textArea; 
    } 

    public UpgradePopupWindow(Object ft) { 
    String text = "This is the random text for now. I will bother about the actual content later"; 
    addLabel(text, Font.PLAIN, 12); 

    flashMe = new JButton(upgrade); 
    flashMe.setActionCommand("upgrade"); 
    flashMe.addActionListener(this); 
    flashMe.setEnabled(true); 
    add(flashMe); 


    helpMe = new JButton(restore); 
    helpMe.setActionCommand("restore"); 
    helpMe.addActionListener(this); 
    helpMe.setEnabled(true); 
    add(helpMe); 
    } 

    protected JLabel addLabel(String text, int fontStyle, int size) { 
    JLabel label = new JLabel(text); 
    label.setFont(new Font("SansSerif", fontStyle, size)); 
    label.setAlignmentX(Component.CENTER_ALIGNMENT); 
    label.setOpaque(false); 
    label.setVisible(true); 
    label.setForeground(Color.BLUE); 

    add(label); 
    return label; 
    } 

    public void createGUI(Object obj) { 
    //Create and set up the frame. 
    frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //create and setup the content pane 
    UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj); 

    popUpContentPane.setOpaque(true); 
    frame.setContentPane(popUpContentPane); 

    frame.pack(); 
    frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
     frame.dispose(); 
     SwingUtilities.getWindowAncestor(this).dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
     frame.dispose(); 
    } 
    } 
} 
+1

Je n'arrive pas à comprendre vos intentions. Qui appelle la méthode 'createGUI'? Quel est le 'Object ft' transmis au constructeur? J'ai fait quelques suppositions et j'ai joué un peu avec ça et le 'frame.dispose' a semblé fonctionner correctement. –

+0

Avez-vous dit, vous voulez fermer une pop-up déclenchée par une autre méthode principale? Si vous n'avez pas de référence, vous ne pouvez pas le fermer. Ce panneau est-il utilisé dans ce popup? – OscarRyz

Répondre

2

Le problème est que votre méthode de createGUI n'est pas statique. Donc j'imagine que vous créez d'abord un UpgradePopupWindow, en appelant createGUI dessus, qui à son tour crée un UpgradePopupWindow enw.

Essayez ceci:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class TempTest 
{ 
    public static void main(String[] args) 
    { 
     UpgradePopupWindow.createGUI(null); 
    } 
} 


class UpgradePopupWindow extends JPanel implements ActionListener { 
    public static UpgradePopupWindow mainWindow; 

    static final long serialVersionUID = 0; 

    final String upgrade = "Continue Upgrade"; 
    final String restore = "Restore"; 

    JPanel panels; 
    JButton flashMe; 
    JButton helpMe; 
    JTextArea Message; 
    JFrame frame; 


    protected JTextArea addText(String text, boolean visible, int fontStyle) { 
    JTextArea textArea = new JTextArea(text); 

    textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$ 

    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    textArea.setEditable(false); 
    textArea.setForeground(Color.WHITE); 
    textArea.setOpaque(false); 
    textArea.setVisible(visible); 
    textArea.setAlignmentX(Component.CENTER_ALIGNMENT); 

    add(textArea); 

    return textArea; 
    } 

    public UpgradePopupWindow(JFrame frm, Object ft2) { 
    String text = "This is the random text for now. I will bother about the actual content later"; 
    addLabel(text, Font.PLAIN, 12); 
     frame = frm; 
    flashMe = new JButton(upgrade); 
    flashMe.setActionCommand("upgrade"); 
    flashMe.addActionListener(this); 
    flashMe.setEnabled(true); 
    add(flashMe); 


    helpMe = new JButton(restore); 
    helpMe.setActionCommand("restore"); 
    helpMe.addActionListener(this); 
    helpMe.setEnabled(true); 
    add(helpMe); 
    } 

    protected JLabel addLabel(String text, int fontStyle, int size) { 
    JLabel label = new JLabel(text); 
    label.setFont(new Font("SansSerif", fontStyle, size)); 
    label.setAlignmentX(Component.CENTER_ALIGNMENT); 
    label.setOpaque(false); 
    label.setVisible(true); 
    label.setForeground(Color.BLUE); 

    add(label); 
    return label; 
    } 

    public static void createGUI(Object obj) { 
    //Create and set up the frame. 
    JFrame frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //create and setup the content pane 
    UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(frame, obj); 

    popUpContentPane.setOpaque(true); 
    frame.setContentPane(popUpContentPane); 

    frame.pack(); 
    frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
     frame.dispose(); 
     SwingUtilities.getWindowAncestor(this).dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
     frame.dispose(); 
    } 
    } 

} 

Le principal changement est que le createUI est statique, et la UpgradePopupWindow prend le cadre dans le constructeur.

+0

Les mods pour avoir le constructeur à la fois l'objet et le cadre dans le cadre de la signature aide. Mais je ne vois toujours pas la disposition() ou SwingUtilities ... dispose() fonctionne encore. Bien que, selon l'une des suggestions, j'ai essayé simplement setVisible (faux) qui efface juste la boîte de dialogue, mais la boîte de dialogue ne quitte pas – LambeauLeap

+0

Vous ne savez pas pourquoi vous ne voyez pas le cadre fermé. J'ai effectivement couru le code et le cadre a été fermé quand le bouton a été cliqué. Avez-vous copié et collé le code? – mdma

+0

peu importe, il y avait quelques pièces manquantes. ça fonctionne bien maintenant. Merci encore! Btw, avez-vous des pointeurs pour embellir la boîte de dialogue générée. Actuellement, il rend les deux boutons à la fin de la ligne de texte. Je regarde le paragraphe 4line pour le remplacer et je veux que les deux boutons soient idéalement au-dessous de ce texte, avec probablement une fenêtre de taille fixe raisonnable. tous les commentaires ont apprécié. – LambeauLeap

0

Le problème est que vous avez deux instances de votre classe UpgradePopupWindow. Vous devez d'abord créer une instance pour pouvoir appeler la méthode createGUI(). Ensuite, dans la méthode createGUI, vous créez une autre instance de la classe. Je suis sûr que ce n'est pas ce que vous vouliez.

Une solution consiste à rendre statique la méthode createGUI(). J'ai enlevé la variable « cadre » de la classe et fait les modifications suivantes:

public static void createGUI(Object obj) { 
    //Create and set up the frame. 
    JFrame frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //create and setup the content pane 
    UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj); 

    popUpContentPane.setOpaque(true); 
    frame.setContentPane(popUpContentPane); 

    frame.pack(); 
    frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
//  frame.dispose(); 
     SwingUtilities.getWindowAncestor(this).dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
//  frame.dispose(); 
     SwingUtilities.getWindowAncestor(this).dispose(); 
    } 
    } 

    public static void main(String[] args) 
    { 
     UpgradePopupWindow.createGUI(null); 
    } 
2

Votre méthode createGUI() est un peu confus, il crée une autre instance de cette classe et vous vous retrouvez avec une instance avec un cadre et une instance sans. changement minime pour le faire fonctionner est de changer votre méthode de createGUI:

public void createGUI(Object obj) { 
    //Create and set up the frame. 
    frame = new JFrame("PopUp Dialog"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

// //create and setup the content pane 
// UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj); 

    setOpaque(true); 
    frame.setContentPane(this); 

    frame.pack(); 
    frame.setVisible(true); 
    } 
+0

+1. Et, @LambeauLeap: Votre mécanisme de fermeture ne devrait pas avoir besoin de plus de force que setVisible, aussi. –

0

Dans la méthode createGUI(), vous instancier la variable frame et en définissant sa fenêtre de contenu à une autre instance de UpgradePopupWindow. Mais vous n'instantiez pas la variable frame de cette seconde instance. Lorsque les boutons Restaurer ou Mettre à niveau sont cliqués, il appelle la méthode actionPerformed() de cette seconde instance, donc frame.dispose() et frame.setVisible(false) ne fonctionnera pas car frame est null.

Je suggérerais que votre classe UpgradePopupWindow étende JFrame au lieu de JPanel. De cette façon, vous pouvez appeler la méthode dispose() directement. De plus, il est plus logique d'avoir une classe == une fenêtre (un JPanel n'est pas une fenêtre, juste un groupe de widgets GUI). Ensuite, créez un JPanel dans le constructeur et ajoutez les widgets à cela. Vous pouvez également vous débarrasser de cette vicieuse mainWindow variable statique.

Aussi, je ne pense pas JFrame.EXIT_ON_CLOSE est ce que vous voulez utiliser ici. Vous voulez fermer la fenêtre, ne pas terminer l'application entière.JFrame.DISPOSE_ON_CLOSE ne disposera que de la fenêtre quand elle est fermée.

Vous pouvez également affiner la manière dont votre boîte de dialogue réagit aux événements de fenêtre en implémentant l'interface WindowListener.

L'aspect et la sensation me semblent OK. Simple et direct.

public class Main{ 
    public static void main(String args[]){ 
    //display the window from your main window 
    UpgradePopupWindow upw = new UpgradePopupWindow(obj); 
    upw.setVisible(true); 
    } 
} 

public class UpgradePopupWindow extends JFrame implements ActionListener, WindowListener { 
    //... 

    public UpgradePopupWindow(Object ft) { 
    super("PopUp Dialog"); 
    JPanel panel = new JPanel(); 
    //... 
    setContentPane(panel); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    pack(); 
    } 

    public void actionPerformed(ActionEvent e) { 
    if("restore".equals(e.getActionCommand())) { 
     System.out.println("restore button selected"); 
     dispose(); 
    } else if ("upgrade".equals(e.getActionCommand())) { 
     System.out.println("upgrade button selected"); 
     dispose(); 
    } 
    } 

    public void windowClosed(WindowEvent e) { 
    System.out.println("Window closed!"); 
    } 
    //other WindowListener methods 
} 
Questions connexes