1

我正在尝试实现 JTabbedPane。在下面的代码中,我提出了一个与我想要实现的非常相似的案例。我通过向 JTabbedPane 添加 JPanel 创建了一个选项卡。我在 JPanel 中添加了一个 JButton 和 JScrollPane。单击 JButton 时,我想将具有一些 JRadioButtons 的新 JPanel 添加到 JScrollPane。但是即使在刷新 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

4 回答 4

4

添加一些东西来JScrollPane使用它JViewport而不是直接调用add(). 在您的示例中替换:

jsp.add(p);

和:

jsp.getViewport().add(p);

或者,使用包含其他组件JScrollPane的 a进行初始化。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"));

有关详细信息,请参阅如何使用滚动窗格

于 2012-06-22T16:08:30.400 回答
3

组件应添加到被JPanel调用jp而不是直接添加到滚动窗格。

于 2012-06-22T16:09:42.667 回答
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(...) 调用。

于 2012-06-22T16:12:52.177 回答
1

您应该使用将 添加JPanelJScollPanes 视口getViewport(),然后重新打包JFrame以使用以下方式对大小问题进行排序pack();

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

代替:

           jsp.add(p);
           jsp.revalidate();
           jsp.repaint();
于 2012-06-22T16:26:08.540 回答