Java 同时使用TableCellEditor和TableCellRenderer?
我正在使用TableCellEditor:Java 同时使用TableCellEditor和TableCellRenderer?,java,swing,jtable,tablecellrenderer,tablecelleditor,Java,Swing,Jtable,Tablecellrenderer,Tablecelleditor,我正在使用TableCellEditor: package gui.table; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListene
package gui.table;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventObject;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import org.jdom2.Document;
import org.jdom2.Element;
import event.TableClickEvent;
import event.TestController;
import gui.DaimlerColor;
import gui.MainWindow;
@SuppressWarnings("serial")
public class TestcaseCellEditor extends TestcasePanel implements TableCellEditor {
int row;
List<String> data;
TestController tgc;
transient protected TableClickEvent changeEvent = null;
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public TestcaseCellEditor(final JTable table, MainWindow gui, List<String> data, TestController tgc) {
super();
super.gui = gui;
this.data = data;
this.tgc = tgc;
MouseListener ml = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
ButtonModel m = ((JButton) e.getSource()).getModel();
setRow(table.getEditingRow());
if (m.isPressed() && table.isRowSelected(table.getEditingRow()) && e.isControlDown()) {
setBackground(DaimlerColor.LIGHT_BLUE);
}
}
};
playButton.addMouseListener(ml);
playButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
setRow(table.getEditingRow());
fireEditingCanceled();
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.setToolTipText("Click play to rerun this Testcase");
this.setName(data.get(row));
setPlaybuttonIcon(gui.getTestcasetableModelIcon(row));
setClickable(tgc.clickable);
if (row <= gui.currentTestcase) {
Document doc = tgc.getDoc();
List<Element> cases = doc.getRootElement().getChildren();
List<Element> teststeps = cases.get(row).getChildren();
List<String> attributes = new LinkedList<String>();
for (Element teststep : teststeps) {
try {
if (teststep.getChildren("result").get(gui.sutPaths.getSelectedIndex()).getAttributeValue("status") != null) {
attributes.add(teststep.getChildren("result").get(gui.sutPaths.getSelectedIndex())
.getAttributeValue("status"));
}
else {
attributes.add("empty");
}
} catch (Exception e) {
attributes.add("empty");
}
}
if (attributes.contains("empty")) {
setButton("");
} else if (attributes.contains("failed")) {
setButton("failed");
} else {
setButton("passed");
}
} else {
setButton("");
}
this.setBorder(BorderFactory.createEmptyBorder());
this.setBackground(isSelected ? DaimlerColor.LIGHT_BLUE : (row % 2 == 1 ? DaimlerColor.DARK_WHITE
: DaimlerColor.WHITE));
System.out.println("CLCIKED");
return this;
}
@Override
public Object getCellEditorValue() {
return "";
}
@Override
public boolean isCellEditable(EventObject e) {
return true;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
return true;
}
@Override
public void cancelCellEditing() {
fireEditingCanceled();
}
@Override
public void addCellEditorListener(CellEditorListener l) {
listenerList.add(CellEditorListener.class, l);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
listenerList.remove(CellEditorListener.class, l);
}
public CellEditorListener[] getCellEditorListeners() {
return listenerList.getListeners(CellEditorListener.class);
}
protected void fireEditingStopped() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == CellEditorListener.class) {
changeEvent = new TableClickEvent(this.playButton, getRow());
((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent);
}
}
}
protected void fireEditingCanceled() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == CellEditorListener.class) {
changeEvent = new TableClickEvent(this, getRow());
((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent);
}
}
}
}
包gui.table;
导入java.awt.Component;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.EventObject;
导入java.util.LinkedList;
导入java.util.List;
导入javax.swing.BorderFactory;
导入javax.swing.ButtonModel;
导入javax.swing.JButton;
导入javax.swing.JTable;
导入javax.swing.event.CellEditorListener;
导入javax.swing.table.TableCellEditor;
导入org.jdom2.Document;
导入org.jdom2.Element;
导入event.TableClickEvent;
导入event.TestController;
导入gui.DaimlerColor;
导入gui.main窗口;
@抑制警告(“串行”)
公共类TestcaseCellEditor扩展TestcasePanel实现TableCellEditor{
int行;
列出数据;
测试控制器tgc;
瞬态保护表ClickEvent changeEvent=null;
public int getRow(){
返回行;
}
公共无效集合行(整数行){
this.row=行;
}
公共TestcaseCellEditor(最终JTable表、主窗口gui、列表数据、TestController tgc){
超级();
super.gui=gui;
这个数据=数据;
this.tgc=tgc;
MouseListener ml=新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
ButtonModel m=((JButton)e.getSource()).getModel();
setRow(table.getEditingRow());
if(m.isPressed()&&table.isRowSelected(table.getEditingRow())&&e.isControlDown()){
后坐地面(戴姆勒颜色,浅蓝色);
}
}
};
playButton.addMouseListener(毫升);
playButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
fireEditingStopped();
}
});
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
setRow(table.getEditingRow());
FireEditingCancelled();
}
});
}
@凌驾
公共组件getTableCellEditorComponent(JTable表、对象值、布尔isSelected、int行、int列){
this.setToolTiptText(“单击播放以重新运行此测试用例”);
this.setName(data.get(row));
setPlaybuttonIcon(gui.getTestcasetableModelIcon(行));
设置可点击(tgc.可点击);
如果(行=0;i-=2){
if(侦听器[i]==CellEditorListener.class){
changeEvent=new TableClickEvent(this.playButton,getRow());
((CellEditorListener)监听器[i+1])。编辑停止(changeEvent);
}
}
}
受保护的无效FireEditingCancelled(){
Object[]listeners=listenerList.getListenerList();
对于(int i=listeners.length-2;i>=0;i-=2){
if(侦听器[i]==CellEditorListener.class){
changeEvent=new TableClickEvent(这个,getRow());
((CellEditorListener)侦听器[i+1])。编辑已取消(changeEvent);
}
}
}
}
和一个TableCell渲染器:
package gui.table;
import event.TestController;
import gui.DaimlerColor;
import gui.MainWindow;
import java.awt.Component;
import java.util.LinkedList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import org.jdom2.Document;
import org.jdom2.Element;
@SuppressWarnings("serial")
public class TestcaseCellRenderer extends TestcasePanel implements TableCellRenderer {
public List<String> data;
MainWindow gui = null;
public TestController tgc = null;
public TestcaseCellRenderer() {
super();
setName("Table.cellRenderer");
}
public TestcaseCellRenderer(List<String> names, MainWindow gui2, TestController tgc) {
super();
this.data = names;
this.gui = gui2;
this.tgc = tgc;
setName("Table.cellRenderer");
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
this.setToolTipText("Click play to rerun this Testcase");
System.out.println("Rendering your ass!");
this.setName(data.get(row));
setPlaybuttonIcon(gui.getTestcasetableModelIcon(row));
setClickable(tgc.clickable);
if (row <= gui.currentTestcase) {
Document doc = tgc.getDoc();
List<Element> cases = doc.getRootElement().getChildren();
List<Element> teststeps = cases.get(row).getChildren();
List<String> attributes = new LinkedList<String>();
for (Element teststep : teststeps) {
try {
if (teststep.getChildren("result").get(gui.sutPaths.getSelectedIndex()).getAttributeValue("status") != null) {
attributes.add(teststep.getChildren("result").get(gui.sutPaths.getSelectedIndex())
.getAttributeValue("status"));
}
else {
attributes.add("empty");
}
} catch (Exception e) {
attributes.add("empty");
}
}
if (attributes.contains("empty")) {
setButton("");
} else if (attributes.contains("failed")) {
setButton("failed");
} else {
setButton("passed");
}
} else {
setButton("");
}
if (tgc.isRerunning() && tgc.getEventRow() == row) {
setButton("");
}
this.setBorder(BorderFactory.createEmptyBorder());
this.setBackground(isSelected ? DaimlerColor.LIGHT_BLUE : (row % 2 == 1 ? DaimlerColor.DARK_WHITE
: DaimlerColor.WHITE));
return this;
}
}
包gui.table;
导入event.TestController;
导入gui.DaimlerColor;
导入gui.main窗口;
导入java.awt.Component;
导入java.util.LinkedList;
导入java.util.List;
导入javax.swing.BorderFactory;
导入javax.swing.JTable;
导入javax.swing.table.TableCellRenderer;
导入org.jdom2.Document;
导入org.jdom2.Element;
@抑制警告(“串行”)
公共类TestcaseCellRenderer扩展TestcasePanel实现TableCellRenderer{
公开名单数据;
主窗口gui=null;
公共TestController tgc=null;
公共TestcaseCellRenderer(){
超级();
setName(“Table.cellRenderer”);
}
公共TestcaseCellRenderer(列表名称、主窗口GUI 2、TestController tgc){
超级();
this.data=名称;
this.gui=gui2;
this.tgc=tgc;
setName(“Table.cellRenderer”);
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、,
整数行,整数列){
this.setToolTiptText(“单击播放以重新运行此测试用例”);
System.out.println(“渲染你的屁股!”);
this.setName(data.get(row));
setPlaybuttonIcon(gui.getTestcasetableModelIcon(行));
设置可点击(tgc.可点击);
如果(世界其他地区)
不知何故,如果我点击表格中的文本,它只会设置焦点
每秒钟点击一次?为什么
- 右侧这是从
MouseEvents
- 您可以选择更改myEditor。设置ClickCountToStart(1);
XxxCellRenderer
是从所有鼠标
、键
和API中实现的内部方法调用的,您可以在渲染器
中测试奇怪的东西(编辑器
),这项工作非常艰巨,可能会导致重新绘制的冻结,而单元格的刷新只能在鼠标悬停时完成JTable table = new JTable(model);
DefaultCellEditor editor = new DefaultCellEditor(......); // abstract or custom name
editor.setClickCountToStart(2); // for Compound JComponents (JComboBox) is more userfriendly invoke Editor on second click
table.getColumnModel().getColumn(1).setCellEditor(editor);
您好,非常感谢。我需要在哪里调用它?我的TableCellEditor没有这个方法。您好,我需要使用TableCellEditor,因为我的表行中有一个JButton,它也会触发事件。我不能强制转换为DefaultTableModel。@HansEn:请看这个完整的、有效的。谢谢这个例子。我只是想摆脱这个double单击功能。奇怪的是,如果我在某个地方单击JPanel,它每次都调用该方法,如果我单击JLabel,它只会每秒工作一次。为什么?