Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable. Как изменить цвета строк? 
:(
    Опции темы
man_without_face
Дата 7.5.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 1.4.2008

Репутация: нет
Всего: 1



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

Объясню сразу, почему не делаю это на момент заполнения базы. Потому что в одной из ячеек находится дата. И мне проще её конвертить и сравнивать с другой, уже после того, как таблица заполнена. Кроме того нужно будет повесить событие подсвечивать/не_подсвечивать строки с определённой датой. 

Вот и вопрос. Как это смастерить? Видно мне необходимы события...
PM MAIL   Вверх
_Y_
Дата 8.5.2008, 09:19 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Вообще-то это в ветку Java: GUI приложения

Но и здесь есть ответ. В закрепленной теме Маленькие классы я выкладывал свой вариант весьма, кстати, боянистого решения smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
man_without_face
Дата 8.5.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 1.4.2008

Репутация: нет
Всего: 1



У вас не совсем то, что нужно. Да и слишком сложно. Сделал проще. 

Вот мой код: 

Код

        JTable table = new JTable(aTempStr, columnNames) {
            private static final long serialVersionUID = -6543930525582285652L;
            
            public TableCellRenderer getCellRenderer(int row, int column) {
                DefaultTableCellRenderer tcr = (DefaultTableCellRenderer) super
                        .getCellRenderer(row, column);
                    if (column == 17) {
                        Object data = this.getValueAt(row, column);
                        SimpleDateFormat format = new SimpleDateFormat(
                                "yyyy-MM-dd");
                        try {
                            Date parsedDate = format.parse(data.toString());
                            Calendar calOne = Calendar.getInstance();
                            calOne.setTime(parsedDate);
                            Calendar calTwo = Calendar.getInstance();
                            calTwo.add(Calendar.MONTH, -2);
                            Calendar distinct = Calendar.getInstance();
                            distinct.setTime(new Date(calTwo.getTime()
                                    .getTime()
                                    - calOne.getTime().getTime()));
                            if (distinct.get(Calendar.MONTH) <= 2) {
                                tcr.setBackground(new Color(255, 125, 125));
                            } else {
                                tcr.setBackground(new Color(75, 125, 75));
                            }
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
                    } else
                        tcr.setBackground(Color.WHITE);
                return tcr;
            }
        };



Только чё-т я не пойму как закрашивать не ячейку, а целую строку, в которой для ячейки выполняется условие:
Код

if (distinct.get(Calendar.MONTH) <= 2) {
    tcr.setBackground(new Color(255, 125, 125));
} else {
    tcr.setBackground(new Color(75, 125, 75));
}


PM MAIL   Вверх
dorogoyIV
Дата 8.5.2008, 19:49 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(man_without_face @  8.5.2008,  14:31 Найти цитируемый пост)
как закрашивать не ячейку, а целую строку

тогда и рендерер не нужен
Код

table.setSelectionBackground(Color.red);

PM MAIL   Вверх
man_without_face
Дата 10.5.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 1.4.2008

Репутация: нет
Всего: 1



to dorogoyIV: скажу вам честно, вы написали бред.

потому как 
Код
table.setSelectionBackground(Color.red);
 выделяет область (!) выделения. Я об этом не писал, т.е. мне не надо работать с выделением.
PM MAIL   Вверх
almagnit
Дата 10.5.2008, 10:21 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 3.4.2008

Репутация: нет
Всего: 7



Если тебе известно количество столбцов в таблице, тогда можно зациклить значение column

Код

DefaultTableCellRenderer tcr1;
for(int i=0; i<n; i++){
     tcr1 = (DefaultTableCellRenderer) super.getCellRenderer(row, i);
     if (distinct.get(Calendar.MONTH) <= 2) {
          tcr1.setBackground(new Color(255, 125, 125));
     } else {
          tcr1.setBackground(new Color(75, 125, 75));
     }
}


Это сообщение отредактировал(а) almagnit - 10.5.2008, 10:22
PM MAIL ICQ   Вверх
man_without_face
Дата 10.5.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 1.4.2008

Репутация: нет
Всего: 1



Сделал так: 
Код

        table = new JTable(aTempStr, columnNames) {
            private static final long serialVersionUID = -6543930525582285652L;

            public TableCellRenderer getCellRenderer(int row, int column) {
                DefaultTableCellRenderer tcr = null;
                for (int i = 0; i < 18; i++) {
                    tcr = (DefaultTableCellRenderer) super.getCellRenderer(row,
                            i);
                    Object data = this.getValueAt(row, i);
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    boolean isDate = true;
                    Date parsedDate = null;
                    try {
                        parsedDate = format.parse(data.toString());
                    } catch (Exception e) {
                        isDate = false;
                    } finally {
                        if (isDate == true) {
                            Calendar calOne = Calendar.getInstance();
                            calOne.setTime(parsedDate);
                            Calendar calTwo = Calendar.getInstance();
                            calTwo.add(Calendar.MONTH, -2);
                            Calendar distinct = Calendar.getInstance();
                            distinct.setTime(new Date(calTwo.getTime()
                                    .getTime()
                                    - calOne.getTime().getTime()));
                            if (distinct.get(Calendar.MONTH) <= 2) {
                                tcr.setBackground(new Color(255, 125, 125, 200));
                            } else {
                                tcr.setBackground(Color.WHITE);
                            }
                        }
                    }
                }
                return tcr;
            }
        };


Но это отстой. Происходит постоянная перерисовка. Т.е. при перетаскивании столбцов - тормозит жутко. Ну ещё бы... Сколько раз метод вызывается за попытку перетащить, да ещё и цикл какой. 

Пока думаю сойдёт, но если у кого-то есть идейки поинтереснее, то пишите. Буду рад. smile
PM MAIL   Вверх
almagnit
Дата 10.5.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 3.4.2008

Репутация: нет
Всего: 7



Зачем ты поставил цикл в самом начале, попробуй так, может будет быстрее

Код

                for (int i = 0; i < 18; i++) {
                    tcr = (DefaultTableCellRenderer) super.getCellRenderer(row,i);
                            if (distinct.get(Calendar.MONTH) <= 2) {

                                tcr.setBackground(new Color(255, 125, 125, 200));
                            } else {
                                tcr.setBackground(Color.WHITE);
                            }
                        }


ЗЫ:


Цитата(man_without_face @  10.5.2008,  11:22 Найти цитируемый пост)
table = new JTable(aTempStr, columnNames) {



columnNames можно убрать  smile 
PM MAIL ICQ   Вверх
dorogoyIV
Дата 10.5.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



по моему не нужно в рендерере вычисления делать
можешь передавать в него ссылки из другого места
маленький примерчик:
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;

public class MyTable extends JFrame
                     implements ActionListener
{
 TableRenderer renderer = new TableRenderer();
 JTable table = new JTable(20, 3);
 JComboBox numbers = new JComboBox();
 JComboBox colors = new JComboBox();

 public MyTable()
 {
  for(int i = 0; i < table.getRowCount(); i++)
  {
   table.setValueAt(i, i, 0);
   numbers.addItem(i);
  }
  colors.addItem("");
  colors.addItem("red");
  colors.addItem("green");
  colors.addItem("blue");

  add(new JScrollPane(table));
  JPanel north = new JPanel(new GridLayout(1, 2));
  north.add(numbers);
  north.add(colors);
  add(north, "North");

  for(int i = 1; i < table.getColumnCount(); i++)
   table.getColumnModel().getColumn(i).setCellRenderer(renderer);

  colors.addActionListener(this);
 }

 public void actionPerformed(ActionEvent e)
 {
  if(colors.getSelectedItem().equals("red"))
   renderer.color = Color.red;
  if(colors.getSelectedItem().equals("green"))
   renderer.color = Color.green;
  if(colors.getSelectedItem().equals("blue"))
   renderer.color = Color.blue;

  renderer.r = Integer.parseInt(numbers.getSelectedItem().toString());
  repaint();
 }

 public static void main(String [] args)
 {
  JFrame f = new MyTable();
  f.setBounds(100, 100, 400, 300);
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

class TableRenderer extends JLabel
                    implements TableCellRenderer
{
 Color color = null;
 int r = 0;

 public Component getTableCellRendererComponent(JTable table, Object value,
                       boolean isSelected, boolean hasFocus, int row, int column)
 {
  setOpaque(true);
  setBackground(color != null  && r == row ? color : Color.white);
  setText(value == null ? "" : value.toString());
  return this;
 }
}

PM MAIL   Вверх
man_without_face
Дата 10.5.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 1.4.2008

Репутация: нет
Всего: 1



Цитата(almagnit @ 10.5.2008,  17:50)
columnNames можно убрать  smile

неа. туда передаются названия колонок. я ж не весь код выкладывал, а только тот, по которому вопрос.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1696 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.