2011-12-15 10 views
6

Ho un'applicazione principale in cui è presente una tabella con valori. Quindi, faccio clic sul pulsante "Aggiungi", nuovo CUSTOM (l'ho creato io stesso). Viene visualizzato il popup di tipo JDialog. Lì posso inserire il valore, fare qualche segno di spunta e fare clic su "Conferma". Quindi ho bisogno di leggere quell'input dalla finestra di dialogo, quindi posso aggiungere questo valore alla tabella nell'applicazione principale. Come posso ascoltare quando viene premuto il pulsante "conferma", quindi posso leggere quel valore dopo?listener di azioni su JDialog per il pulsante su cui è stato fatto clic

addISDialog = new AddISDialog(); 
addISDialog.setVisible(true); 
addISDialog.setLocationRelativeTo(null); 
//somekind of listener... 
//after "Confirm" button in dialog was pressed, get value 
value = addISDialog.ISName; 
+0

Ho implementato il listener all'interno di JDialog e posso ascoltare il pulsante all'interno di quella finestra di dialogo, ma ho bisogno di ascoltare quel pulsante fuori dalla finestra di dialogo - nell'applicazione principale, dove ho chiamato quella finestra –

+1

Puoi modificare la classe 'JDialog'? In tal caso, è possibile inoltrare 'ActionEvent' a un'altra classe che implementa l'interfaccia' ActionListener' e quella classe può fare ciò che si desidera. – mre

+0

Ho creato personalmente AddISDialog (la classe pubblica AddISDialog estende JDialog implementa ActionListener) quindi sì, posso modificarlo. Cosa intendi per inoltrare ActionEvent in un'altra classe? Come posso farlo? –

risposta

12

Se la finestra scompare dopo l'utente preme confermare:

  • e si desidera avere la finestra di dialogo si comportano come un modale JDialog, allora è facile, dal momento che si sa dove a il codice del programma sarà non appena l'utente avrà terminato la finestra di dialogo - sarà subito dopo aver chiamato setVisible(true) nella finestra di dialogo. Quindi basta interrogare l'oggetto di dialogo per il suo stato nelle righe di codice immediatamente dopo aver chiamato setVisible(true) nella finestra di dialogo.
  • Se è necessario gestire una finestra di dialogo non modale, è necessario aggiungere un WindowListener alla finestra di dialogo per essere avvisati quando la finestra di dialogo è diventata invisibile.

Se la finestra è quello di rimanere aperto dopo l'utente preme confermano:

  • allora probabilmente si dovrebbe utilizzare un PropertyChangeListener come è stato suggerito in precedenza. In alternativa, o dare all'oggetto di dialogo un metodo pubblico che consente alle classi esterne la possibilità di aggiungere un ActionListener al pulsante di conferma.

Per ulteriori dettagli, vi preghiamo di mostrarci i bit rilevanti del vostro codice, o ancora meglio, un sscce.

per esempio per permettere la classe JDialog di accettare ascoltatori esterni, si potrebbe dare un JTextField e un JButton:

class MyDialog extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

e un metodo che consente alle classi di fuori di aggiungere un ActionListener al pulsante:

public void addConfirmListener(ActionListener listener) { 
    confirmBtn.addActionListener(listener); 
} 

Quindi una classe esterna può semplicemente chiamare il metodo `addConfirmListener (...) per aggiungere il suo ActionListener al confirmBtn.

Ad esempio:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class OutsideListener extends JFrame { 
    private JTextField textField = new JTextField(10); 
    private JButton showDialogBtn = new JButton("Show Dialog"); 
    private MyDialog myDialog = new MyDialog(this, "My Dialog"); 

    public OutsideListener(String title) { 
     super(title); 
     textField.setEditable(false); 

     showDialogBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if (!myDialog.isVisible()) { 
       myDialog.setVisible(true); 
      } 
     } 
     }); 

     // !! add a listener to the dialog's button 
     myDialog.addConfirmListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      String text = myDialog.getTextFieldText(); 
      textField.setText(text); 
     } 
     }); 

     JPanel panel = new JPanel(); 
     panel.add(textField); 
     panel.add(showDialogBtn); 

     add(panel); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new OutsideListener("OutsideListener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class MyDialog extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

    public MyDialog(JFrame frame, String title) { 
     super(frame, title, false); 
     JPanel panel = new JPanel(); 
     panel.add(textfield); 
     panel.add(confirmBtn); 

     add(panel); 
     pack(); 
     setLocationRelativeTo(frame); 
    } 

    public String getTextFieldText() { 
     return textfield.getText(); 
    } 

    public void addConfirmListener(ActionListener listener) { 
     confirmBtn.addActionListener(listener); 
    } 
} 

Avvertenze però: Non consiglio sottoclasse JFrame o JDialog se non assolutamente necessario. È stato fatto qui semplicemente per brevità. Anch'io preferisco usare una finestra di dialogo modale per risolvere questo problema e semplicemente riaprire la finestra di dialogo quando necessario.

Edit 2
Un esempio di utilizzo di una finestra di dialogo modale :

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

public class OutsideListener2 extends JFrame { 
    private JTextField textField = new JTextField(10); 
    private JButton showDialogBtn = new JButton("Show Dialog"); 
    private MyDialog2 myDialog = new MyDialog2(this, "My Dialog"); 

    public OutsideListener2(String title) { 
     super(title); 
     textField.setEditable(false); 

     showDialogBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if (!myDialog.isVisible()) { 
       myDialog.setVisible(true); 

       textField.setText(myDialog.getTextFieldText()); 
      } 
     } 
     }); 

     JPanel panel = new JPanel(); 
     panel.add(textField); 
     panel.add(showDialogBtn); 

     add(panel); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new OutsideListener2("OutsideListener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class MyDialog2 extends JDialog { 
    private JTextField textfield = new JTextField(10); 
    private JButton confirmBtn = new JButton("Confirm"); 

    public MyDialog2(JFrame frame, String title) { 
     super(frame, title, true); // !!!!! made into a modal dialog 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Please enter a number between 1 and 100:")); 
     panel.add(textfield); 
     panel.add(confirmBtn); 

     add(panel); 
     pack(); 
     setLocationRelativeTo(frame); 

     ActionListener confirmListener = new ConfirmListener(); 
     confirmBtn.addActionListener(confirmListener); // add listener 
     textfield.addActionListener(confirmListener); 
    } 

    public String getTextFieldText() { 
     return textfield.getText(); 
    } 

    private class ConfirmListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
     String text = textfield.getText(); 
     if (isTextValid(text)) { 
      MyDialog2.this.setVisible(false); 
     } else { 
      // show warning 
      String warning = "Data entered, \"" + text + 
       "\", is invalid. Please enter a number between 1 and 100"; 
      JOptionPane.showMessageDialog(confirmBtn, 
        warning, 
        "Invalid Input", JOptionPane.ERROR_MESSAGE); 
      textfield.setText(""); 
      textfield.requestFocusInWindow(); 
     } 
     } 
    } 

    // true if data is a number between 1 and 100 
    public boolean isTextValid(String text) { 
     try { 
     int number = Integer.parseInt(text); 
     if (number > 0 && number <= 100) { 
      return true; 
     } 
     } catch (NumberFormatException e) { 
     // one of the few times it's OK to ignore an exception 
     } 
     return false; 
    } 

} 
+0

Penso di aver avuto la tua idea, ma ora c'è un altro problema connesso: prima di inviare l'azione all'ascoltatore, ho bisogno per confermare i dati nella finestra di dialogo quando viene premuto il pulsante Conferma. Proprio quando i dati sono validi (quando valido - il dialogo si chiude, altrimenti - non lo fa), il valore deve essere letto per ulteriori azioni. Posso lanciare qualche tipo di notifica all'ascoltatore dalla classe di dialogo, ma non so come –

+0

Quindi non seguire il codice sopra. Quello che devi fare è rendere la finestra di dialogo modale, e avere l'azione del pulsante di conferma convalidare i dati e chiudere la finestra solo se i dati sono OK. Quindi fare in modo che il programma principale interroghi immediatamente la classe di dialogo per i dati nel codice dopo aver chiamato 'setVisible (true)' nella finestra di dialogo. –

+0

@PooLaS: vedere la modifica per un esempio di una soluzione di dialogo modale sopra. –

-1
import javax.swing.JOptionPane; 

o se si sta già oscillando

import javax.swing.*; 

avranno coperto.

Dopo condizionale JOptionPane trigger per inviare il tuo avviso o qualsiasi messaggio modale:.

JOptionPane.showMessageDialog(
      null, 
      "Your warning String: I can't do that John", 
      "Window Title", 
      JOptionPane.ERROR_MESSAGE); 

controllare le opzioni per JOptionPane * per determinare il tipo di messaggio.

+0

Questa risposta non risolve il problema che OP prova a risolvere. –

0
//Why is this working so well even without the ActionListener interface, and all I'm 
//getting is minor format errors at the end brackets? Know how to fix it? 



final JButton newButton = new JButton("Send"); 
      newButton.setActionCommand("Send"); 
      textPane.add(newButton); 
      newButton.setEnabled(true); 
      newButton.addActionListener(new ActionListener(); 


        public void actionPerformed(ActionEvent e){ 

        // display/center the jdialog when the button is pressed 
        JDialog digFree = new JDialog(digFree, "Hello", true); 
        digFree.setLocationRelativeTo(newButton); 
        digFree.setFocusable(true); 
        digFree.setVisible(true); 
        digFree.setBounds(20, 20, 100, 120); 
        } 
0

Perché non controllate se il tuo jDialog è visibile?

yourJD.setVisible(true); 
while(yourJD.isVisible())try{Thread.sleep(50);}catch(InterruptedException e){} 

funziona anche.

+1

Si è verificato un problema con la formattazione del codice. Consulta [Guida Markdown - Codice e testo preformattato] (http://stackoverflow.com/editing-help#code) e per favore [modifica] il tuo post. –