Я создал очень простой 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);
Заранее благодарю за любую помощь, которую вы можете оказать.