JTabbedPane: рисуется только первая вкладка, вторая всегда пуста (новичок Q) - PullRequest
0 голосов
/ 09 января 2011

Я создал очень простой JTabbedPane, сначала создав пустой объект JTabbedPane, а затем 2 JPanels, которые позже добавлю. Каждый JPanel содержит объект, который расширяет JButton и реализует MouseListener. Каждый из них содержит различное изображение, загруженное из файла; изображение хранится локально как буферизованное изображение, значок изображения и т. д., и все это прекрасно работает Смысл всего этого заключается в том, чтобы разрешить изменение размера изображения при изменении размера кнопки (с помощью getscaledinstance ()), потому что размер панели изменяется, потому что JTabbedPane изменяет размер и т. Д. В JFrame, который содержит все. Я переопределяю paintComponent () для достижения этой цели в классе, расширяющем JButton. Я использую MigLayout Manager, и все хорошо на этом фронте, контролируя ограничения макета, рост, заполнение, начальные размеры, предпочтительные размеры и т. Д. Изображения, которые удерживаются кнопками, имеют разные размеры и пропорции, но раньше это не вызывало проблем.

До 2 дней назад все работало довольно хорошо. Я внес некоторые изменения, пытаясь откорректировать некоторые проблемы с изменением размера, когда подбирал менеджер MigLayout. В то время я занимался настройкой различных минимальных, максимальных и предпочтительных размеров, используя методы, предоставляемые компонентами, а не диспетчером компоновки. Я также одурачил немного с pack (), validate (), visible (), opaque () и т. Д., И да, я прочитал статью о Swing и AWT-живописи здесь: http://java.sun.com/products/jfc/tsc/articles/painting/, и я переключился на полагаться больше и больше на MigLayout. На несвязанной ноте кажется, что JFrame не соблюдает maxsize?

Почему-то сегодня, с использованием и без использования любого из этих методов, предоставляемых Swing, с использованием или без использования менеджера MigLayout для решения некоторых из этих вопросов, вместо этого у меня теперь есть JTabbedPane, который корректно отображает ПЕРВУЮ JPanel, которую я добавил, но НЕ ВТОРОЙ JPanel - который, хотя и представлен в виде вкладки, - не отображается при выборе. Я изменил порядок того, какая панель добавляется первой, и это по-прежнему верно независимо от того, какую JPanel я добавляю первой, говоря мне, что JPanel в порядке, и проблема, скорее всего, в JTabbedPane. Я нажимаю на вторую вкладку, переключается JTabbedPane, но у меня есть то, что кажется пустой кнопкой в ​​JPanel. Несколько операторов системного вывода консоли показывают следующее: а) что вторая панель и ее кнопка созданы б) никакие события мыши не регистрируются, когда я нажимаю на место, где должны находиться вторая панель и кнопка, как если бы она не существовала в таком случае; c) когда я переключаюсь на вторую вкладку, переопределенный метод paintComponent () кнопки во втором JPanel никогда не вызывается, поэтому он фактически никогда не рисуется, несмотря на то, что вкладка, в которой он находится, становится видимой; d) JTabbpedPane getComponentCount () возвращает правильное значение 2 после добавления 2-й панели; e) Менеджер MigLayout действительно крут, но я отвлекся ...

Теперь я не могу вернуться к своему старому коду, и, несмотря на все мои старания исправить все изменения, вызвавшие это, я не могу решить мою новую проблему. Я закомментировал все, кроме самых важных вызовов: конструкторы для каждого объекта - с MigLayout; add () для размещения кнопок на панелях, используя строковые аргументы, подходящие для MigLayout; add () для размещения панелей на JTabbedPane, также со строковыми аргументами MigLayout; установка операции по умолчанию на закрытие для JFrame; и установка JFrame видимым. Это означает, что я не играю с настройками оптимизации, настройками двойной буферизации, непрозрачными настройками, но оставляю их как настройки по умолчанию, и все же, без изменений; вторая панель не покажет себя. Я должен добавить, что каждая панель, когда она загружается первой, работает нормально, еще раз подтверждая, что панели и кнопки в порядке.

Вот часть того, что я делаю:

//Note: BuildaButton is a class that merely constructs my instances
File f = new File("/foo.jpg");
button1 = new BuildaButton().BuildaButton(f).buildfoo1Button();

f = new File("/foo2.jpg");
button2 = new BuildaButton().BuildaButton(f).buildfoo2Button();

MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(ml);
foo2panel.add(button2, "w 186:752:, h 200:807:");



tabs.add("foo1", foo1panel);
tabs.add("foo2", foo2panel);
System.out.println("contents of tabs: " + tabs.getComponentCount() + " elements");
mainframe.setLayout(ml2);
mainframe.setMinimumSize(new Dimension(850,800));
mainframe.add(tabs, "w 600:800:, h 780:780:");
//controlpanel is a still blank jpanel that holds nothing--it is a space holder for now & will be utilized
mainframe.add(controlpanel, "w 200:200:200, h 780:780:");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setVisible(true);

Заранее благодарю за любую помощь, которую вы можете оказать.

1 Ответ

2 голосов
/ 09 января 2011

Нельзя использовать один и тот же экземпляр макета на разных панелях.Просто создайте второй экземпляр макета точно так же, как ml и установите его на второй панели:

...
MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout mla = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

BorderLayout test = new BorderLayout(5,5);

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(mla);
foo2panel.add(button2, "w 186:752:, h 200:807:");
...
...