Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Without Swing html


Автор: PashaOvechkin 2.4.2008, 12:06
Привет!

В атачменте есть пример таблицы.
Многие ячеики (Long/short колонка) состоит из разнацветной надписи со многими цватами фонта и размерами фонта.
Вопрос - как можно создавать такое вот содержимое зачеек в таблицах НЕ ИСПОЛьЗУЯ Swing Html?
спасибо.

П.С Ето нужно для того что бы ускорить рендеринг таблиц. таблицы  достаточно массивные и сложные, есть подозрения что Swing Html их притормаживает

Автор: Kangaroo 2.4.2008, 12:11
Не думаю, что это возмножно. 
Один элемент - один фонт. Разве что делать ячейку-панель, а в ней куча лейблов  smile 

Автор: PashaOvechkin 2.4.2008, 12:17
да, так кажется - и ето будет уж точно помедленней чем ХТМЛ...

Автор: math64 2.4.2008, 12:18
сделать свою реализацию TableCellRenderer и вызвать setDefaultRenderer().

Автор: Kangaroo 2.4.2008, 12:25
Цитата(math64 @  2.4.2008,  11:18 Найти цитируемый пост)
сделать свою реализацию TableCellRenderer и вызвать setDefaultRenderer().

Это понятно, а какую предлагаешь реализацию? 

Автор: math64 2.4.2008, 12:37
Вся ячейка одного цвета - JLabel
Многоцветная - JLabel с Icon, в которой сам русуешь всё что нужно (последний или первый кусок текста можешь вывести в тексте JLabel)

Автор: PashaOvechkin 2.4.2008, 13:11
Цитата(math64 @ 2.4.2008,  12:37)
Вся ячейка одного цвета - JLabel
Многоцветная - JLabel с Icon, в которой сам русуешь всё что нужно (последний или первый кусок текста можешь вывести в тексте JLabel)

еем...  smile 

Что значит "JLabel с Icon"?

Автор: math64 2.4.2008, 13:32
JLabel может содержать картинку (обычно это маленькая иконка фиксированного размера - но никто тебя не ограничивает). Картинка может загружаться из файла, он может отрисовываться "на лету" - что и нужно сделать в этом случае.
Впрочем, можно создать свой класс extends JComрonent, который будет отрисовывать всю ячейку.

Автор: PashaOvechkin 2.4.2008, 14:39
в цеях улучения перформанца сомневаюсь что ето хороший совет smile

Автор: math64 2.4.2008, 14:47
Ну это смотря как реализуешь отрисовку иконки.

Автор: PashaOvechkin 2.4.2008, 14:55
ну Html по любму быстрей будет 

Автор: math64 2.4.2008, 15:01
При использоваии Html придётся делать теже самые графические операции + парсинг Html, вычисление размеров текста и т.д.
Или ты подумал что я предлагаю записывать картинку в файл а потом его отображать? Нет, отрисовывать сразу.

Автор: PashaOvechkin 2.4.2008, 15:29
 smile 

Хотелось бы видеть пример етого CellRenderer а... 
например что в ячеике рисовал текст, первая половина которога красная и в болде, вторая зелёная...

Автор: w1nd 2.4.2008, 23:33
Цитата(Kangaroo @  2.4.2008,  12:11 Найти цитируемый пост)
Не думаю, что это возмножно. Один элемент - один фонт.

Возможно. Только лучше сделать свой компонент, а не насиловать JLabel.


Цитата(PashaOvechkin @  2.4.2008,  15:29 Найти цитируемый пост)
Хотелось бы видеть пример етого CellRenderer а... например что в ячеике рисовал текст, первая половина которога красная и в болде, вторая зелёная...

Посмотрите на класс AttributedString.

Автор: Kangaroo 2.4.2008, 23:52
Цитата(w1nd @  2.4.2008,  23:33 Найти цитируемый пост)
Возможно. Только лучше сделать свой компонент, а не насиловать JLabel.

Гуд, будем знать.
Теперь подождем пока PashaOvechkin разберется и выложит результат  smile

Автор: math64 3.4.2008, 07:36
Вот: Кстати вместо Icon можно использовать Border, заглушки методов для этого в коде есть.
Код

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.*;

public class Main extends DefaultTableCellRenderer implements Icon, Border {
  String green;
  String red;
  
  /** Creates a new instance of Main */
  public Main () {
    setIcon (this);
  }
  
  /**
   * @param args the command line arguments
   */
  public static void main (String[] args) {
    String[][] data = { {"A1-B1", "A1-B2"},{"A2-B1","A2-B2"}};
    String[] col = {"C1","C2"};
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    Main main = new Main();
    JTable table = new JTable(data, col);
    table.setDefaultRenderer (Object.class, main);
    frame.setContentPane (new JScrollPane(table));
    frame.pack ();
    frame.setVisible (true);
  }

  public void paintIcon (Component c, Graphics g, int x, int y) {
    g.setColor (getBackground ());
    g.fillRect (x,y, getIconWidth (), getIconHeight ());
    Font font = getFont ();
    g.setFont (font);
    FontMetrics fm = g.getFontMetrics (font);
    int ascent = fm.getMaxAscent ();
    g.setColor (Color.GREEN);
    g.drawString (green, x, y + ascent);
    g.setColor (Color.RED);
    g.drawString (red, x + getIconWidth () - (int)fm.getStringBounds (red,g).getWidth (), y + ascent);
  }

  public int getIconWidth () {
    return getWidth ();
  }

  public int getIconHeight () {
    return getHeight ();
  }

  public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    String text = getText();
    green = text.substring (0, 2);
    red = text.substring (3);
    setText(null);
    //setBorder (this);
    return this;
  }

  public void paintBorder (Component c, Graphics g, int x, int y, int width, int height) {
  }

  public Insets getBorderInsets (Component c) {
    return new Insets(0,0,0,0);
  }

  public boolean isBorderOpaque () {
    return true;
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)