2014-09-02 2 views
1

을 서브 클래 싱하는 60 초마다 다운로드가 예약되는 야후 따옴표로 Jtable을 채 웁니다. 새 값에 따라 단일 셀의 배경을 바꿀 것입니다 (예 : 새 값이 이전 값보다 작 으면 배경색이 녹색이됩니다).업데이트 된 JTable의 이전 값에 따라 셀 배경을 설정하는 방법

private static class TextCellRenderer implements TableCellRenderer { 

     @Override public Component getTableCellRendererComponent(final JTable table, Object value, boolean isSelected, boolean hasFocus, final int r, final int c) { 
      table.setRowHeight(10); 
      final JTextField text = new JTextField(); 
      text.setOpaque(true);//disable transparence 
      text.setText(value.toString()); 
      text.addPropertyChangeListener(new PropertyChangeListener(){ 

       @Override 
       public void propertyChange(PropertyChangeEvent evt) { 
        JTextField l=(JTextField)evt.getSource(); 
        l.setOpaque(true); 
        String property=evt.getPropertyName(); 
        double d1=(Double)evt.getOldValue();//old value 
        if(property=="text"){ 
         double d2=(Double)evt.getNewValue();//new value 
         //nothing happens - mantain old backround 
         if (d2==d1){ 
          l.setBackground(l.getBackground()); 
         } 
         //new value>old value 
         else if (d2>d1){ 
          l.setBackground(Color.green); 
         } 
         //new value<old value 
         else if (d2<d1){ 
          l.setBackground(Color.red); 
         } 
         d1=d2; 
         } 

       } 

      }); 
      return text; 
     }  
} 

나는 내가 잘못 이해 필요 : 나는 (어떤 결과) 시도했습니다

TableCellRenderer이 따르는 propertychangelistener로 추가 구현합니다. 고마워요

+0

그것. – ttrash

+1

참조 ['if (property == "text")'] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) –

+1

또한 좋은 생각이 아닙니다. 1. 렌더러에서 테이블 (table.setRowHeight)을 사용합니다. 메소드에 전달 된 테이블은 일반적으로 읽기 전용으로 사용되어야합니다. 2. get 렌더러 메서드 내에서 렌더러 구성 요소 만들기 –

답변

1

제 제안은 우선 좋은 디자인을 사용하는 것입니다. CurrentPrevious과 같은 간단한 bean을 작성하십시오. 여기서 현재 값과 이전 값의 값을 보유 할 수 있습니다. CurrentPrevious의 해당 인스턴스를 테이블 모델에 추가하십시오.

class CurrentPrevious { 
    Double current; 
    Double previous; 
    // getters an setters 

    @Override 
    public String toString() { 
     return current.toString(); 
    } 
} 

당신 만 current 값이 표에서 볼 수 할, 그래서 당신은 단순히 클래스의 toString을 무시하고 current의 문자열 값을 반환 할 수 있습니다.

렌더링의 경우 사용자 지정 렌더링이 필요 없습니다. 당신이 특별한 일을하는 것을 보지 못합니다. 렌더러로 텍스트 필드를 만드는 것은 무의미한 것처럼 보입니다. 원하는 편집 기능은 편집기 구성 요소를 사용하여 수행해야합니다. 따라서 사용자 정의 렌더러 대신 테이블의 prepareRenderer을 무시하십시오. 아래처럼 :

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
    Component c = super.prepareRenderer(renderer, row, col); 
    Object value = getValueAt(row, col); 
    if (value instanceof CurrentPrevious) { 
     CurrentPrevious curPrev = (CurrentPrevious) value; 
     Double current = curPrev.getCurrent(); 
     Double previous = curPrev.getPrevious(); 
     Color color = getColor(current, previous); 
     c.setBackground(color); 
    } 
    return c; 
} 
... 
private Color getColor(Double current, Double previous) { 
    Color color; 
    if (current.equals(previous) || current > previous) { 
     color = Color.GREEN; 
    } else { 
     color = Color.RED; 
    } 
    return color; 
} 

값을 업데이트해야하는 경우 이전 값을 현재 값으로 변경하고 현재 값을 새 값으로 설정하면됩니다.

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
for (int i = 0; i < model.getRowCount(); i++) { 
    CurrentPrevious curPrev = (CurrentPrevious) model.getValueAt(i, 0); 
    curPrev.setPrevious(curPrev.getCurrent()); 
    Double newCurrent = getRandomDouble(); 
    curPrev.setCurrent(newCurrent); 
    model.setValueAt(curPrev, i, 0); 
} 

같이 보일 것이다 그 결과

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.math.BigDecimal; 
import java.math.RoundingMode; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 

public class ChangeCellColorDemo { 

    private Random random = new Random(); 
    private JTable table = getTable(); 

    public ChangeCellColorDemo() { 
     Timer timer = new Timer(2000, new TimerListener()); 
     JFrame frame = new JFrame(); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     timer.start(); 
    } 

    private class TimerListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      DefaultTableModel model = (DefaultTableModel) table.getModel(); 
      for (int i = 0; i < model.getRowCount(); i++) { 
       CurrentPrevious curPrev = (CurrentPrevious) model.getValueAt(i, 0); 
       curPrev.setPrevious(curPrev.getCurrent()); 
       Double newCurrent = getRandomDouble(); 
       curPrev.setCurrent(newCurrent); 
       model.setValueAt(curPrev, i, 0); 
      } 
     } 
    } 

    private JTable getTable() { 
     JTable table = new JTable(getTableModel()) { 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       Component c = super.prepareRenderer(renderer, row, col); 
       Object value = getValueAt(row, col); 
       if (value instanceof CurrentPrevious) { 
        CurrentPrevious curPrev = (CurrentPrevious) value; 
        Double current = curPrev.getCurrent(); 
        Double previous = curPrev.getPrevious(); 
        Color color = getColor(current, previous); 
        c.setBackground(color); 
       } 
       return c; 
      } 

      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return getPreferredSize(); 
      } 
     }; 
     return table; 
    } 

    private TableModel getTableModel() { 
     String[] cols = {"Value"}; 
     DefaultTableModel model = new DefaultTableModel(cols, 0); 
     for (int i = 0; i < 10; i++) { 
      Object[] row = new Object[1]; 
      Double current = getRandomDouble(); 
      Double previous = getRandomDouble(); 
      row[0] = new CurrentPrevious(current, previous); 
      model.addRow(row); 
     } 
     System.out.println(model.getRowCount()); 
     return model; 
    } 

    private Color getColor(Double current, Double previous) { 
     Color color; 
     if (current.equals(previous) || current > previous) { 
      color = Color.GREEN; 
     } else { 
      color = Color.RED; 
     } 
     return color; 
    } 

    private Double getRandomDouble() { 
     BigDecimal bd = new BigDecimal(random.nextDouble()); 
     bd = bd.setScale(4, RoundingMode.HALF_UP); 
     return bd.doubleValue(); 
    } 

    class CurrentPrevious { 

     Double current; 
     Double previous; 

     public CurrentPrevious() {} 

     public CurrentPrevious(Double current, Double previous) { 
      this.current = current; 
      this.previous = previous; 
     } 

     public Double getCurrent() { 
      return current; 
     } 

     public Double getPrevious() { 
      return previous; 
     } 

     public void setCurrent(Double current) { 
      this.current = current; 
     } 

     public void setPrevious(Double previous) { 
      this.previous = previous; 
     } 

     @Override 
     public String toString() { 
      return current.toString(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new ChangeCellColorDemo(); 
      } 
     }); 
    } 
} 
끝에 선 "D1 = D2는"내가 삭제하는 것을 잊었다가 이전의 코드로 작성되었으며, 분명히 잘못
+1

덕분에, 그것은 잘 작동합니다. 나는 콩에 대해 몰랐다. 감사. – ttrash

+0

도움이되어 기쁘게 생각합니다. "bean"은 실제로 JavaBean의 약자입니다. [JavaBean convention] (http://en.wikipedia.org/wiki/JavaBeans)을 따르는 [일반 자바 객체 (POJO)] (http://en.wikipedia.org/wiki/Plain_Old_Java_Object) –

관련 문제