JProgressbar не отображается и код выполняется в неправильном порядке? - PullRequest
0 голосов
/ 30 августа 2018

У меня были некоторые проблемы с созданием графического интерфейса для программы. Бэкэнд-программа работает нормально, но иногда требуется некоторое время для ее завершения.

В графическом интерфейсе я хочу показать пользователю, что работа выполняется, и он считает, что неопределенного JProgressBar (прогресса) будет достаточно - это неопределенно, поскольку мне нужен только индикатор того, что что-то происходит, а на самом деле не следит за реальным прогрессом. Панель уже добавлена ​​во фрейм, поэтому она всегда там, и она просто скрыта, когда нажимается кнопка и начинается процесс. Затем он должен быть повторно скрыт после завершения процесса. Я также добавил текст, который также должен показывать, что процесс запущен, и затем после его запуска изменяется на завершенный бит.

Однако, это не работает, как задумано. Кажется, что происходит то, что код выполняется в неправильном порядке. Инструкция c.run(), кажется, выполняется раньше, чем setVisible(true), поскольку индикатор выполнения появляется только после завершения команды запуска, и я не могу понять, почему. Команда run() является довольно большой операцией, поэтому занимает некоторое время (это всего лишь однопоточное приложение), но я не знаю, почему она это делает, поскольку код определенно выполняется в правильном порядке, когда вы используете отладку печати для посмотрите, какие инструкции выполняются в каком порядке.

but.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            runCSVReader(e);    
        }

    });


private void runCSVReader(ActionEvent evt) {
    progress.setVisible(true);
    label8.setForeground(Color.YELLOW);
    label8.setText("Processing...");
    correctInput();
    String accTypes = tf5.getText() + "\\" + tf6.getText() + ".csv";
    String inputFile = tf.getText() + "\\" + tf4.getText() + ".csv";
    String outputFile = tf7.getText() + "\\" + tf2.getText();
    System.out.println("acctypes " + accTypes+"\ninput " + inputFile + "\noutput " + outputFile);


    try {
        csvreader c = new csvreader();
        c.setAccTypesFile(accTypes);
        c.setInputFile(inputFile);
        c.setOutputFile(outputFile);
        c.run();
    //  progress.setVisible(false);
        label8.setForeground(Color.GREEN);
        label8.setText("Complete");
        //pb.end();
    } 

Это просто странно, так как кажется, что код работает в следующем порядке:

c.run();
progress.setVisible(true);
label8.setForeground(Color.YELLOW);
label8.setText("Processing...");
//  progress.setVisible(false);
label8.setForeground(Color.GREEN);
label8.setText("Complete");

, поскольку текст меняется прямо на зеленое сообщение о завершении (только в течение очень короткого времени отображается только желтое сообщение) и (когда он не закомментирован), setvisible переходит прямо в false. Есть идеи о том, почему это может происходить? Насколько я могу судить, в вызываемых методах нет конфликтующих вызовов, которые могли бы повлиять на это. Если это однопоточная программа, индикатор выполнения не будет отображаться до тех пор, пока основной поток не освободится от команды run (), и, если это так, почему текст также не запускается при первом вызове?

...