2013-07-19 95 views
0

我有一个tablemodel包含一些名称和一个CellRenderer,它扩展了包含JButton的Panel。除了当我点击按钮时,只要我按住JButton,单元格中的值就消失了,Everythign很好用!?低于专家组和渲染器。有任何想法吗?单击按钮时JTable单元格发生更改?

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


     } 
    } 

} 

感谢您的任何想法。

+1

渲染器看起来可疑活跃 - 它不能做任何事情比_rendering_给定的值... – kleopatra

+0

http://www.oodesign.com/single-responsibility-principle.html – nachokk

回答

2
  • 不设置/修改任何JComponent,它的价值里面XxxRenderer,不改变价值状态(来自XxxTableModel

  • XxxRenderer只是装饰机不值发生器,

  • 细胞值(在XxxRenderer)是存储在XxxTableModel,设置在XxxTableModel这个值resposible值,

  • 不存储在XxxTableModelJComponents,有只存储其绘制值

0

您呈现的是有一个按钮,一切全成分。我相信这不是实现渲染器的正确方法。这种行为需要被模拟,例如

  • 在表格的MouseListener寻找到用户点击,需要哪一行改变
  • 更新您的台式相应
  • 火灾事件,让表知道它应该重新绘制更新单元
  • 单元格渲染器将再次执行并绘制单元格的新状态。

你试图绘制其按下状态时使用来自gui包,防止代码编译和运行所以在这里我最好的猜测是,与渲染,而混乱按钮被按下-perhaps部分进口?