Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по TableCellRenderer / 16 сообщений из 16, страница 1 из 1
19.10.2015, 07:46
    #39079639
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Доброе утро.
Подскажите пожалуйста, почему таблица не красится?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
			switch(column)
			{	
				case MyTableModel.EDIT_COL:
				{
					this.setText("<html><u color=\"blue\">" + value.toString() + "</u></html>");
					return this;
				}
				case MyTableModel.ENGINEERING:
				{
					if (_myDatabase.EngineeringColor == 0) {
						setBackground(Color.GREEN);
						return this;
					}
					else {
						setBackground(Color.RED);						
						return this;
					}
				}
			}
		 this.setText(value.toString());

		return this;
	}
...
Рейтинг: 0 / 0
19.10.2015, 08:35
    #39079681
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Извиняюсь, вопрос не правильно задал.
Вопрос такой, почему заданное поле в MyTableModel не красится?
К примеру вот тут:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
				case MyTableModel.ENGINEERING:
				{
					if (_myDatabase.EngineeringColor == 0) {
						setBackground(Color.GREEN);
						return this;
					}
					else {
						setBackground(Color.RED);						
						return this;
					}
				}
...
Рейтинг: 0 / 0
19.10.2015, 12:59
    #39079986
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Я нашел как красить, только все колонки закрасились.
Как закрасить конкретную колонку?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
			switch(column)
			{	
				case SIFTableModel.EDIT_COL:
				{
					this.setText("<html><u color=\"blue\">" + value.toString() + "</u></html>");
					return this;
				}
				case SIFTableModel.ENGINEERING:
				{
					if (_safetyDatabase.EngineeringColor == 0) {
						setForeground(Color.GREEN);
					}
					else {
						setForeground(Color.RED);						
					}
				}
			}
		 this.setText(value.toString());

		return this;
	}
...
Рейтинг: 0 / 0
19.10.2015, 13:19
    #39080015
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
LiQuid,

Для рендеринга всех ячеек используется один экземпляр Component. Поэтому если вы у этого экземпляра меняете фон, то фон таким же и остаётся для всех последующих отрисовок ячеек.
Можно добавить default блок в ваш switch...case и там установить фон для "всех остальных" колонок.
...
Рейтинг: 0 / 0
19.10.2015, 13:34
    #39080035
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Поставил default но все обратно стали черными:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
			switch(column)
			{	
				case SIFTableModel.EDIT_COL:
				{
					this.setText("<html><u color=\"blue\">" + value.toString() + "</u></html>");
					return this;
				}
				case SIFTableModel.ENGINEERING:
				{
					if (_safetyDatabase.EngineeringColor == 0) {
						setForeground(Color.GREEN);
					}
					else {
						setForeground(Color.RED);						
					}
				}
				default: {
					setForeground(Color.BLACK);
				}
			}
		 this.setText(value.toString());

		return this;
	}	



Вроде явно же указал какие столбцы должны краситься???
...
Рейтинг: 0 / 0
19.10.2015, 13:38
    #39080042
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Сорри, все заработало, нужно было везде return this; ставить. Спасибо Blazkowicz
...
Рейтинг: 0 / 0
19.10.2015, 14:08
    #39080090
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
LiQuidСорри, все заработало, нужно было везде return this; ставить. Спасибо Blazkowicz
В switch...case лучше таки использовать break. А точек выхода из метода иметь как можно меньше.
...
Рейтинг: 0 / 0
24.10.2015, 14:41
    #39085552
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Blazkowicz, чем лучше пользоваться чтобы в одном столбце разные ячейки красились разными цветами?
К примеру
If (условие 1) {
setrBackground(Color.RED);
}

If (условие 2) {
setrBackground(Color.GREEN);
}

Я не могу найти выход из этого положения, дайте пожалуйста дельный совет.
...
Рейтинг: 0 / 0
25.10.2015, 16:20
    #39085849
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
LiQuidBlazkowicz, чем лучше пользоваться чтобы в одном столбце разные ячейки красились разными цветами?
Пользоваться аргументами метода:

JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column
...
Рейтинг: 0 / 0
27.10.2015, 10:22
    #39087681
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
У меня есть таблица, она содержит такие данные:

ID ColorName
1 GREEN
2 RED
3 GREEN
4 RED
5 GREEN
6 GREEN

Вот написал такой TableCellRenderer:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
package SafetyInspectionRegister;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class SIFGroupedTableCellRenderer extends JLabel implements TableCellRenderer
{
	private static final long serialVersionUID = 1;
	Database1 _Database1 = new Database1();
	SIFGroupedTableCellRenderer()
	{
		this.setHorizontalAlignment(SwingConstants.CENTER);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					//и тут я должен как то реализовать все что RED закрасить эту ячейку красным
				}
			}
                        if (column == 1) {
				if (value.equals("GREEN")) {
					//и тут я должен как то реализовать все что GREEN закрасить эту ячейку зеленым
                        } 
			
		return this;
	}	
}



Подскажите пожалуйста как это реализовать?
...
Рейтинг: 0 / 0
27.10.2015, 10:35
    #39087705
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Что не так с setBackground() ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					//и тут я должен как то реализовать все что RED закрасить эту ячейку красным
				}
			}
                        if (column == 1) {
				if (value.equals("GREEN")) {
					//и тут я должен как то реализовать все что GREEN закрасить эту ячейку зеленым
                                }
                        } 
			//А вот тут надо не забыть установить дефолтный цвет фона. Его можно выбрать самому или взять из LAF. Потому как renderer применяется ко всем ячейкам таблицы, а не только к тем, которые вы хотите раскрасить.
		return this;
	}	
...
Рейтинг: 0 / 0
27.10.2015, 11:33
    #39087791
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Я уже добавлял setBackground(), результат:

1. Таблица полностью становится пустой, не знаю почему, пока не добавлю this.setText(value.toString()); таблица пустая.
2. Т.к данные в таблицу не загрузились она не закрасилась.

Т.е если только делаю вот так как внизу показано только тогда данные грузятся и то не красятся:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
package SafetyInspectionRegister;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class SIFGroupedTableCellRenderer extends JLabel implements TableCellRenderer
{
	private static final long serialVersionUID = 1;
	SafetyDatabase _safetyDatabase = new SafetyDatabase();
	SIFGroupedTableCellRenderer()
	{
		this.setHorizontalAlignment(SwingConstants.CENTER);
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					setBackground(Color.RED);
				}
			}
			this.setText(value.toString());
		return this;
	}	

}


И у меня вопрос, почему нужно обязательно добавлять this.setText(value.toString());???
...
Рейтинг: 0 / 0
27.10.2015, 12:07
    #39087824
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
Вот сделал:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class SIFGroupedTableCellRenderer extends JLabel implements TableCellRenderer
{
	private static final long serialVersionUID = 1;
	SafetyDatabase _safetyDatabase = new SafetyDatabase();
	SIFGroupedTableCellRenderer()
	{
		this.setHorizontalAlignment(SwingConstants.CENTER);
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					setBackground(Color.red);
				}
			}
			setBackground(Color.black);
			this.setText(value.toString());
		return this;
	}	

}

Все равно все черные и ничего не красится.
...
Рейтинг: 0 / 0
27.10.2015, 12:11
    #39087828
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
А вот тут как я в Main классе создаю таблицу и присваиваю ей все эти модель и рендер
Код: java
1.
2.
3.
4.
5.
6.
7.
....
	      _SIFGroupedTablePane = new JScrollPane(_SIFGroupedTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
	      _SIFGroupedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);	      
	      _SIFGroupedTable.setModel(_SIFGroupedModel);
	      _SIFGroupedTable.setRowSelectionAllowed(true);
	      _SIFGroupedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);	      
	      _SIFGroupedTable.setDefaultRenderer(Object.class, new SIFGroupedTableCellRenderer());



Тут модель:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
package SafetyInspectionRegister;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

import SafetyInspectionRegister.SafetyDatabase;
import SafetyInspectionRegister.SafetyDatabase.SIFGroupedInfo_t;

/**
 * \author rrtech@tengizchevroil.com
 * \brief &#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;
 * \version 1.0
 */
public class SIFGroupedTableModel extends AbstractTableModel
{		
	private static final long serialVersionUID = 1;
	public static final int ID = 0;	
	public static final int ENGINEERING = 1;	
	
	private SafetyDatabase _safetyDatabase = SafetyDatabase.getInstance();
	ArrayList<SIFGroupedInfo_t> _data = new ArrayList<SafetyDatabase.SIFGroupedInfo_t>();

	public int loadData(final SafetyDatabase.SIFGroupedSearchCriteria_t criteria)
	{
		if (!criteria.isValid())
		{
			return 0;
		}
		if (!_safetyDatabase.findSIFGroupedInfo(criteria, _data))
		{
			return 0;
		}
				
		this.fireTableDataChanged();
		return _data.size();
	}
	
	@Override
	public int getColumnCount()
	{
		return 1;
	}
	
	@Override
	public int getRowCount()
	{
		return _data.size();
	}
	
	@Override
	public Object getValueAt(int rowIndex, int columnIndex)
	{
		
		if (rowIndex > _data.size() - 1)
		{
			return null;
		}
	
		if (columnIndex == ID)
		{
			return _data.get(rowIndex).Dep;		
		}

		if (columnIndex == ENGINEERING)
		{
			return _data.get(rowIndex).Engineering;
		}		
		return null;
	}
	
	@Override
	public String getColumnName(int columnIndex)
	{
		if (columnIndex < 0)
		{
			return null;
		}	

		if (columnIndex == ID)
		{
			return "ID";
		}

		if (columnIndex == ENGINEERING)
		{
			return "Engineering Controls";
		}
		return null;
	}

	public final ArrayList<SafetyDatabase.SIFGroupedInfo_t> getData()
	{
		return _data;
	}
	
}
...
Рейтинг: 0 / 0
27.10.2015, 12:19
    #39087846
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
LiQuid1. Таблица полностью становится пустой, не знаю почему, пока не добавлю this.setText(value.toString()); таблица пустая.

Ну, потому что вы написали свой собственный Renderer, который ничего кроме цвета фона не делает. Можно было бы взять DefaultTableCellRederer, отнаследоваться и вызывать его super.getTableCellRendererComponent() метод. Он отрисует и текст и фокус и выделение. В вашем SIFGroupedTableCellRenderer ничего же этого нет.

LiQuid2. Т.к данные в таблицу не загрузились она не закрасилась.

Ну, когда нет данных просто фон контейнера таблицы отображается. Вопрос не понятен.

LiQuidИ у меня вопрос, почему нужно обязательно добавлять this.setText(value.toString());???
CellRenderer это контрол для отрисовки ячеей таблицы.
У таблицы есть свой такой контрол по умолчанию. Вы его заменили на свой собственный. Но ваш собственный ничего не делает. И текст не рисует.
...
Рейтинг: 0 / 0
27.10.2015, 12:29
    #39087865
golovonometr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по TableCellRenderer
LiQuidВот сделал:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class SIFGroupedTableCellRenderer extends JLabel implements TableCellRenderer
{
	private static final long serialVersionUID = 1;
	SafetyDatabase _safetyDatabase = new SafetyDatabase();
	SIFGroupedTableCellRenderer()
	{
		this.setHorizontalAlignment(SwingConstants.CENTER);
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					setBackground(Color.red);
				}
			}
			setBackground(Color.black);
			this.setText(value.toString());
		return this;
	}	

}

Все равно все черные и ничего не красится.



все черное потому, что вы после условия установили всему черный цвет
Код: plaintext
setBackground(Color.black);

Обратите внимание на параметры метода
Код: plaintext
getTableCellRendererComponent(...int row, int column)
они не просто так, когда таблица рендерится, метод
Код: plaintext
getTableCellRendererComponent(...int row, int column)
вызывается столько раз сколько ячеек у таблицы. Пробегая по каждой ячейке таблицы.

Что вам мешает создать вашем классе
Код: plaintext
SIFGroupedTableCellRenderer 
поле, в котором вы бы хранили те координаты ячеек таблицы которые хотите покрасить. А в методе
Код: plaintext
getTableCellRendererComponent(...int row, int column)
проверяли бы соответствуют ли координаты row и column, и если соответствуют то красить их.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class SIFGroupedTableCellRenderer extends JLabel implements TableCellRenderer
{
	private static final long serialVersionUID = 1;
	SafetyDatabase _safetyDatabase = new SafetyDatabase();
	SIFGroupedTableCellRenderer()
	{
		this.setHorizontalAlignment(SwingConstants.CENTER);
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
			if (column == 1) {
				if (value.equals("RED")) {
					setBackground(Color.red);
				}
			} else setBackground(Color.black); //теперь все черным быть не должно
			this.setText(value.toString());
		return this;
	}	

}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по TableCellRenderer / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]