2017-01-12 7 views
-1

J'ai un projet en Java utilisant la base de données MySQL. Ma base de données a une table "Réponses" et je dois permettre aux utilisateurs de voter (+1 ou -1) si la réponse est bonne ou mauvaise. L'utilisateur ne peut voter qu'une seule fois pour une réponse.Notes de flèche dans JTable

EDIT: Voici mon code pour les réponses d'affichage pour la question choisie:

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); 
    } 

Voici mon problème: Comment puis-je forcer base de données MySQL à « se souvenir » quel utilisateur voté pour quelle réponse? Y at-il une option pour ajouter des flèches (haut et bas) à toutes les lignes JTable? Ou devrais-je faire seulement 2 flèches (comme ci-dessus) sur le bas de l'interface graphique et avec TableModel.getValueAt(); choisir une réponse à voter pour?

+0

J'aurais dû être plus prudent. S'il vous plaît nous montrer un exemple de ce que vous avez essayé. Un [mcve] vaut mieux que simplement fournir le code entier. Ici, il y a beaucoup d'interface graphique non utile pour la question. – AxelH

+0

Je n'ai rien essayé, parce que je ne sais pas comment j'ai pu résoudre ça – najdzion15

+0

Je l'ai fait. Je sais comment l'ajouter, mais je ne sais pas comment protéger ce projet pour multi-vote une question par un utilisateur – najdzion15

Répondre

1

Comme la question n'est pas claire pour moi, j'ai utilisé ce commentaire d'OP pour me concentrer sur un problème.

Je l'ai eu, mais comment puis-je vérifier, si l'utilisateur n'a pas encore voté pour la réponse?


Si vous voulez savoir qui voter pour une question, il vous suffit de stocker ces informations dans un tableau.

Cette table joignait la référence de la question et l'utilisateur au vote.

Un pseudo code parce que je ne connais pas assez vos tables.

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

, il vous suffit alors d'utiliser une jointure gauche sur cette table pour voir s'il y a une valeur ou non:

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 = ? 

En utilisant une jointure gauche donnerait vote à null s'il n'y a vote encore. Il suffit d'ajouter une contrainte unique sur vote(id_question, id_user) pour éviter la duplication des votes dans la base de données et la même commande dans votre DAO.