Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';从另一个JDialog调用时看不到JDialog组件_Java_Swing_Jdialog - Fatal编程技术网

Java Can';从另一个JDialog调用时看不到JDialog组件

Java Can';从另一个JDialog调用时看不到JDialog组件,java,swing,jdialog,Java,Swing,Jdialog,我想知道,当从另一个JDialog调用它时,如何在JDialog中看到组件 我有一个名为Cargando1的jDialog,里面有一个ProgressBar,这个jDialog在加载时运行一个名为iterate()的方法 否则我有另一个名为login1的jDialog,它有一个名为btnIngresar的按钮,它验证一些用户和密码信息,然后它应该调用Cargando1 此外,cargando1在progressbar达到100%后调用名为Principal的帧,但这并不重要 我想知道为什么当我从

我想知道,当从另一个JDialog调用它时,如何在JDialog中看到组件

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

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

此外,cargando1在progressbar达到100%后调用名为Principal的帧,但这并不重要

我想知道为什么当我从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);
      }

}
导入java.awt.BorderLayout;
导入java.awt.FlowLayout;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JPanel;
导入javax.swing.border.EmptyBorder;
导入javax.swing.JProgressBar;
公共类Cargando1扩展了JDialog{
私有最终JPanel contentPanel=新JPanel();
私人JProgressBar pgbCargando;
int-procentaje=0;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
试一试{
Cargando1对话框=新建Cargando1();
setDefaultCloseOperation(JDialog.DISPOSE\u ON\u CLOSE);
dialog.iterate();
}
捕获(例外e){
e、 printStackTrace();
}
}
/**
*创建对话框。
*/
公共交通1(){
立根(100100450154);
getContentPane().setLayout(新的BorderLayout());
setboorder(新的EmptyBorder(5,5,5,5));
getContentPane().add(contentPanel,BorderLayout.CENTER);
contentPanel.setLayout(null);
pgbCargando=新的JProgressBar(02000);
pgbCargando.立根(10,11,414,93);
pgbCargando.setstringpaint(真);
contentPanel.add(pgbCargando);
setLocationRelativeTo(空);
setVisible(真);
可设置大小(真);
setContentPane(contentPanel);
}
void iterate(){
而(porcentaje<2000)
{pgbCargando.setValue(porcentaje);
试试{Thread.sleep(100);}
捕获(中断异常e){}
猪+=95;
}
主体公式1=新主体();
公式1.setLocationRelativeTo(空);
这个。dispose();
公式1.setVisible(真);
}
}
有两件事需要解决(以及未来的注意事项):

  • Cargando1

  • 不要对swing使用
    Thread.sleep
    ,因为
    javax.swing
    不是线程安全的。如果使用
    Thread.sleep
    ,您的
    JDialog
    将冻结。更确切地说,使用一个带有
    ActionListener
    ,或者如果您真的想使用
    Thread.sleep
    ,请研究多线程


  • 三,。请更好地缩进!!!!通常在每
    {

    一行后面加上4个空格的新行。问题出在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();
    }
    
    void iterate(){
    最终线程t=新线程(新可运行(){
    @凌驾
    公开募捐{
    而(porcentaje<2000){
    pgbCargando.设定值(porcentaje);
    试一试{
    睡眠(100);
    }捕获(最终中断异常e){
    }
    猪+=95;
    }
    }
    });
    t、 setDaemon(true);
    t、 start();
    }
    

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

    我没有看到Cargando1的setVisible(true)。使
    setVisible(true)
    Cargando1
    中,您调用的最后一件事-Swing在更新UI时很懒惰,它要求您通知它何时应该执行布局/绘制过程
    迭代
    也会给您带来问题,因为Swing是单线程的,而不是线程安全的。谢谢大家的帮助!您的声明(1)对于所提供的示例中演示的bug,您的语句(2)也不是正确的。@Java42如何?1)在他的操作侦听器中不需要setVisible()。2)使用Thread.sleep()是完全正确的在一个swing应用程序中。@Java42 1)你的权利,我修正了我的答案-2)我说如果他想使用Thread.sleep,他必须使用多线程。我澄清了我的答案