2011-03-13 84 views
0

我有一个JComboBox,我想在JScrollPane中加载一个不同的内容,每次我从JComboBox中选择一个不同的元素。内容由各种数量的JLabel和JTextFields组成。如何在从JComboBox中选择元素后刷新JScrollPane?

我做了什么:

JScrollPane scrollPane; 
JComboBox combo; 

JPanel back = new JPanel(new BorderLayout()); 
combo = new JComboBox({ "Bird", "Cat", "Dog", "Rabbit", "Pig" }); 
combo.addActionListener(new AnimalLoader()); 
scrollPane = showPanel((String) combo.getSelectedItem()); 

back.add(combo, BorderLayout.NORTH); 
back.add(scrollPane, BorderLayout.SOUTH); 

back.setVisible(true); 

protected JScrollPane showPanel(String name) 
{ 
    JPanel contentPanel = new JPanel(new JLabel(name)); 
    scrollPane = new JScrollPane(contentPanel); 

    return scrollPane; 
} 

private class AnimalLoader implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
      JComboBox cb = (JComboBox) e.getSource(); 
      String selected = (String) cb.getSelectedItem(); 
      scrollPane = showPanel(selected);    
    } 
} 

我没做这个重载不同JScrollPane的时候我选择另一个项目。 只有属于JComboBox的第一个项目(默认的一个)的JScrollPane被加载。

任何想法,我做错了,请吗?

+1

为了更好地帮助越早,后期的SSCCE(http://pscode.org/sscce的.html)。 – 2011-03-13 12:37:50

回答

2
scrollPane = showPanel(selected);  

当您选择一个项目时,不要创建新的scoll窗格。相反,您需要更改滚动窗格的视口中包含的面板。也就是说,你的“showPanel”方法应该返回面板,而不是一个滚动窗格。然后您可以使用:

scrollPane.setViewportView(showPanel(selected)); 

下一次应该发布正确的SSCCE。

+0

谢谢camickr,你的答案永远不会失败。下次我会发布更好的SSCCE。 – radonys 2011-03-14 09:20:21

1

没有证据显示新创建的JScrollPane添加到任何东西。

我会尝试任何一种:

  1. 用CardLayout添加一个JPanel来 JScrollPane的,并添加组件的其他 收集到 的JPanel。
  2. 调用 setViewportView(组件视图) 现有的JScrollPane。
+0

JScrollPane在创建后添加到JPanel。我没有发布所有的代码,因为它是一个复杂的应用程序。我已经完成了你所说的。 'JPanel centerPanel;centerPanel = new JPanel(new JLabel(“Test”)); productsPane = new JScrollPane(centerPanel);' – radonys 2011-03-13 12:52:41

+0

我遵循JComboBoxes上的sun示例http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html#uneditable – radonys 2011-03-13 12:55:37

+1

然后您需要发布信息足够的信息,所以你的问题是可以回答的。安德鲁在他上面对你的帖子的第一条评论中提到,[SSCCE](http://sscce.org)会很好地完成。 – 2011-03-13 13:00:22

0

panel.revalidate();
panel.repaint();

0

当你使用这个example,尝试行73这种变化,近ComboBoxDemo构造函数的末尾:

//Lay out the demo. 
add(petList, BorderLayout.PAGE_START); 
JScrollPane jsp = new JScrollPane(picture); 
jsp.getViewport().setPreferredSize(new Dimension(100, 100)); 
add(jsp, BorderLayout.PAGE_END); 
setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
+0

谢谢......问题已经解决如上。 – radonys 2011-03-14 09:21:26