【问题标题】:JTable cell changes when clicking Button?单击按钮时JTable单元格发生变化?
【发布时间】:2013-07-19 11:55:14
【问题描述】:

我有一个表格,表格模型包含一些名称和一个 CellRenderer,它扩展了我制作的包含 JButton 的面板。一切都很好,除非当我单击按钮时,只要我按住 JButton 单击,单元格中的值就会消失!?在面板和渲染器下方。有什么想法吗?

        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);


        }
    }

}

感谢您的任何想法。

【问题讨论】:

标签: java swing jtable jbutton


【解决方案1】:
  • 不要设置/修改任何JComponent,它在XxxRenderer中的值,不要改变值的状态(来自XxxTableModel

  • XxxRenderer 只是装饰器而不是值生成器,

  • 对于单元格值(在XxxRenderer中)是存储在XxxTableModel中的resposible值,要在XxxTableModel中设置这个值,

  • 不要在XxxTableModel中存储JComponents,那里只存储它的渲染值

【讨论】:

    【解决方案2】:

    您的渲染器是一个完整的组件,其中包含一个按钮和所有内容。我相信这不是实现渲染器的正确方法。需要模拟这种行为,例如

    • 在表格的MouseListener 中找到用户点击的位置以及需要更改的行
    • 相应地更新您的表模型
    • 触发一个事件,让表格知道它应该重新绘制更新的单元格
    • 单元格渲染器将再次执行并绘制单元格的新状态。

    您使用了来自 gui 包的一些导入,这些导入阻止了代码编译和运行,所以我最好的猜测是按钮在被按下时会与渲染混淆 - 也许是在尝试绘制其按下状态时?

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多