Jtable显示DB的错误(旧)结果

时间:2018-04-16 18:05:32

标签: java swing

我正在编写一个代码,它将一个单词(棋盘游戏的名称)或一个字母作为输入,并在我的数据库中搜索它。

如果有任何条目我会在表格中显示,否则我不想显示空表格,我想要显示标签"没有找到结果"它在1500ms后消失。

if语句正常工作。例如,如果我写'' t'我将以#t;'开头的所有游戏开始。在桌子上。

else语句有时会出现问题:

  1. 如果我运行我的程序,我首先写作输入' b' (在我的数据库中没有以' b'开头的条目) - >它显示标签"没有找到结果"然后它消失了(它有效!)
  2. 如果我运行我的程序,我写作输入' t' (它按照说法工作)然后我写了一个' (我的条目是' a',它有效)[.....]然后最后我写作输入' b' (在我的数据库中没有以' b'开头的条目)这里是问题:它显示标签"没有找到结果"但它也显示了我第一次输入结果的表格(即以' t'开头的游戏)。
  3. 我做错了什么?谢谢!

    点击按钮"搜索":

    后的代码
    btnCerca.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                /*Connect to DB:*/
                Database db = new Database();
                Connection connection = null;
                try 
                {
                    connection = db.connectToDB();
                } 
                catch (SQLException ex)
                {
                    ex.printStackTrace();
                }
    
                /*Create a query which search in the DB the word/letter entered by the user*/
                Query query = new Query (connection);
                query.search(textField.getText());  //execute the query 
    
                /*Get results:*/
                ResultSet rs = query.getResults();
    
                /* check if rs is empty */          
                boolean res = false;
                try 
                {
                    res = rs.isBeforeFirst();
                } 
                catch (SQLException e1) 
                {
                    e1.printStackTrace();
                }
    
                ListTableModel model = null;
                JScrollPane scrollPane = new JScrollPane();             
    
                if (res) //there is something in rs
                {   
                    try 
                    {
                        model = ListTableModel.createModelFromResultSet(rs);
                    } 
                    catch (SQLException e1) 
                    {
                        e1.getMessage();
                    }
    
                    /*The table which will show the results*/
                    JTable table_1 = new JTable(model);
                    scrollPane.setBounds(10, 75, 1200, 300);
                    panelRicerca.add(scrollPane);
                    scrollPane.setViewportView(table_1);
    
                }
                else //rs is empty
                {
                    JLabel lblNoGiochi = new JLabel("No results found.");
                    lblNoGiochi.setBounds(448, 30, 400, 14);
                    panelRicerca.add(lblNoGiochi);
                    panelRicerca.repaint();
    
                    /*...I want the label disappear after 1500ms:*/
                    int delay = 1500; 
                    ActionListener taskPerformer = new ActionListener() 
                    {
                        public void actionPerformed(ActionEvent evt) 
                        {
                            panelRicerca.remove(lblNoGiochi);
                            panelRicerca.repaint();
                        }
                    };
                    new Timer(delay, taskPerformer).start();                
                }
            }
        });
    

    ------------------------的修改 --------------- ---------

    我做了一个更简单的例子,受同样的问题影响,所以你可以更快地编译和检查。

    如果我写'#34;你好"我想要显示一张桌子。 如果我写任何其他内容,我希望表格显示标签。

    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JLabel;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class Test {
    
        private JFrame frame;
        private JTextField textField;
        private JTable table;
        private JLabel lbl;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Test window = new Test();
                        window.frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the application.
         */
        public Test() {
            initialize();
        }
    
        /**
         * Initialize the contents of the frame.
         */
        private void initialize() {
    
            lbl = new JLabel("Hey");
            lbl.setBounds(378, 236, 46, 14);
    
            frame = new JFrame();
            frame.setBounds(100, 100, 450, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(null);
    
            textField = new JTextField();
            textField.setBounds(102, 48, 86, 20);
            frame.getContentPane().add(textField);
            textField.setColumns(10);
    
            JButton btnOk = new JButton("ok");
            btnOk.addMouseListener(new MouseAdapter() 
            {
                @Override
                public void mouseClicked(MouseEvent arg0) 
                {
                    JScrollPane scrollPane = new JScrollPane();
                    scrollPane.setBounds(20, 20, 50, 50);
    
    
                    table = new JTable();
    
                    if (textField.getText().equals("hello"))
                    {
                        System.out.println("I'm in the if statement");
    
                        //show the table:
                        frame.getContentPane().add(scrollPane);
                        scrollPane.setViewportView(table);
    
                    }
                    else
                    {
                        System.out.println("I'm in the else statement");
    
                        //don't show the table:
                        scrollPane.remove(table);
                        /* Already tried to use: 
                         - revalidate and repaint the scrollPane
                         - revalidate and repaint the contentPane
                         - remove the entire scrollPane from the ContentPane
                         - remove the table from the scrollPane, then remove the scrollPane from the ContentPane
                        */
    
                        //and show a label instead:
                        frame.getContentPane().add(lbl);
                        frame.getContentPane().repaint();
                    }
                }
            });
            btnOk.setBounds(211, 47, 89, 23);
            frame.getContentPane().add(btnOk);
        }
    }
    

1 个答案:

答案 0 :(得分:1)

您将表格添加到面板:

panelRicerca.add(scrollPane);

稍后您将标签添加到面板:

panelRicerca.add(lblNoGiochi);

您无法从面板中删除表格窗格,因此将始终显示该窗格。

您需要:

  1. 在添加标签
  2. 之前删除表格窗格
  3. 使用CardLayoutCardLayout允许您在同一面板中交换组件,因此只能看到一个组件。有关详细信息,请阅读How to Use CardLayout上的Swing教程。
  4. 编辑:

    在我原来的答案中,我建议您需要从面板中删除该表。实际上我的意思是"滚动窗格"因为你永远不会把表添加到面板。请注意我发布的代码显示添加"滚动窗格"到小组。你打算做相反的事情。

    在原始代码中,您在同一面板中添加和删除了标签。我的建议是在同一个面板中添加/删除滚动窗格。

    同样的概念,您可以从滚动窗格中删除该表。但是,再次将表格添加到"视口"滚动窗格。因此,如果你想删除它,你会做相反的事情。您可以使用setViewportView(null)将其从滚动窗格的视口中删除。这不会从面板中移除滚动窗格(这仍然是最简单的解决方案),但表格不会显示在滚动窗格中。

    但是,上述建议都不适用于您的演示代码,因为您在MouseListener中继续创建新的JScrollPane,因此您不必引用添加到框架中的滚动窗格。因此,滚动窗格变量必须是实例变量,并在构造函数中创建滚动窗格。

    另外,不要使用null布局。 Swing旨在与布局管理器一起使用。因此,动态布局更改时的基本代码是:

    panel.remove(...);
    panel.add(...);
    panel.revalidate(); // to invoke layout manager
    panel.repaint(); // repaint changes.
    

    所以我试图给出的基本答案是,如果你想要"删除"某些东西,你需要做的就是你将组件添加到框架中所做的相反。