Проблема с рисованием JLabel как заголовка столбца в JTable (и переопределением компонента PaintComponent)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с рисованием JLabel как заголовка столбца в JTable (и переопределением компонента PaintComponent)

Сообщение Anonymous »

Я пытаюсь использовать JLabel для заголовков столбцов в JTable и переопределить PaintComponent, чтобы раскрасить процент ненулевых значений для каждого столбца, что-то вроде фона визуализация заполняемости. Вроде бы все довольно просто, но визуализация почему-то всегда применяется только к первому (левому) столбцу, как на картинке ниже:
Изображение

В примере "Скорость заполнения" является случайной, но применяется только для первого столбца при циклическом прохождении все столбцы.
Изменить: использование Java 8 и MacOS
Полный исходный код:import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.util.Random;

public class CustomTable extends JFrame {

private static class CustomLabel extends JLabel {

public CustomLabel(String text) {
super(text);
}

@Override
protected void paintComponent(Graphics g) {
Random random = new Random(System.currentTimeMillis());
int w = random.nextInt(getWidth());
int h = getHeight();
int x = getX();
int y = getY();
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.green);
g2.fillRect(x, y, w, h);
super.paintComponent(g2);
g2.dispose();
}

}

private static class CustomTableCellRenderer implements TableCellRenderer {

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

}

public CustomTable() {
setTitle("CustomTable");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(320, 240);
setLayout(new GridLayout(1, 1));
String[] columns = {"id", "fname", "lname"};
String[][] data = {{"1", "John", "Doe"}, {"2", "Jane", "Doe"}};
JTable jt = new JTable(data, columns);
TableColumnModel model = jt.getColumnModel();
for (int i = 0; i < columns.length; i++) {
CustomLabel cl = new CustomLabel(columns);
model.getColumn(i).setHeaderValue(cl);
model.getColumn(i).setHeaderRenderer(new CustomTableCellRenderer());
}
add(new JScrollPane(jt));
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
}
new CustomTable();
}
});
}

}


Подробнее здесь: https://stackoverflow.com/questions/790 ... tcomponent
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»