从另一个JDialog

时间:2017-07-10 21:49:25

标签: java swing jdialog

我想知道如何从另一个组件中调用JDialog中的组件。

我有一个叫做Cargando1的jDialog里面有一个ProgressBar,这个jDialog在加载时会运行一个名为iterate()的方法。

否则我有另一个名为login1的jDialog,它有一个名为btnIngresar的按钮,它会验证一些用户和密码,然后它应该调用Cargando1。

在进度条达到100%之后,cargando1也会调用一个名为Principal的Frame,但这并不重要。

我想知道为什么当我从Login1调用Cargando1时它会运行,但我看不到它上面的组件。

感谢您帮助我!

这是名为Login1的Jdialog

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Login1 extends JDialog implements ActionListener {
private JLabel lblUsuario;
private JTextField txtUsuario;
private JPasswordField jpassContrasena;
private JLabel lblContrasena;
private JButton btnIngresar;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    try {
        Login1 dialog = new Login1();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Create the dialog.
 */
public Login1() {
    setBounds(100, 100, 225, 157);
    getContentPane().setLayout(null);

    lblUsuario = new JLabel("Usuario:");
    lblUsuario.setFont(new Font("Courier New", Font.PLAIN, 11));
    lblUsuario.setBounds(10, 12, 80, 20);
    getContentPane().add(lblUsuario);

    txtUsuario = new JTextField();
    txtUsuario.setColumns(10);
    txtUsuario.setBounds(101, 11, 95, 20);
    getContentPane().add(txtUsuario);

    jpassContrasena = new JPasswordField();
    jpassContrasena.setBounds(101, 43, 95, 20);
    getContentPane().add(jpassContrasena);

    lblContrasena = new JLabel("Contrase\u00F1a:");
    lblContrasena.setFont(new Font("Courier New", Font.PLAIN, 11));
    lblContrasena.setBounds(10, 44, 80, 20);
    getContentPane().add(lblContrasena);

    btnIngresar = new JButton("Ingresar");
    btnIngresar.addActionListener(this);
    btnIngresar.setBounds(60, 80, 90, 23);
    getContentPane().add(btnIngresar);
}
public void actionPerformed(ActionEvent arg0) {
    if (arg0.getSource() == btnIngresar) {
        actionPerformedBtnIngresar(arg0);
    }
}
protected void actionPerformedBtnIngresar(ActionEvent arg0) {
    char contrasena[] = jpassContrasena.getPassword();
    String contrasenadef = new String(contrasena);
    if (txtUsuario.getText().equals("Administrador") && contrasenadef.equals("admin"))
    {   Principal.sesion = 'A';
        JOptionPane.showMessageDialog(this, "Bienvenido, administrador", "Mensaje de bienvenida", JOptionPane.INFORMATION_MESSAGE);
        Cargando1 dialog = new Cargando1();
        this.dispose();
        dialog.setVisible(true);
        dialog.iterate();

    }
    else if (txtUsuario.getText().equals("Vendedor") && contrasenadef.equals("vendedor"))
    {   Principal.sesion = 'V';
        JOptionPane.showMessageDialog(this, "Bienvenido, vendedor", "Mensaje de bienvenida", JOptionPane.INFORMATION_MESSAGE);
        Cargando1 dialog = new Cargando1();
        this.dispose();
        dialog.setVisible(true);
        dialog.iterate();

    }
    else
    {   JOptionPane.showMessageDialog(null, "Por favor ingrese un usuario y/o contraseña correctos", "Acceso denegado", JOptionPane.ERROR_MESSAGE);
    }
}
}

这是名为cargando1的JDialog

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JProgressBar;

public class Cargando1 extends JDialog {

private final JPanel contentPanel = new JPanel();
private JProgressBar pgbCargando;
int porcentaje=0;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    try {
        Cargando1 dialog = new Cargando1();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.iterate();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Create the dialog.
 */
public Cargando1() {
    setBounds(100, 100, 450, 154);
    getContentPane().setLayout(new BorderLayout());
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.CENTER);
    contentPanel.setLayout(null);

    pgbCargando = new JProgressBar(0,2000);
    pgbCargando.setBounds(10, 11, 414, 93);
    pgbCargando.setStringPainted(true);
    contentPanel.add(pgbCargando);

    setLocationRelativeTo(null);
    setVisible(true);
    setResizable(true);
    setContentPane(contentPanel);
}

 void iterate() {

      while (porcentaje < 2000)
      { pgbCargando.setValue(porcentaje);
        try {Thread.sleep(100);}
        catch (InterruptedException e) { }
        porcentaje += 95;
      }
        Principal formulario1 = new Principal();
        formulario1.setLocationRelativeTo(null);
        this.dispose();
        formulario1.setVisible(true);
      }

}

2 个答案:

答案 0 :(得分:0)

要解决的两件事(以及未来的注释):

  1. Cargando1.setVisible(true)

  2. 中使用Cargando1
  3. 请勿使用Thread.sleep进行挥杆,因为javax.swing不是线程安全的。如果您使用JDialogThread.sleep将会冻结。相反,使用带有ActionListener的{​​{3}},或者如果您真的想使用Thread.sleep,请查看多线程。

  4. <子> 3。请缩进更好!!!!通常是在每{

    之后增加4个空格的新行

答案 1 :(得分:0)

问题出在iterate()方法中。将iterate()方法更改为以下内容并尝试一下。

void iterate() {
    final Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            while (porcentaje < 2000) {
                pgbCargando.setValue(porcentaje);
                try {
                    Thread.sleep(100);
                } catch (final InterruptedException e) {
                }
                porcentaje += 95;
            }
        }
    });
    t.setDaemon(true);
    t.start();
}

当在后台修改ProgressBar的值时,这将释放主线程以进行gui更新。