Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Java swing: Jtable with many models and custom renderer
- resultTable = new javax.swing.JTable(){
- private Border outside = new MatteBorder(1, 0, 1, 0, Color.BLACK);
- private Border inside = new EmptyBorder(0, 1, 0, 1);
- private Border highlight = new CompoundBorder(outside, inside);
- public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
- Component c = super.prepareRenderer(renderer, row, column);
- JComponent jc = (JComponent) c;
- // Color row based on a cell value
- if (!isRowSelected(row)) {
- c.setBackground(getBackground());
- int modelRow = convertRowIndexToModel(row);
- if (getStatus().equals("status1")) {
- myFirstTableModel model = (myFirstTableModel ) resultTable.getModel();
- if ((model.getObjectAtRow(modelRow).getMsg().getRegNumIn() == 3)) {
- c.setBackground(new Color(255, 244, 148));//YELLOW - needs attension
- }
- } else if (getStatus().equals("status2")) {
- mySecondTableModel model = (mySecondTableModel) resultTable.getModel();
- if (model.getObjectAtRow(modelRow).getMsg().getTask() == 2) {
- c.setBackground(new Color(210, 245, 176));//GREEN - got attension
- }
- }
- } else if (isRowSelected(row)) {
- jc.setBorder(highlight);
- c.setBackground(new Color(201, 204, 196));
- }
- return c;
- }
- };
- final WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
- dialog.addWindowListener(new java.awt.event.WindowAdapter() {
- });
- SwingWorker worker = new SwingWorker() {
- @Override
- protected Object doInBackground() throws Exception {
- setStatus("status2");
- Refresh();
- return 0;
- }
- @Override
- public void done() {
- dialog.dispose();
- }
- };
- worker.execute();
- dialog.setVisible(true);
- if (getMainFrameStatus().equals("status2")) {
- @Override
- public void run() {
- //Update the model here
- resultTable.setModel(new mySecondTableModel(data));
- }
- });
- Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: myFirstTableModel cannot be cast to mySecondTableModel at mySecondTableModel model = (mySecondTableModel) resultTable.getModel();
- public interface StatusAware {
- enum Status {
- NORMAL,
- GOT_ATTENTION,
- NEEDS_ATTENTION,
- ...
- }
- public Status getStatus(int modelIndex);
- }
- public class MyFirstTableModel extends AbstractTableModel implements StatusAware {
- public Statuc getStatus(int modelRow) {
- boolean needsAttention = getObjectAtRow(modelRow).getMsg().getRegNumIn() == 3;
- return needsAttention ? NEEDS_ATTENTION : NORMAL;
- }
- ....
- }
- public class MySecondTableModel extends AbstractTableModel implements StatusAware {
- public Statuc getStatus(int modelRow) {
- return // the status of the given row
- }
- ....
- }
- public class MyTable extends JTable { // if you insist on not using JXTable
- public Component prepareRenderer(...) {
- Component comp = super(...)
- if (getModel() instanceof StatusAware {
- Status status = ((StatusAware) getModel()).getStatus(convertRowIndexToModel(row));
- if (NEEDS_ATTENTION == status) {
- ...
- } else if (...) {
- ...
- }
- }
- return comp;
- }
- }
- HighlightPredicate feverWarning = new HighlightPredicate() {
- int temperatureColumn = 10;
- public boolean isHighlighted(Component component, ComponentAdapter adapter) {
- return hasFever(adapter.getValue(temperatureColumn));
- }
- private boolean hasFever(Object value) {
- if (!value instanceof Number)
- return false;
- return ((Number) value).intValue() > 37;
- }
- };
- Highlighter hl = new ColorHighlighter(feverWarning, Color.RED, null);
- table.addHighlighter(hl);
- if (adapter.getComponent() instanceof JTable) {
- JTable table = (JTable) adapter.getComponent();
- TableModel model = table.getModel();
- if (model instanceof MyModel) {
- int modelRow = adapter.convertRowIndexToModel(adapter.row);
- MyObject object = ((MyModel).getRowObjectAt(modelRow));
- ... // check the object
- }
- }
- SwingUtilities.invokeLater(...)
- SwingUtilities.invokeAndWait(...)
Add Comment
Please, Sign In to add comment