2017-01-24 4 views
0

Я хочу изменить цвет фона ячейки JTable и хочу получить данные из базы данных MySQL.Динамическое изменение цвета фона ячейки JTable

Я использую таблицу данных в MySQL, которая имеет поле состояния. Если статус равен 1, цвет фона ячейки должен быть красным, а если статус равен 0, то он должен измениться на красный.

+2

так что в основном вы хотите, чтобы он был красным все время? – XtremeBaumer

+0

Привет! Вообще говоря, для того, чтобы люди могли правильно ответить на ваш вопрос таким образом, который имеет смысл в контексте вашего приложения, нам нужно увидеть некоторые соответствующие фрагменты кода из вашего кода, в его текущей форме мы не можем действительно рассказать вам о том, как исправить эту проблему, кроме «использовать инструкцию if» или что-то глупое подобное. – zack6849

+0

Итак, вы хотите, чтобы мы искали. Существует хороший учебник о том, как улучшить дизайн JTable. Это может быть хорошим началом, тогда, если это не сработает, вернитесь с некоторым кодом. – AxelH

ответ

0
//This is the code which I have used to change jtable cell background color dynamically 
[green color indicates empty(free) cell and red color indicates occupied cells][1] 
int row, col, row1, column; 
    TableCellRenderer renderer; 
    private static final int STATUS_COL = 1; 
String host = "jdbc:mysql://localhost/your_database"; 
     String username = "root"; 
     String password = ""; 
     Statement stmt = null; 
try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection connect = DriverManager.getConnection(host, username, password); 
      stmt = connect.createStatement(); 
      String sql = "your query"; 
      ResultSet rs = stmt.executeQuery(sql); 
      ResultSetMetaData meta = rs.getMetaData(); 
      Object[][] data = new Object[10][2]; 
      DefaultTableModel model = new DefaultTableModel(data, col); 
      jTable1.setModel(DbUtils.resultSetToTableModel(rs)); 
      rs = stmt.executeQuery(sql); 
int rowCnt = 0; 
       try{ 

     rs = stmt.executeQuery(sql); 
     if(rs.last()){ 
      rowCnt = rs.getRow(); 
     } 
    } catch (Exception e){ 
     System.out.println("Error getting row count"); 
     e.printStackTrace(); 
    } 

      int nCol = rs.getMetaData().getColumnCount(); 
      List<String[]> table = new ArrayList<>(); 
String[] row = new String[nCol]; 
for(int l=1; l<rowCnt; l++) 
{ 
    for (int iCol = 1; iCol <= nCol; iCol++) { 
        Object obj = rs.getObject(iCol); 
        row[iCol - 1] = (obj == null) ? null : obj.toString(); 
jTable1.setDefaultRenderer(Object.class, new EntryCellRender()); 
} 
       table.add(row); 
} 
} catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
public class EntryCellRender extends DefaultTableCellRenderer { 

    private final Color alt2 = Color.RED; 
    private final Color alt1 = Color.GREEN; 
    private final Color invalidStatus = Color.RED; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component cr = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
if ("".equals(table.getValueAt(row, col))) { 
      setBackground(alt1); 
      } else { 
       setBackground(alt2); 
      } 

     return cr; 
    } 

    private Color colorAlternator(int row) { 
     if ((row % 2) == 0) { 
      return alt1; 
     } else { 
      return alt2; 
     } 
    } 
} 

    enter code here 

    [1]: https://i.stack.imgur.com/Fi4LF.png 
+0

Спасибо за вашу поддержку. – Manohar

1

id предлагает индивидуальный рендеринг ячеек для достижения того, что вы хотите.

public class CellRenderer extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, 
      int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     if (column == /*your column number goes here*/) { 
      this.setValue(table.getValueAt(row, column)); 
      this.setBackground(Color.RED); 
     } 
     return this; 
    } 
} 

, прежде чем выбрать цвет, вы можете проверить значение, если его 0 или 1, а затем изменить цвет, если это то, что вы хотите

Как я создал и заполнил/пополнен в JTable с данными база данных:

Таблица:

private void createTable(Container pane) { 
    Object[] namen = { "Datum", "Kategorie", "Essen", "Preise Intern", "Preise Extern" }; 
    model = new DefaultTableModel(namen, 0); 
    table = new JTable(model) { 

     public boolean isCellEditable(int x, int y) { 
      return false; 
     } 
    }; 
    Dimension minimumSize = new Dimension(1000, 500); 
    table.setPreferredScrollableViewportSize(minimumSize); 
    TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model); 
    table.setRowSorter(sorter); 

    sorter.setComparator(3, Sorter.getComparator()); 
    sorter.setComparator(4, Sorter.getComparator()); 
    table.getColumnModel().getColumn(3).setCellRenderer(new CellRenderer()); //custom cell renderer 
    table.getColumnModel().getColumn(4).setCellRenderer(new CellRenderer()); //custom cell renderer 

    JScrollPane sp = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
} 

и как я заполнил его:

void refreshTableContent(Vector<Gericht> v) { 
    for (int i = table.getRowCount() - 1; i >= 0; i--) { 
     model.removeRow(i); 
    } 
    fillTable(v); 
} 

void fillTable(Vector<Gericht> v) { 
    for (int i = 0; i < v.size(); i++) { 
     Gericht g = v.get(i); 
     Vector<Object> vhelp = new Vector<>(); 
     vhelp.add(df.format(g.getDate())); 
     vhelp.add(g.getClassification()); 
     vhelp.add(g.getName()); 
     vhelp.add(g.getPreisIntern()); 
     vhelp.add(g.getPreisExtern()); 
     model.addRow(vhelp); 
    } 
} 

model - DefaultTableModel, на котором вы добавляете и удаляете данные. при каждом пополнении я сначала удаляю все строки, а затем добавляю их новые. это, вероятно, не лучшее решение, но оно работает

модель - это еда в этом случае, которая имеет несколько полей. поэтому я создал вектор моего собственного объекта, а затем создал вектор помощи и сохранил значения одного приема пищи в нем. затем я добавил вектор как строку в JTable, и следующая еда была сохранена в векторе помощи.

Я надеюсь, что вы можете понять, что я сделал здесь

+0

Большое спасибо за ваш ценный ответ. – Manohar

+0

Но я не понимаю, как подключиться к базе данных и выбрать значения в JTable с динамическим изменением цвета ячейки. – Manohar

+0

Даже я хочу разделить данные таблицы в слоты из 40 строк и остануться в следующем столбце. Например, у меня есть 2000 строк и вы хотите отображать их в 40 строках и 50 столбцах. – Manohar

-1

Как XtremeBaumer предполагает, пользовательские ячейки является стандартным способом добиться того, что вы хотите. Просто помните, что создается только один (1) экземпляр класса визуализации ячеек и используется для отображения всех ячеек JTable.
Удачи!

+0

Привет, ребята! ... Наконец, я смог завершить свое задание. – Manohar

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