2012-06-22 55 views
1

我正在尝试实现JTabbedPane。在下面的代码中,我提出了一个非常类似于我想实现的案例。我通过向JTabbedPane添加JPanel来创建一个选项卡。我已经将JButton和JScrollPane添加到JPanel。单击JButton时,我想将一些具有一些JRadioButton的JPanel添加到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

尝试做p .invalidate(); –

回答

4

要添加的东西JScrollPane使用其JViewport而不是直接调用add()。在您的例子取代:

jsp.add(p); 

有:

jsp.getViewport().add(p); 

另外,初始化JScrollPaneJPanel保持其他部件。根据您的示例:

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

应将组件添加到名为jpJPanel,而不是直接添加到滚动窗格。

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使用getViewport()JScollPanes,然后重新包装JFrame得到上浆问题使用pack();排序:

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

代替:

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

我不会推荐使用pack()一旦可见框架,因为它可能会非常令人不安,因为用户有一个框架可以调整自己的大小。如果您需要对布局问题进行排序,通常在受影响的容器上调用revalidate()就足够了。 –

+1

aaacccch包可能会产生反效果,你是古生物? getViewport()。add()',但基本的东西是setViewport()'删除旧的视口(如果有的话);强制新视口的viewPosition位于+ x,+ y象限中;使用新的视口同步行和列标题(如果有的话);最后将滚动条和标题与新视口同步。 大多数应用程序会发现使用setViewportView向scrollpane添加视口和视图更方便。 – mKorbel