2010-04-21 6 views
0

im, выполняющие функцию поиска для базы данных, которая использует jtabbedpane с одной вкладкой для быстрого поиска, а другая для расширенного поиска. в расширенном поиске есть еще несколько полей, поэтому оно должно быть больше, но я не хочу, чтобы все окно всегда было в наибольшем размере по эстетическим соображениям. я добавил слушателя изменений на панель и попытался изменить размер панели на основе той вкладки, которую она представляет, и код выполняется при нажатии на вкладку, но ничего не делает. ive попробовал использовать tabbedSearchPane.setSize(), за которым следует tabbedSearchPane.validate(), а также изменение размеров компонентов вокруг него с помощью setSize + validate, и ничего, кажется, ничего не делает. Мне просто нужно знать, как НАЗНАЧИТЬ размер jtabbedpane.jtabbedpane вкладки разного размера

ответ

1

Как описано в Preferred Size in Tabs, и, как вы заметили, JTabbedPane пытается очень тяжело сделать, чтобы разместить самую большую панель. Чтобы переключиться с большей на меньшую, вам нужно заменить большую панель на временную, имеющую тот же размер, что и меньший, и invalidate() панель с вкладками; обратное нужно идти в другую сторону. Это борьба. В качестве альтернативы рассмотрите использование CardLayout, упомянутый here. По мере того, как вы захотите изменить размер контейнера, обратите внимание, как это связано с example соответственно pack().

+0

Это лучшее объяснение поведения я нашел на SO. Когда вы говорите 'invalidate()' это то, что называется 'tabLarge.Invalidate()', когда вы меняете? Я изо всех сил пытаюсь подумать, как это сделать. – Pureferret

+0

Нет 'invalidate()' просто отмечает контейнер как необходимый макет при последующих 'validate()' или 'pack()'. – trashgod

+0

Итак, мне нужно удалить содержимое других вкладок и заменить панель пустых времен при включении? Как вы получаете такое поведение ... changeListener? – Pureferret

0

Я решил эту проблему, как это без проблем. (Моя вкладками панель наследуется в другой панели, если она играет никакой роли)

tabbedPane.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       switch (tabbedPane.getSelectedIndex()) { 
       case 0: 
        tabbedPane.setPreferredSize(new Dimension(1, 230)); 
        break; 
       case 1: 
        tabbedPane.setPreferredSize(new Dimension(1, 330)); 
        break; 
       case 2: 
        tabbedPane.setPreferredSize(new Dimension(1, 430)); 
        break; 
       } 
      } 
     }); 

и, конечно же, когда я создаю мой JTabbedPane:

tabbedPane.setPreferredSize(new Dimension(1, 230)); 

я перекрашивать-перепроверить и jtabbed/parentpanel и после это, но по другим причинам ... Кажется, что это работает, даже не называя перепланировку/повторную проверку в любой из панелей.

Preview (Красная граница = другая панель)

enter image description here

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