Java 在JTable中单击我的图标的操作
我创建类ImageRenderer,它允许我以JTable图标png显示 我想在单击JTable中的图标时添加一个操作 图像渲染器Java 在JTable中单击我的图标的操作,java,swing,jtable,action,imageicon,Java,Swing,Jtable,Action,Imageicon,我创建类ImageRenderer,它允许我以JTable图标png显示 我想在单击JTable中的图标时添加一个操作 图像渲染器 import java.awt.Component; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; class ImageRenderer
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
class ImageRenderer extends DefaultTableCellRenderer {
JLabel lbl = new JLabel();
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
lbl.setIcon((ImageIcon)value);
return lbl;
}
}
及
谢谢您必须向表中添加一个鼠标侦听器,并让它使用
rowAtPoint()
和columnAtPoint()
确定单击的单元格
渲染器绘制的组件仅用作“橡皮戳”。它们不存在于组件层次结构中,因此不响应鼠标输入。您必须将鼠标侦听器添加到表中,并让它使用
rowAtPoint()
和columnAtPoint()
确定单击的单元格
渲染器绘制的组件仅用作“橡皮戳”。它们不存在于组件层次结构中,因此不响应鼠标输入。最容易编码的是
prepareRenderer
的实现
请注意,在将所有图形对象作为局部变量之前,请不要从文件中加载图形,不要从JDBC流中加载图形,因为XxxRenderer可以在每个事件、鼠标事件和按键事件上触发其事件
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.*;
import javax.swing.table.*;
public class TableIcon extends JFrame {
private static final long serialVersionUID = 1L;
private JFrame frame = new JFrame ();
private JTable table;
private JLabel myLabel = new JLabel("waiting");
private int pHeight = 40;
private ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
private ImageIcon infoIcon = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon");
private ImageIcon warnIcon = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon");
private ImageIcon questIcon = (ImageIcon) UIManager.getIcon("OptionPane.questionIcon");
public TableIcon() {
String[] columnNames = {"Picture", "Description"};
Object[][] data = {{errorIcon, "About"}, {errorIcon, "Add"}, {errorIcon, "Copy"}, {errorIcon, "Copy"}};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(renderer, row, column);
JLabel jc = (JLabel) comp;
if (column == 0) {
if (isRowSelected(row) && isColumnSelected(column)) {
jc.setIcon(infoIcon);
} else if (isRowSelected(row) && !isColumnSelected(column)) {
jc.setIcon(warnIcon);
} else {
jc.setIcon(jc.getIcon());
}
}
return comp;
}
};
table.setRowHeight(pHeight);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane, BorderLayout.CENTER);
myLabel.setPreferredSize(new Dimension(200, pHeight));
myLabel.setHorizontalAlignment(SwingConstants.CENTER);
frame.add(myLabel, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocation(150, 150);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableIcon frame = new TableIcon();
}
});
}
}
例如,最容易编码的是
prepareRenderer
的实现
请注意,在将所有图形对象作为局部变量之前,请不要从文件中加载图形,不要从JDBC流中加载图形,因为XxxRenderer可以在每个事件、鼠标事件和按键事件上触发其事件
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.*;
import javax.swing.table.*;
public class TableIcon extends JFrame {
private static final long serialVersionUID = 1L;
private JFrame frame = new JFrame ();
private JTable table;
private JLabel myLabel = new JLabel("waiting");
private int pHeight = 40;
private ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
private ImageIcon infoIcon = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon");
private ImageIcon warnIcon = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon");
private ImageIcon questIcon = (ImageIcon) UIManager.getIcon("OptionPane.questionIcon");
public TableIcon() {
String[] columnNames = {"Picture", "Description"};
Object[][] data = {{errorIcon, "About"}, {errorIcon, "Add"}, {errorIcon, "Copy"}, {errorIcon, "Copy"}};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(renderer, row, column);
JLabel jc = (JLabel) comp;
if (column == 0) {
if (isRowSelected(row) && isColumnSelected(column)) {
jc.setIcon(infoIcon);
} else if (isRowSelected(row) && !isColumnSelected(column)) {
jc.setIcon(warnIcon);
} else {
jc.setIcon(jc.getIcon());
}
}
return comp;
}
};
table.setRowHeight(pHeight);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane, BorderLayout.CENTER);
myLabel.setPreferredSize(new Dimension(200, pHeight));
myLabel.setHorizontalAlignment(SwingConstants.CENTER);
frame.add(myLabel, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocation(150, 150);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableIcon frame = new TableIcon();
}
});
}
}
它有一个简单的方法:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class ImageIconTable {
private final int imageHeight = 200;//todo change to desire height
private JTable table;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageIconTable().initGUI();
}
});
}
public void initGUI() {
JFrame frame = new JFrame();
ImageIcon icon1 = null;// new ImageIcon( "c://test1.gif"); //its not worked with gif
ImageIcon icon2 = null;// new ImageIcon( "c://test2.jpg"); //it work with jpg
try {
BufferedImage bufferedImage1 = ImageIO.read(new File("c://test1.gif"));
icon1 = new ImageIcon(bufferedImage1); //it work with all type images
//todo scale imageHeight
BufferedImage bufferedImage2 = ImageIO.read(new File("c://test2.jpg"));
icon2 = new ImageIcon(bufferedImage2); //it work with all type images
} catch (IOException e) {
e.printStackTrace();
}
/*
approach 1
Object[] columnNames = {"name","picture"};
Object[][] rowData = {{"me", icon1}
,{"boss", icon2}};*/
//approach 2
Vector columnNames = new Vector();
columnNames.add("name");
columnNames.add("picture");
Vector rowData = new Vector();
Vector row1 = new Vector();
Vector row2 = new Vector();
row1.add("me");
row1.add(icon1);
row2.add("boss");
row2.add(icon2);
rowData.add(row1);
rowData.add(row2);
DefaultTableModel tableModel = new DefaultTableModel(rowData,columnNames) {
@Override
public Class getColumnClass(int column) {
if (column == 1) return ImageIcon.class;
return Object.class;
}
};
table = new JTable(tableModel);
table.setRowHeight(imageHeight);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
它有一个简单的方法:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class ImageIconTable {
private final int imageHeight = 200;//todo change to desire height
private JTable table;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageIconTable().initGUI();
}
});
}
public void initGUI() {
JFrame frame = new JFrame();
ImageIcon icon1 = null;// new ImageIcon( "c://test1.gif"); //its not worked with gif
ImageIcon icon2 = null;// new ImageIcon( "c://test2.jpg"); //it work with jpg
try {
BufferedImage bufferedImage1 = ImageIO.read(new File("c://test1.gif"));
icon1 = new ImageIcon(bufferedImage1); //it work with all type images
//todo scale imageHeight
BufferedImage bufferedImage2 = ImageIO.read(new File("c://test2.jpg"));
icon2 = new ImageIcon(bufferedImage2); //it work with all type images
} catch (IOException e) {
e.printStackTrace();
}
/*
approach 1
Object[] columnNames = {"name","picture"};
Object[][] rowData = {{"me", icon1}
,{"boss", icon2}};*/
//approach 2
Vector columnNames = new Vector();
columnNames.add("name");
columnNames.add("picture");
Vector rowData = new Vector();
Vector row1 = new Vector();
Vector row2 = new Vector();
row1.add("me");
row1.add(icon1);
row2.add("boss");
row2.add(icon2);
rowData.add(row1);
rowData.add(row2);
DefaultTableModel tableModel = new DefaultTableModel(rowData,columnNames) {
@Override
public Class getColumnClass(int column) {
if (column == 1) return ImageIcon.class;
return Object.class;
}
};
table = new JTable(tableModel);
table.setRowHeight(imageHeight);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
boolean是选中的,boolean hasFocus,int row,int column
谈论JTables
视图的实现坐标,一直工作到JTables
视图未排序或过滤
,然后必须将索引从索引转换为模型
ButtonColumn类(如前一个问题中所建议的)也可以在按钮上显示图标。我遇到了一些问题,无法理解按钮渲染,我尝试了许多方法,阅读了许多教程和技巧,但我仍然没有找到一个,我尝试使用ImageRender,它还可以,但我正在采取行动,正如@mKorbel所说的DefaultTableCellRenderer
从JLabel
扩展而来,应该不需要在渲染器中使用第二个JLabel
请查看尽可能最简单的代码示例boolean isSelected,boolean hasFocus,int row,int column
讨论JTables
视图的实现坐标,工作直到JTables
视图未排序或过滤
,然后必须将索引从索引转换为模型
ButtonColumn类(如前一个问题中所建议的)也可以在按钮上显示图标。我有一些问题需要了解按钮渲染,我尝试了许多方法,并阅读了许多教程和提示,我仍然没有找到一个,我尝试使用ImageRender,它还可以,但我正在按照@mKorbel所说的DefaultTableCellRenderer
扩展自JLabel
,进行操作,应该不需要在渲染器中使用第二个JLabel
,请查看最简单的代码示例。需要帮助,我只需使用ButtonColumn类(如前一个问题中所建议的),并在按钮上显示图标,如replay@camickr感谢帮助,我只需使用ButtonColumn类(如前一个问题中所建议的)并在按钮上显示图标为replay@camickr