JTable 中的箭头评级

Arrow ratings in JTable

我在 JAVA 中有一个项目使用 MySQL 数据库。 我的数据库有 "Answers" table,如果答案好或坏,我需要允许用户投票(+1 或 -1)。用户只能为一个答案投票一次。

编辑: 这是我显示所选问题答案的代码:

private void showAnswer(String chosenString) {
        editAnswer = new JButton("Edit");
        deleteAnswer = new JButton("Delete");
        editAnswer.addActionListener(this);
        deleteAnswer.addActionListener(this);
        JPanel commentsPanel = new JPanel();
        answerFrame = new JFrame();
        answerFrame.setLayout(new BorderLayout());
        JLabel questionText = new JLabel(chosenString);
        arrowNorth = new BasicArrowButton(BasicArrowButton.NORTH);
        arrowSouth = new BasicArrowButton(BasicArrowButton.SOUTH);
        arrowNorth.addActionListener(this);
        arrowSouth.addActionListener(this);
        answerFrame.add(questionText, BorderLayout.NORTH);
        tableInsideModel = new ResultSetTableModel(null);
        tableInside = new JTable(tableInsideModel);
        JScrollPane tableScroll = new JScrollPane(tableInside);
        answerFrame.add(tableScroll);
        String query = "select a_id, answer, nickname, a.add_date from answers a inner join users on au_id=u_id where aq_id="
                + "(select q_id from questions where question='"+chosenString+"')";
        sendInsideQuery(query);

        tableInside.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e){
                if(e.getClickCount()==2){
                    JTable target = (JTable) e.getSource();
                    int row = target.getSelectedRow();
                    doubleClickValue = (int) tableInsideModel.getValueAt(row, 0);
                    String doubleClickText = (String) tableInsideModel.getValueAt(row, 1);
                    doubleClickWindow(doubleClickValue, doubleClickText);
                }
            }
            public void mouseReleased(MouseEvent er){               
                int r = tableInside.rowAtPoint(er.getPoint());
                if(r>= 0 && r<tableInside.getRowCount()){
                    tableInside.setRowSelectionInterval(r, r);
                }else{
                    tableInside.clearSelection();
                }
                int rowindex = tableInside.getSelectedRow();
                if(rowindex<0)
                    return;
                if(er.isPopupTrigger() && er.getComponent() instanceof JTable){
                    popupInside = new JPopupMenu();

                    popupInside.add(editAnswer);
                    popupInside.add(deleteAnswer);
                    popupInside.show(er.getComponent(), er.getX(), er.getY());
                }
            }
        });

        JButton buttonReturn = new JButton("Back");
        buttonReturn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                answerFrame.setVisible(false);
            }
        });

        JButton buttonAddAnswer = new JButton("Add Answer");
        buttonAddAnswer.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                newAnswer(chosenString);
            }
        });


        commentsPanel.add(buttonAddAnswer,BorderLayout.CENTER);
        commentsPanel.add(buttonReturn,BorderLayout.CENTER);
        commentsPanel.add(arrowNorth, BorderLayout.WEST);
        commentsPanel.add(arrowSouth, BorderLayout.WEST);
        answerFrame.add(commentsPanel,BorderLayout.SOUTH);

        answerFrame.setVisible(true);   
        answerFrame.setSize(1000, 500);
        answerFrame.setLocationRelativeTo(null);
    }

这是我的问题: 我如何强制 MySQL 数据库到 "remember" 哪个用户投票给哪个答案? 是否有向所有 JTable 行添加箭头(向上和向下)的选项? 或者我应该只在 GUI 底部制作 2 个箭头(如上所述),然后 TableModel.getValueAt(); 选择要投票的答案?

由于这个问题对我来说不是很清楚,所以我使用了 OP 的评论来关注一个问题。

I got it, but how can I check, if user didn't vote for answer yet?


如果您想知道谁为某个问题投票,您只需要将这些信息存储在 table.

这 table 将加入问题的参考和投票的用户。

一些伪代码,因为我对你的 table 了解不够。

CREATE TABLE vote (
    id_question numeric,
    id_user     numeric,
    vote        bit, -- 0 : -1 and  1 : +1
)

然后,你只需要在这个table上使用左连接,看看是否有值:

SELECT id_question, id_user, question_value, vote
    FROM question q
    LEFT JOIN vote v ON  q.id      = v.id_question
                     AND v.id_user = ?

如果还没有投票,使用左连接会使 vote 为 null。

只需要在 vote(id_question, id_user) 上添加一个唯一约束,以防止数据库中的重复投票和您的 DAO 中的相同控制。