Ячейка JTable изменяется при нажатии кнопки?

У меня есть таблица с моделью таблицы, содержащей некоторые имена, и CellRenderer, который расширяет созданную мной панель, содержащую JButton. Все работает отлично, за исключением того, что когда я нажимаю кнопку, значения в ячейке исчезают, пока я удерживаю нажатой кнопку JButton !? ниже Panel и Renderer. Любые идеи?

        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 {

        List<String> data;
        MainWindow gui = null;
        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.setBackground(isSelected ? table.getSelectionBackground() : table
            //      .getBackground());

            this.setOpaque(true);
            this.setToolTipText("Click play to rerun this Testcase");

            this.setName(data.get(row));

            //set Button Image if passed
            int passed = 0;

            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();
                for (Element teststep : teststeps) {


                    if (teststep.getAttribute("status") != null) {
                        attributes.add(teststep.getAttributeValue("status"));
                    }
                    else{
                        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));
            return this;
        }


    }



    package gui.table;
import gui.MainWindow;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class TestcasePanel extends JPanel {
    public  JButton playButton = new JButton();// new JButton("Play");
    //
    String name = "-";
    JLabel nameLabel = new JLabel(name);
    JLabel statusIconLabel = new JLabel();
    public MainWindow gui;

    public void setName(String name) {
        this.name = name;
        nameLabel.setText(name);
    }

    public void setClickable(boolean b){
        playButton.setEnabled(b);
    }

    public void setPlaybuttonIcon(String s){
        ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\playbutton.png");
        Image img = icon.getImage();
        Image scaledImg = img.getScaledInstance(16, 16, java.awt.Image.SCALE_SMOOTH);
        icon = new ImageIcon(scaledImg);


        ImageIcon icon2 = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\pausebutton.png");
        Image img2 = icon2.getImage();
        Image scaledImg2 = img2.getScaledInstance(16, 16, java.awt.Image.SCALE_SMOOTH);
        icon2 = new ImageIcon(scaledImg2);

        if(s.equals("play")){
            playButton.setIcon(icon);
        }else{
            playButton.setIcon(icon2);
        }
    }

    public void setButton(String s) {

        if (s.equals("passed")) {
            ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\check.png");
            Image img = icon.getImage();
            icon = new ImageIcon(img);
            statusIconLabel.setIcon(icon);
            statusIconLabel.setOpaque(false);

        } else if (s.equals("failed")) {
            ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\fail.png");
            Image img = icon.getImage();
            icon = new ImageIcon(img);
            statusIconLabel.setIcon(icon);
            statusIconLabel.setOpaque(false);

        } else {
            ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\help.png");
            Image img = icon.getImage();
            icon = new ImageIcon(img);
            statusIconLabel.setIcon(icon);
            statusIconLabel.setOpaque(false);

        }
    }

    public TestcasePanel() {
        super();
        setOpaque(true);

        playButton.setFocusable(false);
        playButton.setRolloverEnabled(false);
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        this.setLayout(gbl);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.insets = new Insets(3, 3, 3, 3);
        gbc.anchor = GridBagConstraints.WEST;
        gbl.setConstraints(statusIconLabel, gbc);
        this.add(statusIconLabel);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0.8;
        gbl.setConstraints(nameLabel, gbc);
        this.add(nameLabel);

        ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\playbutton.png");
        Image img = icon.getImage();
        Image scaledImg = img.getScaledInstance(Integer.valueOf((int) this.getPreferredSize().getHeight()).intValue(),
                Integer.valueOf((int) this.getPreferredSize().getHeight()).intValue(), java.awt.Image.SCALE_SMOOTH);
        icon = new ImageIcon(scaledImg);
        playButton.setName("play");
        playButton.setIcon(icon);
        gbc.gridx = 2;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbl.setConstraints(playButton, gbc);
        this.add(playButton);

    }

    public void setButtonIcon(String name){

        if(name.equals("play")){
            ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\playbutton.png");
            Image img = icon.getImage();
            Image scaledImg = img.getScaledInstance(16,16, java.awt.Image.SCALE_SMOOTH);
            icon = new ImageIcon(scaledImg);
            playButton.setIcon(icon);


        }else if (name.equals("pause")) {
            ImageIcon icon = new ImageIcon(System.getProperty("user.dir") + "\\ressources\\pausebutton.png");
            Image img = icon.getImage();
            Image scaledImg =  img.getScaledInstance(16,16, java.awt.Image.SCALE_SMOOTH);
            icon = new ImageIcon(scaledImg);
            playButton.setIcon(icon);


        }
    }

}

Спасибо за любые идеи.


person Hans En    schedule 19.07.2013    source источник
comment
рендерер выглядит подозрительно активным - он не должен делать ничего, кроме рендеринга заданного значения ...   -  person kleopatra    schedule 19.07.2013
comment
oodesign.com/single-responsibility-principle.html   -  person nachokk    schedule 19.07.2013


Ответы (2)


  • не устанавливать / изменять какой-либо JComponent, его значение внутри XxxRenderer, не изменять состояние значения (пришло из XxxTableModel)

  • XxxRenderer - это только декоратор, а не генератор значений,

  • для значения ячейки (в XxxRenderer) является допустимое значение, хранящееся в XxxTableModel, чтобы установить это значение в XxxTableModel,

  • не храните JComponents в XxxTableModel, сохраняется только его значение рендеринга

person mKorbel    schedule 19.07.2013

Ваш рендерер - это целый компонент, в котором есть кнопка и все такое. Я считаю, что это неправильный способ реализации рендерера. Это поведение необходимо смоделировать, например,

  • В MouseListener таблицы найдите, где щелкнул пользователь и какую строку нужно изменить.
  • Обновите свою модель стола соответствующим образом
  • Запустить событие, чтобы таблица знала, что она должна перерисовать обновленную ячейку.
  • Средство визуализации ячейки будет запущено снова и отобразит новое состояние ячейки.

Вы используете некоторый импорт из пакета gui, который предотвращает компиляцию и запуск кода, поэтому лучше всего предположить, что кнопка портит рендеринг во время нажатия - возможно, при попытке нарисовать ее нажатое состояние?

person c.s.    schedule 19.07.2013