【问题标题】:How can I refresh a JScrollPane after choosing an element from a JComboBox?从 JComboBox 中选择元素后,如何刷新 JScrollPane?
【发布时间】:2011-03-13 12:16:42
【问题描述】:

我有一个 JComboBox,每次从 JComboBox 中选择不同的元素时,我都想在 JScrollPane 中加载不同的内容。内容由不同数量的 JLabel 和 JTextField 组成。

我做了什么:

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。

请对我做错了什么有任何想法?

【问题讨论】:

标签: java swing jcombobox


【解决方案1】:
scrollPane = showPanel(selected);     

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

scrollPane.setViewportView( showPanel(selected) );

下次应该发布适当的 SSCCE。

【讨论】:

  • 感谢 camickr,您的回答永远不会失败。下次我会发布更好的SSCCE。
【解决方案2】:

没有证据表明新创建的 JScrollPane 曾经被添加到任何东西中。

我会尝试以下任何一种:

  1. 将带有 CardLayout 的 JPanel 添加到 JScrollPane,并添加其他 组件的集合 面板。
  2. 呼叫 setViewportView(组件视图) on 现有的 JScrollPane。

【讨论】:

  • JScrollPane 在创建后被添加到 JPanel 中。我没有发布所有代码,因为它是一个复杂的应用程序。你说的我已经做了。 JPanel centerPanel; centerPanel = new JPanel(new JLabel("Test")); productsPane = new JScrollPane(centerPanel);
  • 我从 download.oracle.com/javase/tutorial/uiswing/components/… 关注了 JComboBoxes 上的 sun 示例
  • 那么您需要发布足够的信息,以便您的问题得到解答。 SSCCE 会很好,正如 Andrew 在他对您上面帖子的第一条评论中提到的那样。
  • 我从来没有做过SSCCE...我现在已经试过了。请告诉我是否可以。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    当您使用此 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多