【问题标题】:Use a linkedhashset in jcombobox? [closed]在 jcombobox 中使用linkedhashset? [关闭]
【发布时间】:2013-12-25 20:23:56
【问题描述】:

我正在尝试使用 MVC 设计模式创建程序。在我的模型中,我创建了一组字符串。字符串只是大约 45 个语言环境的集合。

在我看来,我正在创建一个 JComboBox。我想按顺序使用 45 个唯一区域设置的集合,所以我使用的是 LinkedHashSet。

我在尝试将语言环境传递给 JComboBox 时遇到问题,并且有几件事我不确定。

编辑:我想知道的主要是如何将我的 Set 放入我的 JComboBox。以下是我在写这篇文章时想到的其他一些问题。如果您愿意,请随时回答他们!

  1. 我应该使用 Set,它是正确的集合吗?
  2. 我应该使用 LinkedHashSet,它是正确的实现方式吗?
  3. 我是否正确使用了组合框?
  4. 有什么建议吗?
  5. 我对数据结构了解不多,有什么好的资源吗?

这是我已经在使用的代码:

查看

private JComboBox<String> m_selectLocale = new JComboBox(getLocales());

LinkedHashSet<String> getLocales(){
    System.out.println("running");
    Set<String> localesSet = m_model.getLocales();
    LinkedHashSet<String> locales = new LinkedHashSet<>(localesSet);
    return locales;
}

型号

private static Set<String> localeSet = new LinkedHashSet<String>(Arrays.asList("All", "ar-ae", "ar-sa", "cs-cz", "da-dk", "de-at", "de-ch", "de-de", "el-gr", "en-ae", "en-au"));

public Set<String>getLocales(){
    return localeSet;
}

【问题讨论】:

  • 哎呀,这是一大堆问题。 这个问题你想回答哪一个
  • 对不起,写这个问题时我脑子里突然冒出很多东西。我想知道的主要事情是如何将我的模型中的 Set 放入我的 JComboBox。一旦我的程序运行起来,也许我可以重构最佳实践?
  • “我最想知道的是..” 编辑问题!
  • 如果你想使用我认为的实现,你必须自己创建ComboBoxModel..
  • 我不确定您实际上在问什么:我的意思是,根据您自己的用例,在客户端代码中使用 hashSet 完全是您的选择。 JComboBox 已经有一个模型:DefaultComboBoxModel。如果您正在谈论这个ComboBox 模型,那么您可以根据需要实现您的模型。无论哪种情况,哪种实现更好仍然在您的用例中。 HashSet 不会在维持任何订单时回复答案,TreeSet 会但 O(log n) 对于每个操作和 LinkedHashSet 虽然它维持订单并没有承诺提供 O(1) 成本不像 HashSet跨度>

标签: java swing jcombobox linkedhashset


【解决方案1】:

我相信你可以这样做:

m_selectLocale = new JComboBox(new DefaultComboBoxModel(new Vector<String>(getLocales())));

(换句话说,通过将您的有序集合传递给 Vector 的“从集合中添加”构造函数来创建一个新 Vector,然后使用它来创建您的 ComboBoxModel

更新:查看 Javadoc,看起来您可以跳过一个步骤:

m_selectLocale = new JComboBox(new Vector<String>(getLocales()));

我相信,它隐式地为您创建了一个新的 ComboBoxModel。

FWIW,如果您想保留选项的插入顺序,我认为 OrderedSet(如 LinkedHashSet)是一个不错的选择。例如,如果您想在 ComboBox 中拥有按字母顺序排列的选项列表,则可能需要使用使用集合成员自然排序的 OrderedSet,例如 TreeSet。

【讨论】:

  • 哦,是的,他可以,但我认为他不想拥有 Vector
  • 啊。也许我误解了;我认为问题是如何简单地将他的集合中的有序项目集合转换为 ComboBox 形式。很长一段时间以来,我都不知道 Vector 已被“收集电离”,并且我会通过愚蠢的扭曲尝试将我的 Collections 复制到 Vector 中,以便将它们与 Swing 一起使用。 :)
【解决方案2】:

我应该使用 Set,它是正确的集合吗?

这将取决于您希望达到的目标。 Set 将保证唯一性。基于有限的信息,我认为这是一个不错的选择。

我应该使用 LinkedHashSet,它是正确的实现吗?

同样,这将取决于您想要实现的目标。任何链接结构都非常适合序列化访问(从头到尾移动),但不太适合随机访问(跳入列表和任意点)

这可能使它成为与组合框一起使用的糟糕选择

我是否正确使用了组合框?

鉴于代码无法编译,可能不会。 JComboBox 采用 ComboBoxModel、数组或 Vector,而不是任何类型的 Set

就个人而言,我会创建我自己的组合框模型,由Set 支持。这样您就不需要将Set 转换为其他类型的结构,并且可以节省(少量)内存。

有什么建议吗?

阅读教程

我对数据结构了解不多,有什么好的资源吗?

根据最后一个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多