【问题标题】:JTable not populating correct informationJTable 没有填充正确的信息
【发布时间】:2014-03-30 15:15:38
【问题描述】:

我正在从树形图中填充我的表,并且树形图正在从我的 sql 数据库中填充,错误是数据在我的表中出现的顺序。 我已经发布了一个截图给你看。

这是我的 sql 中的图像

public class LibraryData {

    private Connection con;
    private Statement stmt;
    private ResultSet res;

    public LibraryData() {
        try {

            // con = DriverManager.getConnection("jdbc:mysql://;localhost:3306")
            String connectionUrl = "jdbc:sqlserver://SQL-SERVER;" + "databaseName=oe323;integratedSecurity=true;";
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(connectionUrl);
        } catch (Exception ex) {
            System.out.println("Erro: " + ex);

        }
    }

    public String listAll1() {
        String output = "";
        try {
            stmt = con.createStatement();
            res = stmt.executeQuery("SELECT * FROM LibraryTable");

            while (res.next()) { // there is a result
                // the name field is the thrid one in the ResultSet
                // Note that with  ResultSet we count the fields starting from 1
                output += res.getString(1) + " " + res.getString(2) + " - "
                        + res.getString(3) + " " + res.getString(4) + " "
                        + res.getString(5) + "\n";
                System.out.println(output);
                library.put("" + res.getInt(1), new Item(res.getString(2), res.getString(3), Integer.parseInt(res.getString(4))));



            }
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }
        return output;
    }

    public static class Item {

        Item(String n, String a, int r) {
            name = n;
            artist = a;
            rating = r;
        }
        // instance variables 
        private String name;
        private String artist;
        private int rating;
        private int playCount;

        public String toString() {
            return name + " - " + artist;
        }
    }
    private static Map<String, Item> library = new TreeMap<String, Item>();
//

    static {

    }

    public static String listAll() {
        String output = "";
        Iterator iterator = library.keySet().iterator();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            Item item = library.get(key);
            output += key + " " + item.name + " - " + item.artist + "\n";


        }
        return output;
    }

    public static void fillTable() {
        Iterator iterator = LibraryData.library.keySet().iterator();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            LibraryData.Item item = LibraryData.library.get(key);

            DeleteSong.data = new Object[1][3];

            DeleteSong.data[0][0] = key;
            DeleteSong.data[0][1] = item.artist;

            DeleteSong.data[0][2] = item.name;
            DeleteSong.modeltable.addRow(DeleteSong.data[0]);


        }

    }

    public static void fillTable1() {
        // listAll1();
        Iterator iterator = LibraryData.library.keySet().iterator();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            LibraryData.Item item = LibraryData.library.get(key);

            CheckLibrary.data = new Object[1][4];

            CheckLibrary.data[0][0] = key;
            CheckLibrary.data[0][1] = item.artist;

            CheckLibrary.data[0][2] = item.name;
            CheckLibrary.modeltable.addRow(CheckLibrary.data[0]);

            CheckLibrary.data[0][3] = item.rating;

【问题讨论】:

  • 也许您也忘记在表格中添加艺术家姓名?并且所有其他列都显示在错误的位置。一些显示一些代码怎么样
  • 刚刚意识到艺术家和曲目名称是错误的,特别是您希望看到代码的哪一部分
  • 相关代码,向我们展示你的错误的代码。
  • @Andrei 问题是他将整数 ID 转换为字符串,然后存储到library,然后使用字符串作为排序键;所以来自TreeMap&lt;String,...&gt; 的排序是字典而不是数字。请注意,SQL 查询显示 1、2、3、4、5,但应用程序的屏幕截图显示 1、10、11、12、13。
  • "When i run the program i am not getting any bug(errors)..." -- 你需要明白这个说法是不正确的。是的,您没有得到任何异常,并且您的代码可以编译,但是由于它行为不端,您的代码中有一个 逻辑 错误,您需要在这里发布可能具有该逻辑错误的代码。说得通?我看到 Jason 有你的答案,但在未来类似的问题,你会想要尝试隔离持有你所看到的任何不当行为背后的逻辑的代码。

标签: java swing jdbc jtable


【解决方案1】:

问题是您的键实际上是数字,您希望按数字顺序对它们进行排序,但您的 library 键是 Strings,它们按字典顺序排序,例如, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, ...(就像 a,aa,ab,ac,广告,b,ba,bb,bc,...)。这种顺序在您的屏幕截图中很明显。

这是因为,出于某种原因,您决定在放入库映射时将整数键转换为字符串:

private static Map<String, Item> library = new TreeMap<String, Item>();
... 
// in listAll1() and elsewhere:
library.put("" + res.getInt(1), ...

您应该使用适合您所存储信息的数据类型。如果您的键是整数,请使用整数,例如:

private static Map<Integer, Item> library = new TreeMap<Integer, Item>();
...
// in listAll1() and elsewhere:
library.put(res.getInt(1), ...

您有一个显示此内容的屏幕截图,但没有代码。然后您添加了代码,但删除了屏幕截图。我将屏幕截图添加回您的问题。以后,请尝试发布与您遇到的问题直接相关的代码和信息。

【讨论】:

  • 我已经注意到你所说的,但就我而言,我使用的是字符串和整数值
  • @Reynolds 不,您使用String 作为library 中的密钥。当您将整数存储在那里时,您将其显式转换为字符串。 TreeMap 键集以键的自然顺序迭代。 Strings 的自然顺序是按字母顺序排列的。您的字符串是否包含数字字符 0-9 而不是字母并不重要。字符串中的数字仍然是字符串。使用正确的数据类型。使用Integer 作为您的地图键类型。 Integer 的自然排序顺序是数字顺序。然后keySet() 迭代将以正确的数字顺序进行。
  • 嗨,所以在休息后回到它,将数据类型从字符串更改为整数,并在调整了其他一些东西之后,程序运行完美。谢谢
  • (不建议,但是)Map 不是 JTable 的良好底层数组,Map 没有索引,将视图转换为模型在排序或过滤的 JTables 视图中不起作用,util.List 更好选择,@Reynolds JTable 和数据库中的表具有相似的结构,
  • yes Map 是来自汇编器的数据库结构,cobol 但我们在一堵墙后面,桥叫做 JDBC,我把所有的 cmets 放在这里,四处寻找(由于尊重你,你很好这里的海报)关于 Hash/Map v.s JTree/Jtable 的每个帖子都切换到 util.List 用于 AbstractTableModel,Vector 用于 DefaultTableModel,您再次可以获得(f.i.)第一个。或从排序或过滤的 JTables 视图模型索引的最后一行,Hash/Map 没有内部索引,
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2023-03-11
  • 2012-12-26
  • 2014-05-18
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多