Java 如何将图像添加到自定义JTable行按钮
如何向自定义JTable行按钮添加图像,我有一个JTable,在第一列中有一个JButton,我想放置一个图像,但这仅在单击它时显示 这是我的照片 下面是JButtonRenderer和JButtonEditor,用于将JButton放在JTable行中 ButtonRenderer.javaJava 如何将图像添加到自定义JTable行按钮,java,image,button,jtable,Java,Image,Button,Jtable,如何向自定义JTable行按钮添加图像,我有一个JTable,在第一列中有一个JButton,我想放置一个图像,但这仅在单击它时显示 这是我的照片 下面是JButtonRenderer和JButtonEditor,用于将JButton放在JTable行中 ButtonRenderer.java import java.awt.Component; import javax.swing.JButton; import javax.swing.JTable; import javax.swing
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
/**
*
* @author joepa37
*/
public class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(UIManager.getColor("Button.background"));
}
setText((value == null) ? "" : value.toString());
return this;
}
}
ButtonEditor.java
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
/**
*
* @author joepa37
*/
public class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton(new ImageIcon(ButtonEditor.class.getResource("image.png")));
button.setOpaque(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (isSelected) {
button.setForeground(table.getSelectionForeground());
button.setBackground(table.getSelectionBackground());
} else {
button.setForeground(table.getForeground());
button.setBackground(table.getBackground());
}
label = (value == null) ? "" : value.toString();
button.setText(label);
isPushed = true;
return button;
}
@Override
public Object getCellEditorValue() {
if (isPushed) {
//
//
JOptionPane.showMessageDialog(button, label + ": Ouch!");
// System.out.println(label + ": Ouch!");
}
isPushed = false;
return new String(label);
}
@Override
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
@Override
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}
imageRowButtonTable.java
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
/**
*
* @author joepa37
*/
public class imageRowButtonTable extends JFrame{
public imageRowButtonTable(){
super();
this.add(getPreview());
setSize(500,500);
setVisible(true);
}
public static void main(String args[]){
new imageRowButtonTable();
}
public Component getPreview ()
{
// Table
JTable table = new JTable ( new ExampleTableModel () );
JScrollPane scrollPane = new JScrollPane ( table );
// Custom column
TableColumn buttonColumn = table.getColumnModel ().getColumn ( 0 );
// Custom renderer
buttonColumn.setCellRenderer(new ButtonRenderer());
// Custom editor
buttonColumn.setCellEditor(new ButtonEditor(new JCheckBox()));
return scrollPane;
}
public class ExampleTableModel extends AbstractTableModel
{
private String[] columnNames = { "", "Option"};
private Object[][] data = { { "", "op1"},
{ "", "op2"},
{ "", "op3"},
};
public final Object[] longValues = { "", "Option"};
@Override
public int getColumnCount ()
{
return columnNames.length;
}
@Override
public int getRowCount ()
{
return data.length;
}
@Override
public String getColumnName ( int col )
{
return columnNames[ col ];
}
@Override
public Object getValueAt ( int row, int col )
{
return data[ row ][ col ];
}
@Override
public Class getColumnClass ( int c )
{
return longValues[ c ].getClass ();
}
@Override
public boolean isCellEditable ( int row, int col )
{
return true;
}
@Override
public void setValueAt ( Object value, int row, int col )
{
data[ row ][ col ] = value;
fireTableCellUpdated ( row, col );
}
}
}
这是因为您没有在
按钮编辑器中设置图标,而只是在按钮编辑器中设置图标
1) 您可以将图标设置为渲染器JButton
,如ButtonEditor
2) 您可以在模型中存储图标
,并在渲染器
/编辑器
中将其手动设置为JButton
,如下所示:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class TestFrame extends JFrame {
public TestFrame() {
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
DefaultTableModel model = new DefaultTableModel(0,2);
JTable t = new JTable(model);
t.getColumnModel().getColumn(0).setCellRenderer(new ButtonCell());
t.getColumnModel().getColumn(0).setCellEditor(new ButtonCell());
ImageIcon icon = new ImageIcon(TestFrame.class.getResource("1.png"));
model.addRow(new Object[]{icon,"test"});
model.addRow(new Object[]{null,"test2"});
model.addRow(new Object[]{icon,"test3"});
add(new JScrollPane(t));
}
public static void main(String... s){
new TestFrame();
}
private class ButtonCell extends AbstractCellEditor implements TableCellEditor, TableCellRenderer{
private JButton btn;
ButtonCell(){
btn = new JButton();
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("clicked");
}
});
}
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if(value instanceof Icon){
btn.setIcon((Icon) value);
} else {
btn.setIcon(null);
}
return btn;
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if(value instanceof Icon){
btn.setIcon((Icon) value);
} else {
btn.setIcon(null);
}
return btn;
}
}
}
为什么不直接设置渲染器/编辑器的图标值?其值应来自列模型的列的值集,可以是字符串或其他描述性值,这将允许渲染器和编辑器决定加载哪个图标我如何做到这一点?你能给我举个例子吗?在渲染器/编辑器上调用setIcon,但是你应用的值将取决于你的数据,我们没有数据