java Jframe отказывается отрисовывать при вызове извне - PullRequest
1 голос
/ 06 февраля 2020

У меня совершенно нелепая проблема.

Ситуация: у меня есть репортер. java класс, из которого я вызываю небольшой класс JFrame (status. java) с StatusBar в нем. Мой репортер. java имеет основную функцию, из которой я проверяю правильность. Если я это сделаю, все будет работать отлично.

А теперь странная вещь.

У меня есть класс JFrame (menu. java) с панелью меню, из которой я создаю экземпляр мой репортер класс. Когда я вызываю класс репортера оттуда, а не из его основной функции, класс прогресса открывается по запросу, но он отказывается отрисовывать. Все, что я получаю, - это пустую рамку, которую я даже не могу закрыть, поскольку она кажется застывшей. Процесс в репортере точно такой же ...

Я должен добавить, что задачи в классе репортера создают сотни таблиц в PDF-файл. Это впитывает всю мощность моего win10 на несколько минут.

Ах, еще одна информация: я создал все эти классы в NetBeans 11.

Вот мои фрагменты кода:

public class Progress extends javax.swing.JFrame {
    JProgressBar progressBar = null;

    public Progress (int maxvalue) {
        initComponents();
        progressBar = new JProgressBar(0, maxvalue);
        jPanel1.add(progressBar, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, 340, 30));
        progressBar.setVisible(true);
        setVisible(true);
        this.repaint();
    }

    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMaximumSize(new java.awt.Dimension(400, 100));
        setMinimumSize(new java.awt.Dimension(400, 100));
        setPreferredSize(new java.awt.Dimension(400, 100));
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 400, 100));

        pack();
    }  

    public void updProgress(int wert) {
        progressBar.setValue(wert);
        progressBar.setVisible(true);
        this.setVisible(true);
        repaint();
    }

    public void kill() {
        this.setVisible(false);
        this.dispose();
    }
    }
...

Вот вызовы из моего класса репортеров (см. поверх моего кода)


Progress bw = null;
bw = new Progress(table.getRowCount());

bw.updProgress(x);

bw.kill();

и я вызываю класс Reporter из моего меню с помощью

Reporter r = new Reporter();

Точно такую ​​же строку можно найти и в основной функции. Как уже говорилось, когда я вызываю репортерский класс из его основной функции, он работает нормально. Когда я делаю тот же самый вызов класса репортера из класса меню, индикатор выполнения, похоже, зависает. Я попробовал это с простой JLabel вместо индикатора выполнения. Это также не оказывает. Должно быть, у JFrame есть проблема. Может быть, репортерский класс тоже на пределе и замерзает. У него нет GUI и он работает в фоновом режиме, поэтому я не могу это проверить.

У кого-нибудь есть идеи, почему это происходит ???

1 Ответ

0 голосов
/ 11 февраля 2020

**** Я ПОЛУЧИЛ ЭТО !!!! ****

Я перебирал код снова и снова, пока, наконец, не нашел решение ...

При проверке класса меню, из которого я вызвал процесс репортера, я понял, что пока репортер работает, класс меню заблокирован и не отвечает. Я не мог ни переместить, ни изменить размер, ни закрыть объект ...

Поэтому я начал профессора Google и узнал, как обернуть мой репортерский класс в его собственную ветку. Для этого мне пришлось заставить репортер реализовать java .lang.Runnable, а затем из класса меню, называемого репортером, вот так:

Reporter r = new Reporter();
r.setWhere(" year='" + cyear +"'");
r.setReport("T");
Thread t1 = new Thread(r);
t1.start();

Мне пришлось создать функции setWhere и setReport, чтобы выгрузить параметры в класс, так что я могу сделать фактический вызов функции, который вызывает большую нагрузку из функции run () класса-репортера.

Это затем отсоединяет Swing GUI от сильно повторяющегося класса-репортера и таким образом, все мои кадры отображаются так, как я хочу, чтобы они показывали.

Это была новая концепция для меня. Хотя они показали нам концепцию потоков в моем классе java (18 лет go), мне еще никогда не приходилось им пользоваться. У меня никогда не было приложения, в котором классы блокируют друг друга или из-за большой загрузки процессора.

Интересно, что (для меня, как любителя), несмотря на занятый процесс репортера, я могу на самом деле вызвать и обновить кадр прогресса из класса репортера, не помещая его в еще один поток. Все, что нужно, это отделить класс меню. Не репортерский GUI класс и индикатор выполнения GUI все еще работают вместе, не блокируя друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...