用“下一步”和“上一步”按钮在“字符串数组”中移动

syqv5f0l  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(279)

我想滚动通过前后按钮数组。我在网上找不到关于它的任何东西,或者一些对我没有帮助的东西。我想在我方便的时候在按钮事件中调用一个方法。我的代码不起作用,因为它会立即显示数组的最后一个元素,而不是前面的元素后面的元素。我应该试试这个吗 HashMap 或者 ListIterator 还是另一门课?我已经试过listiterator类,但效果不好。

avanti.addActionListener(new ActionListener() { 
                        public void actionPerformed(ActionEvent e) {
                            String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';", 
                            px = Lemma.getText(), query = p1+px+p2;
                            int n = main.IdCorrente("SELECT ID FROM Cherubini WHERE definizione = ?", definizione.getText());
                            String[] output = new String[2000000];

                            try {
                                Statement pstmt = null; ResultSet rs = null;
                                pstmt = main.conn().createStatement(); // 
                                rs = pstmt.executeQuery(query);
                               while(rs.next()) { output[0] = rs.getString("lemma");
                                System.out.println(output[0]);
                               output[1] = rs.getString("definizione");
                               System.out.println(output[1]);
                               }
                        } catch(SQLException exc) {}

                            lemma.setText(output[0]);
                               definizione.setText(output[1]);
                               output = null;
                        }
                    });

我的活动是两件一件的:

Lemma.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e)  {
                String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';", 
                        px = Lemma.getText(), query = p1+px+p2;
                        ListIterator<String> itr = null;
                        try {
                            PreparedStatement pst = main.conn().prepareStatement(query);
                            ResultSet rs = pst.executeQuery();
                            while (rs.next()) {
                                String[] out = {rs.getString("lemma"), rs.getString("definizione")};
                                results.add(out);
                            }
                        } catch (SQLException e1) {}
                         // here I want set next event and prev event
            }
        });
kgsdhlau

kgsdhlau1#

String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';", 这是非常不安全的,而且会让你的电脑被一个有进取心的俄国人或者其他什么人拥有。你不能这样做。你必须使用 PreparedStatement ,并使用 ps.setString(1, p2) . 如果你不相信我,试着进去 Joe'; TRUNCATE Cerubini; -- 为了好玩。
我要马上讨论这个论点,因为我经常听到这样的说法:“但只有可信的人才能在这个东西中输入文本”–啊,但你看,意外是可能发生的,人们可以被社会工程,在文本字段中输入危险的东西,因为你的普通用户可能不知道sql或钓鱼尝试是什么样子),或者“我只是在学习”——好吧,那你为什么要学习一些会让你被炒鱿鱼甚至被起诉的东西呢? while(rs.next()) { output[0] = rs.getString("lemma"); 这段代码将循环遍历select语句找到的每一行,并覆盖select语句中的第一个槽 output 数组。这个代码显然就是问题所在。你想怎么做就怎么做。 } catch(SQLException exc) {} 别这样。我当然不想解释为什么这是一个非常糟糕的主意。如果您不知道如何处理异常,那么默认的“i dunno”代码是 throw new RuntimeException("uncaught", e); 所以至少,把它放在你的 {} 相反。
一般问题
您的代码不是特别清楚,但我猜您希望显示数据库中的第一个结果,然后等待用户按一些按钮来显示其余的结果。
你有两种主要的方法,你需要选择一种合适的方法:

选项1-全部查询,缓存。

在这个选项中,您可以查询所有的数据,并将其全部存储起来(不能一直覆盖) output ,将其放入列表或诸如此类的内容中,然后使用按钮向上或向下修改索引变量,并使用该条目更新图形。比如:

// fields
private int index;
private List<String[]> results = new ArrayList<>();

...

while (rs.next()) {
    String[] out = {rs.getString("lemma"), rs.getString("definizione")};
    results.add(out);
}

...

// in the handler for the next button

index++;
nextButton.setDisabled(true);
lemma.setText(results.get(index)[0]);
definizione.setText(results.get(index)[1]);

...

选项2-继续查询

选项1的问题是,如果数据库中有一百万条记录,则需要大量的ram来存储所有这些结果,而且加载所有这些记录可能需要很长时间。相反,您也可以在每次按下next按钮时继续查询db。
首先,唯一正确的方法是确保数据库一致地返回相同的结果,这意味着您需要一个 ORDER BY 关于那件事的条款。
然后在按下next时,您需要分离一个单独的线程或spring worker来执行查询,然后您需要更新ui以显示“进行中”(禁用所有按钮、显示微调器图形或诸如此类)。对于选项1,您也不能避免它,因为您应该在初始查询期间这样做。
这个单独的线程使用例如。 OFFSET ? LIMIT 1 以及 .setInt(2, idx) 获取正确的行,然后使用。 SwingUtilities.invokeLaterlemma.setText 一旦结果进入,同样的invokelater代码应该删除所有的ui更新以显示数据正在被加载(删除微调器并重新启用ui元素等等)。

相关问题