我正在尝试实施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);
}
}
答案 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)
您应该使用JPanel
将JScollPanes
添加到getViewport()
视口,然后重新打包JFrame
以使用{排序调整大小问题{1}}:
pack();
而不是:
jsp.getViewport().add(p);
frame.pack();