Java JTable:Swing:动态按钮名称不出现
我为每一行动态生成一个新按钮,我希望该按钮名为Edit。 我正在获取该按钮,但无法将该按钮命名为Edit, 基于此,我尝试了以下内容:Java JTable:Swing:动态按钮名称不出现,java,swing,Java,Swing,我为每一行动态生成一个新按钮,我希望该按钮名为Edit。 我正在获取该按钮,但无法将该按钮命名为Edit, 基于此,我尝试了以下内容: import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import ja
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
/**
* @version 1.0 11/09/98
*/
public class JButtonTableExample extends JFrame {
public JButtonTableExample() {
super("JButtonTable Example");
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(new Object[][] { { "button 1", "foo" },
{ "button 2", "bar" } }, new Object[] { "Button", "String","Edit" });
JTable table = new JTable(dm);
table.getColumn("Edit").setCellRenderer(new ButtonRenderer());
table.getColumn("Edit").setCellEditor(
new ButtonEditor(new JCheckBox()));
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll);
setSize(400, 100);
setVisible(true);
}
public static void main(String[] args) {
JButtonTableExample frame = new JButtonTableExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
/**
* @version 1.0 11/09/98
*/
class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
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;
}
}
/**
* @version 1.0 11/09/98
*/
class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton("Edit");
button.setOpaque(true);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
}
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;
}
public Object getCellEditorValue() {
if (isPushed) {
//
//
JOptionPane.showMessageDialog(button, label + ": Ouch!");
// System.out.println(label + ": Ouch!");
}
isPushed = false;
return new String(label);
}
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}
谁能告诉我哪里错了!!!
我不明白为什么按钮名没有出现,这是因为您在这里专门将按钮的文本设置为
”
setText((value == null) ? "" : value.toString());
在TableCellRenderer.getTableCellRenderer()方法中。在呈现表时,将为每个单元格调用此方法。并且该值设置为null
修复使用:
setText((value == null) ? "Edit" : value.toString());
顺便说一句,value==null…但在Im赋值为newjbutton(“编辑”)时,它不应该是null;哦哦..很抱歉,它没有按预期工作..单击它将变为编辑..不,这不是预期的..仅在加载时我应该看到编辑,这表示您也更改了按钮编辑器
类上的行。仅在按钮说明程序中更改它。哇哦..是的..你真的很棒..没错..顺便问一下,为什么defalut值编辑不作为Im设置出现在仅创建对象中对吗???不。。。应该在dm.setDataVector()调用中指定该值。在该调用中使用{“按钮1”、“foo”、“按钮文本”}
,您将在按钮上看到按钮文本。因为您只给出了{“button 1”,“foo”)
,所以它将第三列作为null。