제 제안은 우선 좋은 디자인을 사용하는 것입니다. 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);
}
같이 보일 것이다 그 결과
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는"내가 삭제하는 것을 잊었다가 이전의 코드로 작성되었으며, 분명히 잘못
그것. – ttrash
참조 ['if (property == "text")'] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) –
또한 좋은 생각이 아닙니다. 1. 렌더러에서 테이블 (table.setRowHeight)을 사용합니다. 메소드에 전달 된 테이블은 일반적으로 읽기 전용으로 사용되어야합니다. 2. get 렌더러 메서드 내에서 렌더러 구성 요소 만들기 –