Java JTable、JLabel及其图标(JLabel不能使用图标进行自定义)?
我想,这个夏天不是真正的夏天。 一杯咖啡让我感觉它就像一个夏天,很难(哈哈) 我有点淘气。天啊。 下面是我的JTable,它使用我自己定制的TableModel。您可以在它的getColumnClass()方法上看到它,在那里。。。它只用于返回JLabel。 然后,我还自定义默认渲染器Java JTable、JLabel及其图标(JLabel不能使用图标进行自定义)?,java,swing,icons,jtable,jlabel,Java,Swing,Icons,Jtable,Jlabel,我想,这个夏天不是真正的夏天。 一杯咖啡让我感觉它就像一个夏天,很难(哈哈) 我有点淘气。天啊。 下面是我的JTable,它使用我自己定制的TableModel。您可以在它的getColumnClass()方法上看到它,在那里。。。它只用于返回JLabel。 然后,我还自定义默认渲染器 jtbl_inGameEasy = new javax.swing.JTable(); jtbl_inGameEasy.setFont(new java.awt.Font("squeaky chalk sound
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。
我开始使用此代码在JTable的单元格上方的数组对象中添加一些JLabel;(这没问题)
我想一切都很好。但由于我的目的是--->在用户点击JTable单元格时放置一个图标,或使其不可见,因此我尝试执行我的鼠标事件一次按下并调用这些代码行
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();
}
在我看来,标记的(在注释的下面)代码不起作用。
是的,JLabel铸造无法更改其图标(图像),也无法更改其可见性。这一切都是由模型引起的吗?
注意:我的单元格数据是在模型创建后以不同方式添加的。在我看来,您要做的只是将所有表格单元格保留为空,用户单击的单元格除外,其中应显示一些标记图标,对吗 如果是这样,表模型不应包含
JLabel
实例。JLabel是一个可视化组件,用于以图形方式呈现某些数据。数据本身不是JLabel。在您的例子中,我认为它应该是一个布尔值(当用户单击时为true,否则为false)
现在,您可以使用自定义渲染器(尽管布尔值的默认渲染器也可以是OK)来显示布尔值。此呈现程序将是DefaultTableCellRenderer
的子类,它本身就是JLabel的子类。如果要渲染的布尔值为true,则渲染器(配置为使用此渲染器的所有单元格的同一实例)将只显示一个标记的图标,如果要渲染的布尔值为false,则显示一个未标记的图标(或根本没有图标)
然后,单击处理程序将只有一个任务:使单击的单元格包含true而不是false。要做到这一点,只需在表模型中更改适当的值
重述一下:表模型用于保存数据。可以将其视为数据库中的数据。你会在数据库中保存一个JLabel吗?不,您将持有布尔值、字符串或整数。该表可以根据需要呈现这些数据,这是呈现器的任务
旁注:停止使用匈牙利符号:它在Java中没有意义。这使得代码很难阅读。除了基本类型以外的所有类型都是对象,并且不能为每个可能的类型指定有意义的前缀。相反,使用可读且有意义的英文名称:
tableModel
而不是o_dtb
,correctAnswer
而不是s_questAns
,userAnswer
编辑你的文章……哦,对不起,我是问你这个问题!要简明扼要。谢谢,我觉得你把这件事搞得太复杂了!默认情况下,JTable使用JLabel作为大多数对象类型的默认渲染器。因此,您可以简单地在单个单元格中添加一个图标作为onClick事件的一部分,从而减少大量代码。只是问题,应该是TicTacToe、Minesweeper、Pexeso…,方向很好,不用担心,JTable但是默认值在TabelCell中包含JLabel,接受的图标。类也是,请花时间创建示例,您应该以此为基础,确保将相同/相似的是您将装箱JLabel数组或将其放入JTable,只需在TableCell中查找register MouseeEvent(这里有很多示例)JTable将其单元格呈现为JLabel??这是真的吗??我认为他们更喜欢选择对象而不是JLabel@mKorbel:(oya,谢谢你的链接。+1这里有一个相关的扩展了DefaultTableCellRenderer
和实现了Icon
。我的祖母出生在匈牙利,:-)你对此有什么问题吗,或者想跟我说:-),我评论的原因==优秀的描述+1毫克。。。。这就是你们谈论的匈牙利符号!(lol)好吧,好吧,我的Netbeans中有数百个匈牙利变量(我猜)D
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();
}