有没有人有在同一列中一起显示 Icon 和 String 的 JTable 示例代码?
Does anyone have sample code of JTable that shows Icon and String together in a same column?
我想知道是否有人可以提供一个简单的 JTable 示例,该示例在一个单元格中同时显示图标和字符串值。
我可以构建一个 JTable,该 JTable 的列可以只包含 Icon 或 String,但不能同时包含在一个单元格中。
希望有人能给我一个例子...
附上我的代码,
在 post 问题之前,我通常会简化代码,但这次不知道如何解决...请原谅我附上了
package jtableWithIcon;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class Renderer extends DefaultTableCellRenderer{
public void fillColor(JTable t,JLabel l,boolean isSelected ){
//setting the background and foreground when JLabel is selected
if(isSelected){
l.setBackground(t.getSelectionBackground());
l.setForeground(t.getSelectionForeground());
}
else{
l.setBackground(t.getBackground());
l.setForeground(t.getForeground());
}
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column){
if(value instanceof JLabel){
ImageIcon imageIcon = new ImageIcon();
JLabel label = (JLabel)value;
//you can add the image here
label.setIcon(new ImageIcon(getClass().getResource("icon.png")));
//*****NullPointException occurs here in thread "AWT-EventQueue-0"....
//*********************************************
label.setOpaque(true);
fillColor(table,label,isSelected);
return label;
}
else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
package jtableWithIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class MainMyTableTest extends JFrame{
public MainMyTableTest(String title){
super(title);
showGUI();
}
public void showGUI(){
JTable table = new JTable();
table.setModel(new MyModel());//invoking our custom model
table.setDefaultRenderer(JLabel.class, new Renderer());// for the rendering of cell
JScrollPane jp = new JScrollPane(table);
getContentPane().add(jp);
setVisible(true);
setSize(500,300);
}
public static void main(String[] args) {
MainMyTableTest t = new MainMyTableTest("Table Custom");
}
}
package jtableWithIcon;
import javax.swing.JLabel;
class MyModel extends javax.swing.table.DefaultTableModel{
Object[][] row = {{new JLabel("Row 1 Col 1"), "Row 1 Col 2", "Row 1 Col3"},
{new JLabel("Row 2 Col 1"), "Row 2 Col 2", "Row 2 Col3"},
{new JLabel("Row 3 Col 1"), "Row 3 Col 2", "Row 3 Col3"},
{new JLabel("Row 4 Col 1"), "Row 4 Col 2", "Row 4 Col3"}};
Object[] col = {"Column 1", "Column 2", "Column 3"};
public MyModel (){
//Adding columns
for(Object c: col)
this.addColumn(c);
//Adding rows
for(Object[] r: row)
addRow(r);
}
@Override
public Class getColumnClass(int columnIndex) {
if(columnIndex == 0)
return getValueAt(0, columnIndex).getClass();
else
return super.getColumnClass(columnIndex);
}
}
这些代码是从互联网上截取的...
我试图通过研究这个来理解 Render 是如何工作的。
但渲染器发生错误 class..
不要在 TableModel 中存储 JLabel。 JLabel 占用太多资源。
而是创建一个具有两个属性的自定义对象(比如说 IconTextItem):1) 文本和 2) 图标。
那么您的自定义渲染器将类似于:
class IconTextRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
IconTextItem item = (IconTextItem)value;
setText( item.getText );
setIcon( item.getIcon );
return this;
}
}
然后将渲染器添加到 table,代码如下:
table.getColumnModel().getColumn(0).setCellRenderer( new IconTextRenderer );
我找到了如何让它发挥作用。
label.setIcon(new ImageIcon(getClass().getResource("icon.png")));
这一行必须与下面一行一起使用。
label.setIcon(new ImageIcon("icon.png));
此外,有人想要渲染 JLabel 以将其放在任何组件上,
答案在这里How to add icon near arrow icon for JComboBox
谢谢。
我想知道是否有人可以提供一个简单的 JTable 示例,该示例在一个单元格中同时显示图标和字符串值。
我可以构建一个 JTable,该 JTable 的列可以只包含 Icon 或 String,但不能同时包含在一个单元格中。
希望有人能给我一个例子...
附上我的代码, 在 post 问题之前,我通常会简化代码,但这次不知道如何解决...请原谅我附上了
package jtableWithIcon;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class Renderer extends DefaultTableCellRenderer{
public void fillColor(JTable t,JLabel l,boolean isSelected ){
//setting the background and foreground when JLabel is selected
if(isSelected){
l.setBackground(t.getSelectionBackground());
l.setForeground(t.getSelectionForeground());
}
else{
l.setBackground(t.getBackground());
l.setForeground(t.getForeground());
}
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column){
if(value instanceof JLabel){
ImageIcon imageIcon = new ImageIcon();
JLabel label = (JLabel)value;
//you can add the image here
label.setIcon(new ImageIcon(getClass().getResource("icon.png")));
//*****NullPointException occurs here in thread "AWT-EventQueue-0"....
//*********************************************
label.setOpaque(true);
fillColor(table,label,isSelected);
return label;
}
else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
package jtableWithIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class MainMyTableTest extends JFrame{
public MainMyTableTest(String title){
super(title);
showGUI();
}
public void showGUI(){
JTable table = new JTable();
table.setModel(new MyModel());//invoking our custom model
table.setDefaultRenderer(JLabel.class, new Renderer());// for the rendering of cell
JScrollPane jp = new JScrollPane(table);
getContentPane().add(jp);
setVisible(true);
setSize(500,300);
}
public static void main(String[] args) {
MainMyTableTest t = new MainMyTableTest("Table Custom");
}
}
package jtableWithIcon;
import javax.swing.JLabel;
class MyModel extends javax.swing.table.DefaultTableModel{
Object[][] row = {{new JLabel("Row 1 Col 1"), "Row 1 Col 2", "Row 1 Col3"},
{new JLabel("Row 2 Col 1"), "Row 2 Col 2", "Row 2 Col3"},
{new JLabel("Row 3 Col 1"), "Row 3 Col 2", "Row 3 Col3"},
{new JLabel("Row 4 Col 1"), "Row 4 Col 2", "Row 4 Col3"}};
Object[] col = {"Column 1", "Column 2", "Column 3"};
public MyModel (){
//Adding columns
for(Object c: col)
this.addColumn(c);
//Adding rows
for(Object[] r: row)
addRow(r);
}
@Override
public Class getColumnClass(int columnIndex) {
if(columnIndex == 0)
return getValueAt(0, columnIndex).getClass();
else
return super.getColumnClass(columnIndex);
}
}
这些代码是从互联网上截取的... 我试图通过研究这个来理解 Render 是如何工作的。 但渲染器发生错误 class..
不要在 TableModel 中存储 JLabel。 JLabel 占用太多资源。
而是创建一个具有两个属性的自定义对象(比如说 IconTextItem):1) 文本和 2) 图标。
那么您的自定义渲染器将类似于:
class IconTextRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
IconTextItem item = (IconTextItem)value;
setText( item.getText );
setIcon( item.getIcon );
return this;
}
}
然后将渲染器添加到 table,代码如下:
table.getColumnModel().getColumn(0).setCellRenderer( new IconTextRenderer );
我找到了如何让它发挥作用。
label.setIcon(new ImageIcon(getClass().getResource("icon.png")));
这一行必须与下面一行一起使用。
label.setIcon(new ImageIcon("icon.png));
此外,有人想要渲染 JLabel 以将其放在任何组件上, 答案在这里How to add icon near arrow icon for JComboBox
谢谢。