-2

晚上好,我在运行进度条时遇到问题,请检查我的代码并告诉我问题出在哪里:

/**
** @author Islam */

public class Register extends javax.swing.JFrame implements Runnable {

static final int MY_MINIMUM = 0;
static final int MY_MAXIMUM = 100;
private Pattern pattern;
private Matcher matcher;
private static final String EMAIL_PATTERN =
        "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
boolean isValidPassord = true;
Thread th;

public Register() {
    initComponents();
    passwordTextF.addKeyListener(new passwordListener());
    passwordMeter = new JProgressBar();
    passwordMeter.setMinimum(MY_MINIMUM);
    passwordMeter.setMaximum(MY_MAXIMUM);
    th = new Thread(this);
    th.start();
}

public void updateBar(int newValue) {
    passwordMeter.setValue(newValue);
    passwordMeter.setStringPainted(true);
    System.out.println(newValue);
}

public void run() {
    for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) {
        updateBar(i);
        try {
            Thread.sleep(100);

        } catch (InterruptedException ex) {
            Logger.getLogger(Register.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

class passwordListener implements KeyListener {

    public void keyPressed(KeyEvent e) {
        passwordLabel.setForeground(Color.BLACK);

    }

    public void keyReleased(KeyEvent e) {

        //  Register.this.validatePassword(passwordTextF.getText());
        if (!isValidPassord) {
            //  new PasswordMeterHandler().start();
        }

    }

    public void keyTyped(KeyEvent e) {
    }
}

public boolean validateEmail(String mailFromForm) {

    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(mailFromForm);
    return matcher.matches();

}



// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    int i = 0;
    this.validateEmail(nameTextF.getText());
    this.validatePassword(passwordTextF.getText());
    if (!matcher.matches()) {
        EMailLabel.setForeground(Color.red);
    }
    if (!isValidPassord) {
        passwordLabel.setForeground(Color.red);
    }


}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
}

public static void main(String args[]) {


    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            Register frame = new Register();
            frame.setVisible(true);




        }
    });
}
// Variables declaration - do not modify
private javax.swing.JLabel EMailLabel;
private javax.swing.JTextField EMailTextF;
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.ButtonGroup buttonGroup2;
private javax.swing.JComboBox countryCombo;
private javax.swing.JComboBox genderCombo;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JPanel jPanel1;
private javax.swing.JLabel nameLabel;
private javax.swing.JTextField nameTextF;
private javax.swing.JLabel passwordLabel;
private javax.swing.JProgressBar passwordMeter;
private javax.swing.JPasswordField passwordTextF;
private javax.swing.JLabel strengthLabel;
private javax.swing.JLabel userNameLabel;
private javax.swing.JTextField userNameTextF;
// End of variables declaration
}
4

2 回答 2

0

将 JProgressBar 添加到 JFrame,调用 setVisible,在构造函数之外启动线程(用于线程过早结束)。

public class Register extends JFrame {

static final int MY_MINIMUM = 0;
static final int MY_MAXIMUM = 100;
private JProgressBar passwordMeter;

public Register() {
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    setBounds(50, 50, 640, 100);
    passwordMeter = new JProgressBar();
    passwordMeter.setMinimum(MY_MINIMUM);
    passwordMeter.setMaximum(MY_MAXIMUM);
    add(passwordMeter, BorderLayout.CENTER);
}

public void start() {
    new PasswordMeterHandler().start();
}

class PasswordMeterHandler extends Thread {

    public void updateBar(final int newValue) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                passwordMeter.setValue(newValue);
                passwordMeter.setStringPainted(true);
            }
        });
        //passwordMeter.setValue(newValue);
        //passwordMeter.setStringPainted(true);
        System.out.println(newValue);
    }

    @Override
    public void run() {
        for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) {
            updateBar(i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(Register.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            Register frame = new Register();
            frame.setVisible(true);
            frame.start();
        }
    });
}
}
于 2013-01-07T18:08:10.517 回答
0

让我们从这样一个事实开始,在您的示例中,进度条从未添加到任何内容,然后继续违反最重要的 Swing 规则之一 - 永远不要在事件调度线程之外创建或修改任何 UI 元素.

KeyListener不是跟踪文本组件更改的合适方法,它们不会考虑用户是否将文本粘贴到字段中。

您应该使用 aDocumentListener来监视对基础文档的更改,DocumentFilter如果要更改进入该字段的内容...

public class TestPasswordField {

    public static void main(String[] args) {
        new TestPasswordField();
    }

    public TestPasswordField() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JPasswordField password;
        private JProgressBar progressBar;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            password = new JPasswordField(10);
            progressBar = new JProgressBar(0, 10);
            password.getDocument().addDocumentListener(new DocumentListener() {

                protected void updateProgress() {
                    progressBar.setValue(password.getPassword().length);
                }

                @Override
                public void insertUpdate(DocumentEvent e) {
                    updateProgress();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    updateProgress();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    updateProgress();
                }
            });

            add(password, gbc);
            gbc.gridy++;
            add(progressBar, gbc);
        }

    }

}
于 2013-01-08T00:22:31.717 回答