2012-06-22 3 views
1

Я пытаюсь реализовать JTabbedPane. В следующем коде я представил случай, очень похожий на то, что я хочу реализовать. Я создал вкладку, добавив JPanel в JTabbedPane. Я добавил JButton и JScrollPane в JPanel. При щелчке JButton я хочу добавить новый JPanel с некоторыми JRadioButtons в JScrollPane. Но они не отображаются даже после обновления JScrollPane или основного JPanel. Пожалуйста помоги. Код приведен ниже.Обновить компонент JTabbedPane

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 


public class Test { 

    static JFrame frame; 


    public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

private static void createAndShowGUI() { 
    //Create and set up the window. 
    frame = new JFrame("DynamicTreeDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JTabbedPane tp = new JTabbedPane(); 
    final JScrollPane jsp = new JScrollPane(); 
    JPanel jp = new JPanel(); 
    JButton jb = new JButton("Refresh"); 
    jb.setActionCommand("Show"); 
    jb.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getActionCommand().equalsIgnoreCase("Show")){ 
       JRadioButton jrb1 = new JRadioButton("First Option"); 
       JRadioButton jrb2 = new JRadioButton("Second Option"); 
       JRadioButton jrb3 = new JRadioButton("Third Option"); 
       ButtonGroup bg = new ButtonGroup(); 
       bg.add(jrb1);  
       bg.add(jrb2); 
       bg.add(jrb3); 
       JPanel p = new JPanel(new GridLayout(0,1)); 
       p.add(jrb1); 
       p.add(jrb2); 
       p.add(jrb3); 

       jsp.add(p); 
       jsp.revalidate(); 
       jsp.repaint(); 
      }  
     } 
    }); 

    jp.setLayout(new GridLayout(0,1)); 
    jp.add(jb); 
    jp.add(jsp); 
    tp.add("First Tab", jp); 


    frame.getContentPane().add(tp);     

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
} 
} 
+0

Попробуйте делать р .invalidate(); –

ответ

4

Чтобы добавить что-то JScrollPane использовать его JViewport вместо прямого вызова add(). В вашем примере заменить:

jsp.add(p); 

с:

jsp.getViewport().add(p); 

В качестве альтернативы, инициализировать JScrollPane с JPanel, который содержит другие компоненты. Основываясь на вашем примере:

final JPanel panel = new JPanel(); 
final JScrollPane jsp = new JScrollPane(panel); 

panel.add(new JRadioButton("First Option")); 
panel.add(new JRadioButton("Second Option")); 
panel.add(new JRadioButton("Third Option")); 

См How to Use Scroll Panes для более подробной информации.

3

Компоненты должны быть добавлены к JPanel под названием jp, а не непосредственно к панели прокрутки.

3

JScrollPane работает только с одним «представлением». Вы не можете добавлять компоненты в scrollPane. Если вы хотите, вы можете изменить «Вид», используя setViewPortView(). Для достижения поведения, которое вы ищете, выполните следующие действия:

JPanel centralView = new JPanel(); 
// possibly configure that central view with appropriate layout and other stuffs 
JScrollPane jsp = new JScrollPane(centralView); 

... // Теперь вы можете добавить свои компоненты centralView вместо вашего jsp.add (...) звонки.

1

Вы должны добавить JPanel к JScollPanesвидовом с использованием getViewport(), затем упакуйте JFrame получить вопрос проклейки сортируют с помощью pack();:

  jsp.getViewport().add(p); 
      frame.pack(); 

вместо:

  jsp.add(p); 
      jsp.revalidate(); 
      jsp.repaint(); 
+0

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

+1

aaacccch pack может быть контрацептивным, вы палеонтолог ??? +1 для stonedges 'getViewport(). Add()', но базовый материал - setViewport() 'Удаляет старый видовой экран (если он есть); заставляет viewPosition нового окна просмотра находиться в квадранте + x, + y; синхронизирует заголовки строк и столбцов (если они есть) с новым окном просмотра; и, наконец, синхронизирует полосы прокрутки и заголовки с новым окном просмотра. Большинство приложений будет более удобно использовать setViewportView для добавления видового экрана и представления в scrollpane.' – mKorbel

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