在Java中收集数据的有效方法是什么?

时间:2012-03-14 22:49:11

标签: java file

场景:我有一个包含各种组件的GUI,用户可以在其中选择选项。我希望将这些选项收集到一个地方,然后用户可以将该信息发送给我。什么可能是存储信息的最合理的地方?

EDITED: GUI已经包含了包含用户选项的部分。例如,一个JComboBox给出了一个可以选择的选项列表。然后我把它打印为System.out.println(User choice);所有其他组件都遵循相同的模式;所有信息都是通过System.out.println();打印的。现在我不是以这种方式打印,而是在寻找合理的地方来写这些信息。

3 个答案:

答案 0 :(得分:1)

创建一个将用作商店的类。

使用该类的对象来存储用户所做的事情,比如他们点击一个按钮在该类中有一个变量是一个整数,并表示该按钮被点击的次数。

收集数据时,只需将数据从商店类发送到您需要发送到的任何地方。

答案 1 :(得分:0)

  

选项可以收集到用户可以使用的单个位置   把这些信息发给我

您有很多选择,具体取决于“向我发送信息”的内容:

  1. 您可以将信息存储在集中式关系数据库中。客户端连接到它并发送要保留的信息。
  2. 您可以以某种格式(例如XML,JSON等)将该数据序列化到文件系统,并为用户提供将数据发布到某种侦听器的机制。或者他们可以将文本文件附加到电子邮件中并发送给您,留下下载,解析和存储的详细信息。
  3. 您没有说明您打算如何获取此数据。你有没有想过这个?您需要指定事务的两端以获得有意义的,可操作的答案。也许您应该更详细地修改您的问题。

    更新

    现在我们有一些细节:

    1. 应用程序将文件写入磁盘
    2. 用户需要通过电子邮件发送给OP作为附件
    3. OP将保存附件,将它们与用户ID相关联,然后将它们导入Excel进行进一步处理。
    4. 我建议使用.csv作为文件格式。这是一种简单的文本格式,您可以轻松导入Excel。

      SMTP是通信协议。监听器是电子邮件服务器。

      用户如何通过电子邮件发送给您?您是否会设置一个电子邮件帐户,除了记录这些消息之外什么都不做?

答案 2 :(得分:0)

假设您有一个模型类来表示GUI状态:

public class Model
{
    private String name = "";

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

您可以使用JPanel在GUI上呈现此内容,例如:

public class GuiPanel extends JPanel
{
    private final Model model;
    private final JTextField nameField;

    public GuiPanel(Model model)
    {
        this.model = model;

        JLabel nameLabel = new JLabel("Name");
        nameField = new JTextField(50);
        nameField.setText(model.getName());
        add(nameLabel);
        add(nameField);
    }

    public void init()
    {
        nameField.addKeyListener(new KeyListener()
        {
            public void keyTyped(KeyEvent e)
            {
                updateModel();
            }

            public void keyPressed(KeyEvent e)
            {
                updateModel();
            }

            public void keyReleased(KeyEvent e)
            {
                updateModel();
            }
        });    
    }

    public void updateModel()
    {
        model.setName(nameField.getText());
    }
}

请注意,当GUI更改时,更改将传播到模型对象。可以使用类似XStream的东西序列化模型的状态:

public class Serializer
{
    public String serialize(Model model)
    {
        XStream xstream = new XStream();
        return xstream.toXML(model);
    }

    public Model deserialize(String xml)
    {
        XStream xstream = new XStream();
        return (Model) xstream.fromXML(xml);
    }
}

现在,面板可以显示在JFrame上,如:

public class Main
{
    public static void main(String[] args) throws Exception
    {
        final JFrame frame = new JFrame("Main");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 100);

        final Model model = new Model();
        GuiPanel panel = new GuiPanel(model);
        panel.init();
        final Serializer serializer = new Serializer();
        JButton button = new JButton("Save");

        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String xml = serializer.serialize(model);
                // TODO: write str to disk
                JOptionPane.showMessageDialog(frame, xml);
            }
        });

        frame.add(panel, BorderLayout.CENTER);
        frame.add(button, BorderLayout.SOUTH);

        SwingUtilities.invokeAndWait(new Runnable()
        {
            public void run()
            {
                frame.setVisible(true);
            }
        });

    }           
}