最佳实践数据库访问 - 联系人列表

时间:2013-03-22 15:23:19

标签: java database swing jtable jlist

我一直想知道很长一段时间,同时为这个问题创建了几个愚蠢的解决方案,如何正确地完成以下工作:

数据表: ID | givenname |姓氏|地址|数据......

我想在列表框中显示所有给定名字+姓氏和一个项目的uppon选择,我想检索相应数据集的其余部分并显示在某些文本框中。

所以我基本上做了:

1)查询:SELECT ID,givenname,lastname FROM DataTable;

2)创建和“联系对象”的ArrayList(只是一个与DataTable具有相同成员的类具有列),我遍历结果集,因此使用ID,givenname和lastname创建其中几个对象。

!3)我希望列表框显示givenname +“”+ lastname,但是在选择“John Doe”时,我希望程序知道这个“john Doe”的arraylist的哪个元素(如果还有更多)比其中一个),从对象中退出ID并退出他的地址和“数据”

我经常做的事情就像是“列表框中的第3个John Doe被选中,让我们在arraylist中寻找第3个john doe,并希望上帝认为这是对的” 这似乎对我来说是非常不必要的。

Java + Swing中有什么可用的解决方案

我希望我能以某种方式说清楚我需要什么^^

问候 Billdoor

3 个答案:

答案 0 :(得分:3)

要显示Object,Swing组件将使用放置在其中的Object的toString()方法。一种常见的方法是创建一个包含名称,ID等的Data类,实现toString()以显示您想要的内容,然后在JList中放置这些对象的列表。然后在选择时,获取所选项目,将其强制转换为数据类,然后调用getID()。

答案 1 :(得分:1)

您应创建一个表模型来保存数据并根据需要创建渲染器以正确显示它。有关详细信息,请参阅How to Use Tables。然后在表的选择侦听器中,您可以检索相关的行。您可以使用TableModel.getValueAt()或添加帮助程序方法来检索所选数据。以下是用户模型的简单示例。该应用程序打印选定的用户,包括表中不可见的ID。模型中有一种方便的方法getUser(),可以让用户在特定行。请注意,您也可以使用DefaultTableModel作为简单方案。

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;

public class UserTableDemo {

    public UserTableDemo() {
        JFrame frame = new JFrame("UserTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final UserModel model = new UserModel();
        final JTable table = new JTable();
        table.setModel(model);
        JScrollPane scrollPane = new JScrollPane(table);
        JPanel content = new JPanel(new BorderLayout());
        content.add(scrollPane, BorderLayout.CENTER);
        final JTextArea output = new JTextArea(5, 30);
        content.add(output, BorderLayout.SOUTH);

        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (!e.getValueIsAdjusting()) {
                            UserEntry entry = model.getUser(table
                                    .getSelectedRow());
                            if (entry != null) {
                                output.setText("Selected row:"
                                        + table.getSelectedRow() + " "
                                        + entry.toString());
                            } else {
                                output.setText("");
                            }
                        }
                    }
                });

        frame.add(content);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public class UserModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        private List<UserEntry> users = new ArrayList<UserEntry>();

        public UserModel() {
            //TODO - load users
            users.add(new UserEntry(3, "John", "Doe"));
            users.add(new UserEntry(2, "John", "Doe"));
            users.add(new UserEntry(1, "John", "Doe"));
        }

        public UserEntry getUser(int row) {
            if(row >= 0 && row < users.size())
                return users.get(row);
            return null;
        }

        @Override
        public int getRowCount() {
            return users.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            UserEntry entry = users.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return entry.getFirstName();
                case 1:
                    return entry.getLastName();
            }
            return null;
        }

        @Override
        public String getColumnName(int column) {
            switch (column) {
                case 0:
                    return "First Name";
                case 1:
                    return "Last Name";
            }
            return null;
        }
    }

    public class UserEntry {
        private int id;
        private String firstName;
        private String lastName;

        public UserEntry(int id, String firstName, String lastName) {
            super();
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public int getId() {
            return id;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @Override
        public String toString() {
            return "UserEntry [id=" + id + ", firstName=" + firstName
                    + ", lastName=" + lastName + "]";
        }
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new UserTableDemo();
            }
        });
    }
}

如果您使用的是JList而不是JTable,则会采用相同的流程。

编辑:

以下是使用JListDefaultListModel以及自定义渲染器来显示用户列表的类似示例。

import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.*;
import javax.swing.event.*;

public class UserListDemo {
    public UserListDemo() {
        JFrame frame = new JFrame("User List");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JList list = new JList();

        JScrollPane scrollPane = new JScrollPane(list);
        JPanel content = new JPanel(new BorderLayout());
        content.add(scrollPane, BorderLayout.CENTER);
        final JTextArea output = new JTextArea(5, 40);
        content.add(output, BorderLayout.SOUTH);
        final DefaultListModel model = new DefaultListModel();
        model.addElement(new UserEntry(3, "John", "Doe"));
        model.addElement(new UserEntry(1, "John", "Doe"));
        model.addElement(new UserEntry(3, "John", "Doe"));
        list.setModel(model);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        list.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list,
                    Object value, int index, boolean isSelected,
                    boolean hasFocus) {
                if (value instanceof UserEntry) {
                    return super.getListCellRendererComponent(list,
                            ((UserEntry) value).getFirstName() + " "
                                    + ((UserEntry) value).getLastName(), index,
                            isSelected, hasFocus);
                }
                return super.getListCellRendererComponent(list, value, index,
                        isSelected, hasFocus);
            }
        });

        list.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (!e.getValueIsAdjusting()) {
                            UserEntry entry = (UserEntry) list
                                    .getSelectedValue();
                            if (entry != null) {
                                output.setText("Selected row:"
                                        + list.getSelectedIndex() + " "
                                        + entry.toString());
                            } else {
                                output.setText("");
                            }
                        }
                    }
                });

        frame.add(content);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public class UserEntry {
        private int id;
        private String firstName;
        private String lastName;

        public UserEntry(int id, String firstName, String lastName) {
            super();
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public int getId() {
            return id;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @Override
        public String toString() {
            return "UserEntry [id=" + id + ", firstName=" + firstName
                    + ", lastName=" + lastName + "]";
        }
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new UserListDemo();
            }
        });
    }
}

答案 2 :(得分:0)

我认为您可以将id存放在一边。与HTML中的标记<option>一样,我会这样做:

<option value="id">Jonh Doe</option>

属性value中的值将是数据库中的实际ID,文本将为givenname + " " + lastname

通过这种方式,我保留了识别此人的相关内容,并且我正在显示该名称。之后,当用户选择一个项目时,我将从id属性中检索value上的信息库。