ContentPane и JProgressBar не видны - PullRequest
3 голосов
/ 11 августа 2009

Я создал расширение JDialog, которое имеет один компонент, JProgressBar, внутри панели содержимого. JProgressBar является общедоступным, потому что я хочу, чтобы значение было установлено классом владельца. Когда я создаю новый диалог, панель контента вообще не появляется, в результате чего все, что находится за ней, отображается вместо индикатора выполнения:

public class ProgressBarDialog extends JDialog {
    public JProgressBar bar;

    public ProgressBarDialog(Frame owner, String title) {
        super(owner, title);
        bar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
        bar.setValue(0);
        bar.setStringPainted(true);
        bar.setPreferredSize(new Dimension(200, 100));

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(bar, BorderLayout.CENTER);

        setSize(200, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        toFront();
    }
    public void setProgress(int p) {
        bar.setValue(p);
    }
}

Код использования для этого ProgressBarDialog выглядит следующим образом

ProgressBarDialog progBarDialog = new ProgressBarDialog(null,"Submitting");
//Stuff gets done
progBarDialog.setProgress(20);
//Stuff gets done
progBarDialog.setProgress(45);
//Stuff gets done
progBarDialog.setProgress(70);
//Stuff gets done
progBarDialog.setProgress(100);
//Stuff gets done
progBarDialog.dispose();

Я что-то упускаю, потому что это (я думал) довольно простая реализация?

По предложению camickr я создал тест SSCCE здесь: TestDialog.java . Как вы можете сказать, код точно такой же. Проблема в том, что тест работает и отображается правильно. Я добавил весь код, связанный с другой реализацией диалогового окна.

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

а) Индикатор выполнения не должен быть публичным. Если вы хотите изменить его значение, создайте метод установки.

б) Вы не должны использовать JFrame в качестве дочернего окна. Вы должны использовать JDialog, а затем вы указываете рамку как владельца диалога.

в) Макет JFrame или JDialog по умолчанию - BorderLayout, поэтому нет необходимости сбрасывать макет.

г) Использование setSize () и pack () вместе бесполезно. Пакет переопределит setSize (). Используйте один или другой.

e) Использование setSize () и setPreferredSize () для компонента бесполезно. Менеджер по расположению будет использовать предпочтительный размер в качестве предложения, а затем установит размер в соответствии со своими правилами.

Так что из нескольких опубликованных строк много проблем. Хотя они вряд ли вызовут какие-либо реальные проблемы, это заставляет меня задуматься о том, как выглядит остальная часть программы. Возможно, вы упускаете ценную информацию, которая поможет нам решить проблему.

Если вам нужна дополнительная помощь, вам нужно создать Краткое, автономное, компилируемое и исполняемое приложение, пример программы (SSCCE), которое демонстрирует неправильное поведение.

1 голос
/ 11 августа 2009

Вы должны установить preferredSize() и size() индикатора выполнения. Это должно заставить его появиться.

0 голосов
/ 11 августа 2009

Моим первым предположением было бы поменять местами z-порядок после отображения

setVisible(true);
toFront();

в случае, если функции toFront () не отображаются в не отображаемом виджете.

0 голосов
/ 11 августа 2009

Вы можете использовать BorderLayout:

contentPane.setLayout(new BorderLayout());
contentPane.add(bar, BorderLayout.CENTER);
frame.setSize(200,200);

Хорошо, я сделал несколько тестов:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JProgressBar; 
public class FrameTest {    
    public static void main(String[] args) {        
        JFrame f = new JFrame();        
        JProgressBar b = new JProgressBar(0,100);
        b.getModel().setValue(50);      
        f.getContentPane().add(b);      
        f.setSize(new Dimension(200,200)); 
        f.setVisible(true);     
    }  
}

Это рисует все содержимое фрейма наполовину заполненным, поэтому ProgressBar не виден. Просто он заполняет весь контент, который в сочетании со значением 0 в его модели (без прогресса) выглядит так.

Я уверен, что вы читали всегда очень ценные разделы учебника по свингам: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

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