0

我一直想知道,在为这个问题创建几个愚蠢的解决方案时,应该如何正确地完成以下操作:

数据表:ID | 名字 | 姓氏 | 地址 | 数据 ...

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

所以我基本上是这样做的:

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

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

!3)我希望列表框显示给定名称+“”+姓氏,但是在选择“John Doe”时,我希望程序知道这个“john Doe”是arraylist的哪个元素(如果有多个他们),从对象中检索 ID 并检索他的地址和“数据”

我经常做的是“选择列表框中的第三个 John Doe,让我们在数组列表中查找第三个 John Doe,并希望上帝这是正确的”,这对我来说似乎非常不必要。

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

我希望我能以某种方式明确我需要什么^^

关于比尔门

4

3 回答 3

3

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

于 2013-03-22T16:39:51.903 回答
1

您应该创建一个表模型来保存您的数据,并在需要时创建渲染器以正确呈现它。有关详细信息,请参阅如何使用表格。然后在表的选择侦听器中,您可以检索相关行。您可以使用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.

编辑:

这是一个类似的示例,它使用JListwithDefaultListModel和自定义渲染器来显示用户列表。

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();
            }
        });
    }
}
于 2013-03-22T16:22:31.830 回答
0

我认为你可以把你的东西id放在一边。就像HTML拿标签一样<option>,我会这样做:

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

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

这样,我将保留与识别此人相关的内容并显示姓名。之后,当用户选择一个项目时,我将根据idfromvalue属性检索信息。

于 2013-03-22T16:13:03.097 回答