2013-07-19 3 views
0

У меня есть таблица с табличной моделью, содержащая некоторые имена и CellRenderer, которая расширяет Panel I, который содержит JButton. Everythign отлично работает, если только я не нажимаю кнопку, значения в ячейке исчезают, пока я держу JButton нажатым !? ниже панели и рендерера. Есть идеи?Ячейка 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) является resposible значение, сохраненное в XxxTableModel, чтобы установить это значение в XxxTableModel,

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

0

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

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

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

Смежные вопросы