Dziwne zachowanie progamu.

0

Witam napotkalem problem, ktorego sam raczej nie bede w stanie rozwiazac, dlatego chcialbym zaczerpnac waszych pomyslow.

Ponizszy kod uruchamia okienko, ktore ma jako Label Background i w ktorym mozna wpisac haslo.
Po wpisaniu poprawnego hasla chcialem, aby uruchomil sie JProgressBar. Gdy wpisze poprawne haslo
to musze odczekac te kilka sekund (ktore normalnie potrzebuje JProgressBar), jednak nie wyswietla
mi sie pasek postepu.
(Probowalem zdefiniowac pasek wczesniej i potem juz w ActionListener ten kod z while , ale tez nie dzialalo - wyswietlilo chyba tylko pasek wtedy gdy jut bylo 100%) .
Interesuje mnie rowniez taka sprawa, ze po wpisaniu haselka metoda password.setVisible(false); ,ktora powinna zostac wykonana na samym poczatku, jest wykonywano dopiero po zakonczeniu procesu z JProgressBar.
(Ostatnie pytanie, ktore nie gra wiekszej roli, ale chialem zapytac z ciekawosci.
Gdy uzyje metody password.setFont(new Font( "",Font.PLAIN, 14)); to programm strasznie sie powoli laduje. Ponadto JPasswordField sie nie wyswietla automatcznie. Trzeba kliknac w obszar gdzie sie znajduje, aby sie pojawil )

W kodzie miejsca ktore opisalem powyzej oznaczylem "Tutaj jest problem".


public class Klasa4 extends JFrame{

     static JFrame frame = new JFrame("Id");
     static JLabel a = new JLabel();
     static private String pass = "WX23";
     static int num = 0;
     static JProgressBar progressBar ;

    static  JPasswordField password = new JPasswordField("Haslo",10);
    Klasa4(){

        frame.setLayout(null);  
    frame.setSize(600,300); 
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Toolkit toolkit = getToolkit();   
    Dimension size = toolkit.getScreenSize();    
    frame.setLocation(size.width/2 - frame.getWidth()/2,size.height/2 - frame.getHeight()/2);

    a.setIcon(new ImageIcon("Desert.jpg"));
    a.setBounds(0,0,600,300);

    frame.add(a);

    password.setEchoChar('*');
    password.setBounds(270,240,60,15);
   // password.setFont(new Font( "",Font.PLAIN, 14));   tutaj jest problem
    frame.add(password);

    password.addActionListener(new Action());
    }

    static class Action implements ActionListener{

            public void actionPerformed(ActionEvent e) {

            JPasswordField input =  (JPasswordField)e.getSource();  
            char[] passy = input.getPassword(); 
            String p = new String(passy);

                    if(p.equals(pass)){
            password.setVisible(false);                              tutaj jest problem
            frame.setCursor(Cursor.WAIT_CURSOR);

            progressBar = new JProgressBar(0,3000);         tutaj jest problem
            progressBar.setBounds(20,30,100,20);
            progressBar.setValue(0);
                    progressBar.setStringPainted(true);
            frame.add(progressBar);

            while (num < 3000) {
                progressBar.setValue(num);
                try {
                  Thread.sleep(100);
                } catch (InterruptedException ere) {
                }
                num += 10;
               }

             frame.setCursor(Cursor.DEFAULT_CURSOR);

            }
            else{
            Icon be = new ImageIcon("passw.png");   
               JOptionPane.showMessageDialog (null, "Haslo niepoprawne", "WSXP", 2 , be);

            }
            }
     }

    }

Z gory wielkie dzieki!!!

0

program zapętla Ci się w miejscu:

while (num < 3000) {
    progressBar.setValue(num);
    try {
        Thread.sleep(100);
    } catch (InterruptedException ere) {}
    num += 10;
}

a progressBar wyświetla już po ukończeniu tej pętli. Jak rozwiązać? Wykonuj 'loading progressBara' w osobnym wątku, przykład:

//kod klasy wątku zmieniającego wartość progressBara
class progressBarValueChanger implements Runnable {
    public void run() {
        while (num < 3000) {
            progressBar.setValue(num);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ere) {
            }
            num += 10;
        }
    }
}

a w miejsce aktualnego 'while'a' (w miejsce tego, o którym pisałem wyżej):

//zamiast:
while (num < 3000) {
    progressBar.setValue(num);
    try {
        Thread.sleep(100);
    } catch (InterruptedException ere) {}
    num += 10;
}

//wrzuć to:
new Thread(new progressBarValueChanger()).start();

to rozwiązuje również problem późnego wywołania metody 'password.setVisible(false);' (powód jej późnego wywoływania był taki sam jak z progressBarem - program najpierw wykonywał operacje loadingu, potem to rysował, a nie 'obok siebie - równorzędnie' wykonywał te akcje.

Co do trzeciego problemu z 'password.setFont(new Font("",Font.PLAIN, 14));' - u mnie problemu z żadnym wydłużonym ładowaniem ani błędnym wyświetlaniem nie ma.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0