首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用TableCellEditor和TableCellRenderer?

同时使用TableCellEditor和TableCellRenderer?
EN

Stack Overflow用户
提问于 2013-08-12 12:03:15
回答 1查看 1.8K关注 0票数 0

我使用的是TableCellEditor:

代码语言:javascript
复制
    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);
            }
        }
    }
}

和一个TableCellrenderer:

代码语言:javascript
复制
    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;
    }

}

不知怎么的,如果我点击表格中的文本,它每秒钟点击一次就会设置焦点?它也仅仅每秒钟触发一次fireEdizingCanceled事件?为什么会这样呢?

谢谢你的建议。

EN

回答 1

Stack Overflow用户

发布于 2013-08-12 12:23:20

不知怎么的,如果我点击表格中的文本,它每秒钟点击一次就会设置焦点?为什么会这样呢?

  • 这是从XxxTableCellEditor调用的MouseEvents的默认值
  • 您可以更改myEditor.setClickCountToStart(1);
  • XxxCellRenderer是从API中实现的所有MouseKey和内部方法调用的,您也可以在Renderer (Editor )中测试奇怪的东西,像非常困难的工作一样,可能会导致重新油漆冻结,只有在mouse_over_hover上才能进行单元格刷新。

编辑

我该怎么称呼它?我的TableCellEditor没有这种方法。

伪码

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18186495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档