2016-01-30 2 views
1

Я использую Netbeans для разработки Java-приложения, у меня есть набор результатов из базы данных MYSQL, и я хочу поместить эти данные в JTable. У меня проблема, когда я хочу изменить цвет фона ячейки JTable на основе его значения (например: если значение ячейки в Jtable не равно 1, ее цвет должен быть красным). Вот мой код:изменить цвет ячейки Jtable на основе результатов набора значений от msyql

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/** 
* 
* 
*/ 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Font; 
import java.sql.*; 
import java.util.Vector; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class Cell2 { 

    // JDBC driver name and database URL 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/db"; 

    // Database credentials 
    static final String USER = "root"; 
    static final String PASS = "(abdc)"; 

    public void queryABTS(JTable table) { 
     Connection conn = null; 
     Statement stmt = null; 
     try { 
      //STEP 2: Register JDBC driver 
      Class.forName("com.mysql.jdbc.Driver"); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 

      //STEP 4: Execute a query 
      System.out.println("Creating statement..."); 
      stmt = conn.createStatement(); 
      String sql; 
      sql = "SELECT * from dbn;"; 
      ResultSet rs = stmt.executeQuery(sql); 
      ResultSetMetaData rsmt = rs.getMetaData(); 
      int c = rsmt.getColumnCount(); 
      Vector column = new Vector(c); 
      for (int i = 1; i <= c; i++) { 
       column.add(rsmt.getColumnName(i)); 
      } 
      Vector data = new Vector(); 
      Vector row = new Vector(); 
      while (rs.next()) { 
       row = new Vector(c); 
       for (int i = 1; i <= c; i++) { 
        row.add(rs.getString(i)); 
       } 
       data.add(row); 
      } 

      table.setModel(new javax.swing.table.DefaultTableModel(data, column)); 
      table.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 13)); 
      // table.getValueAt(1, 1); 

      TableColumn column1 = null; 

      for (int i = 0; i < 5; i++) { 
       column1 = table.getColumnModel().getColumn(i); 
       if (i == 3) { 
        column1.setPreferredWidth(150); //third column is bigger 

       } else { 
        column1.setPreferredWidth(50); 

       } 
      } 

      setCellRenderer(table); 
      //color cell ======================================================================= 

      // end color cell ================================================================== 


//======================================================== 

//======================================================= 
      //STEP 6: Clean-up environment 
      rs.close(); 
      stmt.close(); 
      conn.close(); 
     } catch (SQLException se) { 
      //Handle errors for JDBC 
      se.printStackTrace(); 
     } catch (Exception e) { 
      //Handle errors for Class.forName 
      e.printStackTrace(); 
     } finally { 
      //finally block used to close resources 
      try { 
       if (stmt != null) { 
        stmt.close(); 
       } 
      } catch (SQLException se2) { 
      }// nothing we can do 
      try { 
       if (conn != null) { 
        conn.close(); 
       } 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      }//end finally try 
     }//end try 
     System.out.println("Goodbye!"); 
    }//end main 


public static TableCellRenderer createCellRenderer() { 
    return new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      if (column == 4 && "1".equals((String) value)) { 
    c.setBackground(Color.RED); 
    } 

      return c; 
     } 
    }; 
} 

public static void setCellRenderer(JTable table) { 
    TableCellRenderer cellRenderer = createCellRenderer(); 
    table.setDefaultRenderer(Object.class, cellRenderer); 
} 





} 
+0

Посмотрите в обучающих материалах [JTable] (https://docs.oracle.com/javase/tutorial/uiswing/components/table.html), в частности в разделе о пользовательских обработчиках ячеек. Основная идея заключается в том, что вам нужно хранить достаточную информацию с вашей моделью, чтобы вы могли принимать решения о том, как форматировать данные в рендерере, даже если эти данные не отображаются напрямую. – MadProgrammer

ответ

1

Попробуйте

public static TableCellRenderer createCellRenderer() { 
    return new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      c.setBackground(Color.GREEN); 

      return c; 
     } 
    }; 
} 

public static void setCellRenderer(JTable table) { 
    TableCellRenderer cellRenderer = createCellRenderer(); 
    table.setDefaultRenderer(Object.class, cellRenderer); 
} 

Позвонив table.setModel(new javax.swing.table.DefaultTableModel(data, column)); вы ставите свои данные в табличной модели. JTable использует по умолчанию DefaultTableCellRenderer экземпляр для рендеринга ячеек, который может быть заменен вашим собственным рендерером ячеек, вызывая table.setDefaultRenderer(Integer.class, cellRenderer) - это установит пользовательский сотендер для всех столбцов Integer (DefaultTableModel использует столбцы Object). Когда таблица отображается, каждая ячейка таблицы настраивается с помощью метода getTableCellRendererComponent(...) оператора cellrenderer таблицы. В этом методе у вас есть текущий компонент (ячейка) с его значением и позицией (см. Параметры), которые вы можете использовать, чтобы настроить свою ячейку перед получением рендеринга.

Так что, если вы хотите установить цвет фона RED для каждой ячейки второго столбца со значением 1, можно было бы написать:

if (column == 1 && ((Integer) value) == 1) { 
    c.setBackground(Color.RED); 
} 

Passing таблицы data для визуализации ячейки

public static TableCellRenderer createCellRenderer(final Vector data) { 
    return new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      // use data to customize current component 

      return c; 
     } 
    }; 
} 

public static void setCellRenderer(JTable table, Vector data) { 
    // Vector data = ((DefaultTableModel) table.getModel()).getDataVector(); 
    TableCellRenderer cellRenderer = createCellRenderer(data); 
    table.setDefaultRenderer(Object.class, cellRenderer); 
} 
+0

Я использую resualtset из mysql, могу ли я указать столбец и все ячейки, которые имеют значение 1 во втором столбце. Спасибо –

+0

Я только что отредактировал свой ответ, надеюсь, что это поможет. – matoni

+0

Спасибо за вашу помощь, я пробовал этот код, он не генерирует ошибок, но цвета Jtable-ячейки не меняются. –

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