2009-08-10 2 views
3

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

Since I'm not allowed to use img tags...

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. Как вы можете сказать, код точно такой же. Проблема в том, что тест работает и отображается правильно. Я добавил весь код, связанный с другой реализацией окна диалога.

ответ

1

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

+0

Я добавил эти строки после setStringPainted(), но перед добавлением его в панель содержимого: bar.setPreferredSize (новый размер (200, 100)); bar.setSize (200, 100); и он все еще не показывался. –

0

Вы можете использовать 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

+0

getContentPane(). SetLayout (новый BorderLayout()); getContentPane(). add (bar, BorderLayout.CENTER); и упаковка не отображалась. –

0

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

setVisible(true); 
toFront(); 

в случае toFront () no-ops для не отображаемого виджета.

+0

Я собираюсь сохранить вызовы в том порядке, который вы представили, но все же не делает панель видимой. –

2

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

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

c) Стандартная компоновка JFrame или JDialog - это BorderLayout, поэтому нет необходимости перезагружать макет.

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

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

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

Если вам нужна дополнительная помощь, вам необходимо создать Short, Self Contained, Compilable and Executable, Example Program (SSCCE), который демонстрирует неправильное поведение.

+0

Вы правы с d). Но я не уверен в c): new JFrame(). GetContentPane.getLayout() возвращает JRotePane $ 1. – zedoo

+0

Я внес некоторые изменения, которые вы предложили, многие из них были такими, какие вы предложили перед вами, но были лишены возможности исправить проблему. Я сделал SSCCE и разместил его выше. –

Смежные вопросы