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 中的相同控制。
我在 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 中的相同控制。