【发布时间】:2011-10-31 12:21:29
【问题描述】:
这个夏天不是一个真正的夏天,我想。 一杯咖啡让我感觉像夏天一样,艰难(笑)。
我有一点调皮的 JTable。我的天啊。 下面是使用我自己定制的 TableModel 的 JTable。你可以在它的 getColumnClass() 方法上看到它,那里......它只用于返回 JLabel。 然后,我还自定义 DefaultRenderer。
jtbl_inGameEasy = new javax.swing.JTable();
jtbl_inGameEasy.setFont(new java.awt.Font("squeaky chalk sound", 0, 14)); // NOI18N
jtbl_inGameEasy.setForeground(new java.awt.Color(255, 255, 255));
jtbl_inGameEasy.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"null", "null", "null", "null", "null"
}
) {
boolean[] canEdit = new boolean [] {
false, false, false, false, false
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
public Class getColumnClass(int columnIndex) {
return JLabel.class;
}
});
jtbl_inGameEasy.setDefaultRenderer(JLabel.class, new JLabelTableRenderer());
jtbl_inGameEasy.setFocusable(false);
jtbl_inGameEasy.setOpaque(false);
jtbl_inGameEasy.setRowHeight(55);
jtbl_inGameEasy.setShowHorizontalLines(false);
jtbl_inGameEasy.setShowVerticalLines(false);
jtbl_inGameEasy.setTableHeader(null);
jtbl_inGameEasy.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
jtbl_inGameEasyMousePressed(evt);
}
});
JTableRenderer 在哪里?这里... 这是我下面的自定义渲染器...
public class JLabelTableRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if (value instanceof JLabel) {
//This time return only the JLabel without icon
return (JLabel) value;
} else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
然后,我需要将 JLabel 放入每个 Cell 中。 我开始使用此代码在 JTable 的单元格上的数组对象内添加一些 JLabel; (没问题)。
DefaultTableModel o_dtb = jtbl_inGameEasy.getModel();
o_dtb.addRow(myArrayCustomizedObjectofJLabel);
一切正常,我猜。但是因为我的目的是 ---> 放置一个 Icon 或使其在 用户单击 JTable Cells 时使其不可见,因此我尝试执行我的 MouseEvent 一次 按下 并调用这些代码行;
private void jtbl_inGameEasyMousePressed(java.awt.event.MouseEvent evt) {
// Checking inGameEasy Table Ans
javax.swing.JTable source = (javax.swing.JTable) evt.getSource();
int row = source.rowAtPoint(evt.getPoint());
int column = source.columnAtPoint(evt.getPoint());
DefaultTableModel o_dtb = (DefaultTableModel) jtbl_inGameEasy.getModel();
String s_questAns = "" + Game.getCurrentQuestion().getResult();
String s_userAns = "" + o_dtb.getValueAt(row, column);
// These two lines below are not Working, why yaa??
((JLabel) o_dtb.getValueAt(row, column)).setVisible(false);
((JLabel) o_dtb.getValueAt(row, column)).setIcon(myIcon);
if (s_questAns.equals(s_userAns)) {
Game.correct();
System.err.println("nice ans!");
} else {
jll_txtMiss.setText("Miss : " + Game.wrong());
System.err.println("nope!");
}
nextQuestion();
}
在我看来,上面的 Marked(在 commented 下方)代码不起作用。 是的,投射的 JLabel 无法更改其图标(图像),也无法更改其可见性。是不是模型导致了这一切? 注意:我的细胞数据是在模型创建后稍后添加的。
【问题讨论】:
-
编辑你的文章......哦,对不起,我的意思是问题!让它简短而正确。谢谢
-
我认为你过于复杂了!默认情况下,JTable 使用 JLabel 作为大多数对象类型的默认渲染器。因此,您可以简单地将一个图标添加到单个单元格作为 onClick 事件的一部分,从而减少大量代码。
-
只是一个问题,应该是井字游戏、扫雷、Pexeso...,方向很好,不用担心,JTable 但默认在TabelCell 中包含JLabel,也接受Icon.Class,请是时候创建示例了,您应该使用stackoverflow.com/questions/7049494/how-to-get-icon-from-jtable/… 作为基础,请确保您将创建 JLabels 数组或将其放入 JTable 中,您只需在 TableCell 中查找 register MouseEvent (这里有很多例子)
-
JTable 将其单元格呈现为 JLabel ??真的吗??我认为他们更喜欢选择 Object 而不是 JLabel .... @mKorbel :( oya,感谢链接。
标签: java swing icons jtable jlabel