powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по TableCellRenderer
16 сообщений из 16, страница 1 из 1
Вопрос по TableCellRenderer
    #39079639
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.
	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
Вопрос по TableCellRenderer
    #39079681
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, вопрос не правильно задал.
Вопрос такой, почему заданное поле в 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
Вопрос по TableCellRenderer
    #39079986
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.
	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
Вопрос по TableCellRenderer
    #39080015
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

Для рендеринга всех ячеек используется один экземпляр Component. Поэтому если вы у этого экземпляра меняете фон, то фон таким же и остаётся для всех последующих отрисовок ячеек.
Можно добавить default блок в ваш switch...case и там установить фон для "всех остальных" колонок.
...
Рейтинг: 0 / 0
Вопрос по TableCellRenderer
    #39080035
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставил 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
Вопрос по TableCellRenderer
    #39080042
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, все заработало, нужно было везде return this; ставить. Спасибо Blazkowicz
...
Рейтинг: 0 / 0
Вопрос по TableCellRenderer
    #39080090
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidСорри, все заработало, нужно было везде return this; ставить. Спасибо Blazkowicz
В switch...case лучше таки использовать break. А точек выхода из метода иметь как можно меньше.
...
Рейтинг: 0 / 0
Вопрос по TableCellRenderer
    #39085552
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, чем лучше пользоваться чтобы в одном столбце разные ячейки красились разными цветами?
К примеру
If (условие 1) {
setrBackground(Color.RED);
}

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

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

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

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
Вопрос по TableCellRenderer
    #39087705
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что не так с 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
Вопрос по TableCellRenderer
    #39087791
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже добавлял 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
Вопрос по TableCellRenderer
    #39087824
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;
	}	

}

Все равно все черные и ничего не красится.
...
Рейтинг: 0 / 0
Вопрос по TableCellRenderer
    #39087828
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тут как я в 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
Вопрос по TableCellRenderer
    #39087846
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid1. Таблица полностью становится пустой, не знаю почему, пока не добавлю this.setText(value.toString()); таблица пустая.

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

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

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

LiQuidИ у меня вопрос, почему нужно обязательно добавлять this.setText(value.toString());???
CellRenderer это контрол для отрисовки ячеей таблицы.
У таблицы есть свой такой контрол по умолчанию. Вы его заменили на свой собственный. Но ваш собственный ничего не делает. И текст не рисует.
...
Рейтинг: 0 / 0
Вопрос по TableCellRenderer
    #39087865
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по TableCellRenderer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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