2011-12-15 14 views
6

Tengo la aplicación principal donde está la tabla con los valores. Luego, hago clic en el botón "Agregar", nuevo CUSTOM (lo hice yo mismo) aparece el emergente de tipo JDialog. Ahí puedo ingresar valor, hacer algunos tics y hacer clic en "Confirmar". Entonces necesito leer esa entrada del diálogo, así que puedo agregar este valor a la tabla en la aplicación principal. ¿Cómo puedo escuchar cuando se presiona el botón "confirmar", entonces puedo leer ese valor después de eso?oyente de acción a JDialog para hacer clic en el botón

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

Implementé listener dentro de JDialog y puedo escuchar el botón dentro de ese diálogo, pero necesito escuchar ese botón fuera del diálogo - en la aplicación principal, donde llamé al diálogo –

+1

¿Se puede editar la clase 'JDialog'? Si es así, puedes reenviar el 'ActionEvent' a otra clase que implemente la interfaz' ActionListener' y esa clase puede hacer lo que quieras. – mre

+0

Hice AddISDialog mismo (la clase pública AddISDialog extiende que JDialog implementa ActionListener) así que sí, puedo editarlo. ¿Qué quieres decir con reenviar ActionEvent a otra clase? ¿Cómo puedo hacerlo? –

Respuesta

12

Si el diálogo desaparecerá después de que el usuario pulsa confirmar:

  • y desea tener la comportan de diálogo como un referente JDialog, entonces es fácil, ya que usted sabe en qué el código de su programa será tan pronto como el usuario termine de tratar con el cuadro de diálogo; será justo después de llamar al setVisible(true) en el cuadro de diálogo. Por lo tanto, simplemente consulte el objeto de diálogo por su estado en las líneas de código inmediatamente después de llamar al setVisible(true) en el cuadro de diálogo.
  • Si necesita tratar con un cuadro de diálogo no modal, necesitará agregar un WindowListener al cuadro de diálogo para recibir una notificación cuando la ventana del cuadro de diálogo se haya vuelto invisible.

Si el diálogo es permanecer abierto después de que el usuario pulsa confirman:

  • entonces usted probablemente debería utilizar un PropertyChangeListener como se ha sugerido anteriormente. O bien, o bien, otorgue al objeto de diálogo un método público que permita a las clases externas la posibilidad de agregar un ActionListener al botón de confirmación.

Para obtener más información, por favor muéstranos partes relevantes de tu código, o mejor aún, un sscce.

Por ejemplo, para permitir la clase JDialog para aceptar los oyentes fuera, podría darle un JTextField y JButton:

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

y un método que permite a clases fuera para añadir un ActionListener al botón:

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

Luego, una clase externa simplemente puede llamar al método `addConfirmListener (...) para agregar su ActionListener al confirmBtn.

Por ejemplo:

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); 
    } 
} 

Advertencias sin embargo: No recomiendo como subclase de JFrame o JDialog menos que sea absolutamente necesario. Fue hecho aquí simplemente por el bien de la brevedad. Yo también prefiero usar un diálogo modal para resolver este problema y volver a abrir el diálogo cuando sea necesario.

Editar 2
Un ejemplo de uso de un de diálogo modal :

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

Creo que entendí tu idea, pero ahora hay otro problema conectado: antes de enviar acciones al oyente, necesito para confirmar los datos en el diálogo cuando se presiona el botón Confirmar. Justo cuando los datos son válidos (cuando son válidos, el diálogo se cierra, el resto, no), el valor debe leerse para realizar otras acciones. Puedo disparar algún tipo de notificación al oyente desde la clase de diálogo, pero no sé cómo –

+0

Entonces no sigas el código anterior. Lo que necesita hacer es hacer que el diálogo sea modal, y hacer que su acción de confirmación confirme los datos y solo cierre el diálogo si los datos están correctos. Luego haga que su programa principal consulte la clase de diálogo para los datos en el código inmediatamente después de llamar a 'setVisible (true)' en el cuadro de diálogo. –

+0

@PooLaS: vea la edición para ver un ejemplo de una solución de diálogo modal arriba. –

-1
import javax.swing.JOptionPane; 

o si ya está haciendo pivotar

import javax.swing.*; 

se han cubierto.

Después JOptionPane gatillo condicional para enviar su mensaje de advertencia o lo que sea modal:.

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

revisar sus opciones para JOptionPane * para determinar el tipo de mensaje.

+0

Esta respuesta no resuelve el problema que OP intenta resolver. –

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

¿Por qué no comprueba si su jDialog está visible?

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

esto funciona, también.

+1

Algo salió mal con el formato del código. Consulte [Ayuda de markdown - Código y texto preformateado] (http://stackoverflow.com/editing-help#code) y por favor [edite] su publicación. –

Cuestiones relacionadas