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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable header and OS 
:(
    Опции темы
PashaOvechkin
Дата 18.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

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



Привет! 
Как то раньше задавал подобный вопрос...

Есть Ява десктопное приложение, в которм используются таблицы и установлен лук енд фил так 

Код

        try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
        catch (ClassNotFoundException e) { /* Do nothing */ }
        catch (InstantiationException e) { /* Do nothing */ }
        catch (IllegalAccessException e) { /* Do nothing */ }
        catch (UnsupportedLookAndFeelException e) { /* Do nothing */  }
        Toolkit.getDefaultToolkit().setDynamicLayout(true);


Необходимо в хедере таблицы установить чек бокс.  

Сделал ето следующим образом -> 
Код

        table.getTableHeader().getColumnModel().getColumn(PositionsTableModel.COLUMN_CHECK).setHeaderValue("");
        table.getTableHeader().getColumnModel().getColumn(PositionsTableModel.COLUMN_CHECK).setHeaderRenderer(new CheckBoxHeader(new CheckBoxHeaderItemListener(table)));



где 
Код


package com.dukascopy.dds2.greed.gui.component.table;

import java.awt.Component;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;


/**
  * Add a JCheckBox to the Renderer
  * @author Alexey Zaprudnev
  */
@SuppressWarnings("serial")
public class CheckBoxHeader extends JCheckBox
    implements TableCellRenderer, MouseListener {

  /**
    * the Renderer Component.
    * @see #getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    */
  protected CheckBoxHeader rendererComponent;
  //protected JCheckBox checkBox;

  /** To which (JTable-) columns does this Checkbox belong ? */
  protected int column;

  /**
    * remembers, if mousePressed() was called before.
    * Workaround, because dozens of mouseevents occurs after one
    * mouseclick.
    */
  protected boolean mousePressed = false;

  /**
    * @param itemListener will be notified when Checkbox will be checked/unchecked
    */
  public CheckBoxHeader(ItemListener itemListener) {
    rendererComponent = this;
    rendererComponent.addItemListener(itemListener);
  }

  /** @return this */
  //pasted from javax.swing.table.TableColumn.createDefaultHeaderRenderer()
  //with some slight modifications.
  //implements TableCellRenderer
  public Component getTableCellRendererComponent(
      JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {

    if (table != null) {
      JTableHeader header = table.getTableHeader();
      if (header != null) {

       rendererComponent.setFont(UIManager.getFont("TableHeader.font"));
       rendererComponent.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
       rendererComponent.setForeground(UIManager.getColor("TableHeader.foreground"));
       rendererComponent.setBackground(UIManager.getColor("TableHeader.background"));
       
//        rendererComponent.setForeground(header.getForeground());
//        rendererComponent.setBackground(header.getBackground());
//        rendererComponent.setFont(header.getFont());
        //rendererComponent.setEnabled(table.getRowCount()!=0);
        header.addMouseListener(rendererComponent);
      }
    }
       //rendererComponent.setSize(10,10);
       //rendererComponent.setPreferredSize(new Dimension(10,10));
       
    setColumn(column);
    //rendererComponent.setText((value == null) ? "" : value.toString());
    rendererComponent.setHorizontalAlignment(JCheckBox.CENTER);

    rendererComponent.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    rendererComponent.setBorderPainted(true);
    rendererComponent.setBorderPaintedFlat(true);
    
//    rendererComponent.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
//    rendererComponent.setBorder(BorderFactory.createCompoundBorder(
//            BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK),
//            BorderFactory.createEmptyBorder(3, 0, 3, 0)));
    if(table.getRowCount()==0) rendererComponent.setSelected(false);
    return rendererComponent;
  }

  /** @param column to which the CheckBox belongs to */
  protected void setColumn(int column) {
    this.column = column;
  }

  /** @return the column to which the CheckBox belongs to */
  public int getColumn() {
    return column;
  }
  
  public void validate() {}
  public void revalidate() {}
  protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
  public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}  
  
  /**************** Implementation of MouseListener ******************/

  /**
    * Calls doClick(), because the CheckBox doesn't receive any
    * mouseevents itself. (because it is in a CellRendererPane).
    */
  protected void handleClickEvent(MouseEvent e) {
    // Workaround: dozens of mouseevents occur for only one mouse click.
    // First MousePressedEvents, then MouseReleasedEvents, (then
    // MouseClickedEvents).
    // The boolean flag 'mousePressed' is set to make sure
    // that the action is performed only once.
    if (mousePressed) {
      mousePressed=false;

      JTableHeader header = (JTableHeader)(e.getSource());
      JTable tableView = header.getTable();
      TableColumnModel columnModel = tableView.getColumnModel();
      int viewColumn = columnModel.getColumnIndexAtX(e.getX());
      int column = tableView.convertColumnIndexToModel(viewColumn);

      if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
        if(tableView.getRowCount()!=0) doClick();
      }
    }
  }

  public void mouseClicked(MouseEvent e) {
    handleClickEvent(e);
    //Header doesn't repaint itself properly
    ((JTableHeader)e.getSource()).repaint();
  }

  public void mousePressed(MouseEvent e) {
    mousePressed = true;
  }

  public void mouseReleased(MouseEvent e) {
    //works - problem: works even if column is dragged or resized ...
    //handleClickEvent(e);
    //properly repainting by the Header
  }

  public void mouseEntered(MouseEvent e) {
  }

  public void mouseExited(MouseEvent e) {
  }
}




Если запускаем ето чудо на Windows XP (с темой Windows XP) или на Windows Vista хедер с чек бохом выглядит ужасно. Не нативно.
Он раздут, да и стандартной выпоклости нет.

Как ето выглядит можно посмотреть в атачменте.
Есть предположение что ето Ява УИ манагер глючит. Без лук енд фил всё работает как надо. 
Убрать лук енд фил не предлогать.
Спасибо! 

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  header.JPG 16,73 Kb
PM MAIL Skype   Вверх
w1nd
Дата 19.2.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

Репутация: 23
Всего: 54



Есть предположение, что вы пока слабо понимаете, как работает PLAF smile Вы заменяете рендерер на свой, тогда как именно в рендерерах вся "нативность" и рисуется. Иными словами, ваша проблема неразрешима - либо "нативный" заголовок, либо свои рендереры.

Это сообщение отредактировал(а) w1nd - 19.2.2008, 12:33


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
PashaOvechkin
Дата 19.2.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

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



Именно по етому я и предпологаю что единственный выхoд - покопаться в йдк... В каком нить УИ манагере. 
Но пока у меня не получилось найти где... :(( 

Это сообщение отредактировал(а) PashaOvechkin - 19.2.2008, 12:50
PM MAIL Skype   Вверх
w1nd
Дата 19.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

Репутация: 23
Всего: 54



Цитата(PashaOvechkin @  19.2.2008,  12:49 Найти цитируемый пост)
Именно по етому я и предпологаю что единственный выхoд - покопаться в йдк... В каком нить УИ манагере. Но пока у меня не получилось найти где... :(( 

Что вы там предполагаете найти? Windows look-n-feel живёт в java runtime (это не часть api с исходниками), нужные для "нативноподобной" отрисовки в windows классы (XPStyle и TMSchema) непубличные. Вы всё равно не сможете сделать так, чтобы для всех lnf получился нативный вид.

Это сообщение отредактировал(а) w1nd - 19.2.2008, 15:44


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
PashaOvechkin
Дата 19.2.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 394
Регистрация: 1.4.2007
Где: Riga, Latvia

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



w1nd, ета задача для меня как бы фоновая... Но быо бы супер если удалось решить. 
нашел я коекакие манагери, да рендереры, но они не очень то спасают... :(
Какая мораль всего етого?
Не стоит пурзаться? Если да, то как обосновать? если можно с сылками на документацию
PM MAIL Skype   Вверх
w1nd
Дата 19.2.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

Репутация: 23
Всего: 54



Цитата(PashaOvechkin @  19.2.2008,  15:56 Найти цитируемый пост)
Не стоит пурзаться? Если да, то как обосновать?

Я никогда не встречал какой-либо вменяемой документации по PLAF и думаю, что её нет в природе. А возиться действительно не стоит - завяжетесь на определённый look-n-feel и на определёную jvm, не говоря уже о том, что докапываться до классов придётся либо с помощью reflection, либо агентом.


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

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

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


 




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


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

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