刷新JTabbedPane组件

时间:2012-06-22 15:41:27

标签: java swing refresh repaint jtabbedpane

我正在尝试实施JTabbedPane。在下面的代码中,我提出了一个与我想要实现的非常相似的案例。我通过向JTabbedPane添加JPanel创建了一个选项卡。我已经在JPanel中添加了JButton和JScrollPane。点击JButton我想在JScrollPane中添加一个带有一些JRadioButtons的新JPanel。但是,即使在刷新JScrollPane或主JPanel之后,这些也不会显示。请帮忙。代码如下。

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);
}
}

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

应将组件添加到名为JPanel的{​​{1}},而不是直接添加到滚动窗格。

答案 2 :(得分: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(...)调用。

答案 3 :(得分:1)

您应该使用JPanelJScollPanes添加到getViewport() 视口,然后重新打包JFrame以使用{排序调整大小问题{1}}:

pack();

而不是:

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