Combobox获取数据用户友好的方式并将它们设置为数字

时间:2015-11-29 20:32:13

标签: java swing combobox

我正在使用带有Java语言的Swing库实现我的项目的GUI。我想用一个用户友好的文本来获取用户的间隔,比如"每隔15分钟#34;但在存储数据中,我必须在几秒钟内将其保存为数字。你可以查看我的GUI:

enter image description here

我知道我可以通过为每个可能的项目编写一个带有if else的组合框的项目监听器来解决这个问题,但我想知道是否有更实用的方法来做到这一点?因为我必须在我的程序中使用4个组合框。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以为JComboBox中的项目使用自定义类。来自The Java Tutorials - How to Use Combo Boxes

  

"默认渲染器知道如何渲染字符串和图标。如果将其他对象放在组合框中,则默认渲染器会调用toString方法以提供要显示的字符串。"

如果使用实现toString方法的自定义类,则可以向项添加更多数据(如间隔的持续时间,以秒为单位)。例如(使用Java 8):

// Class ComboBoxTextAndNumber:

import java.awt.event.ItemEvent;
import java.util.*;
import java.util.Vector;
import javax.swing.*;

public class ComboBoxTextAndNumber {
    public static void main(final String[] arguments) {
        SwingUtilities.invokeLater(
                () -> new ComboBoxTextAndNumber().createAndShowGui()
        );
    }

    private void createAndShowGui() {
        final JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final Vector<Interval> intervals = new Vector<>(Arrays.asList(
                new Interval("every 5 years", 5 * 365 * 24 * 60 * 60),
                new Interval("every day", 24 * 60 * 60))
        );

        final JPanel panel = new JPanel();
        final JComboBox<Interval> comboBox = new JComboBox<>(intervals);
        panel.add(comboBox);
        frame.getContentPane().add(panel);

        comboBox.addItemListener(
                itemEvent -> {
                    if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
                        final Interval interval = (Interval) comboBox.getSelectedItem();
                        System.out.println(interval.getSeconds());
                    }
                }
        );

        frame.setVisible(true);
    }
}


// Class Interval:

public class Interval {
    private final String description;
    private final long seconds;

    public Interval(final String description, final long seconds) {
        this.description = description;
        this.seconds = seconds;
    }

    public String getDescription() {
        return description;
    }

    public long getSeconds() {
        return seconds;
    }

    @Override
    public String toString() {
        return getDescription();
    }
}