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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable selectAll 
:(
    Опции темы
PashaOvechkin
Дата 13.2.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Раньше работал в основном с вебом.
Пришлось перейти на десктоп... Куча вопросов.

Какой самый лучший способ в ЙТабле сделать сабж...
В йсф например, есть готовый компонент под ето.
В свинге кажется пусто!!

Что посоветуете?


PM MAIL Skype   Вверх
w1nd
Дата 14.2.2008, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



table.getSelectionModel().setSelectionInterval(0, table.getRowCount());


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


Опытный
**


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

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



ето конечно круто, но по мне самый стандартный и интуитивно понятный способ выбирать 
все записи таблицы сразу, или по одной : 

Колонка, в хедере которой стоит чек бокс (селект алл/ деселект алл), ну и в каждом ряде тоже отделйный чек бокс...
Ну а самая большая проблема вставить в хедер что то (не уродливое) что могло бы позволить пользователю сделать сабж

PM MAIL Skype   Вверх
Kangaroo
Дата 14.2.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Цитата(PashaOvechkin @  14.2.2008,  09:50 Найти цитируемый пост)
Ну а самая большая проблема вставить в хедер что то (не уродливое) что могло бы позволить пользователю сделать сабж

Так сделайте рендерер для хедера - панелька с комбобоксом.


--------------------
Lost....
PM MAIL MSN   Вверх
PashaOvechkin
Дата 14.2.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделано давно  в нескольких вариантах - выглядит ужасно...

PM MAIL Skype   Вверх
Kangaroo
Дата 14.2.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Цитата(PashaOvechkin @  14.2.2008,  11:25 Найти цитируемый пост)
Сделано давно  в нескольких вариантах - выглядит ужасно...

Тогда покажите код, скажите чего не нравится. Будем пытаться исправлять. Других вариантов сделать это нет.


--------------------
Lost....
PM MAIL MSN   Вверх
PashaOvechkin
Дата 14.2.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ето сам рендерер : 

Код


public class MyTableCellReenderer extends JCheckBox implements TableCellRenderer {
        // This method is called each time a cell in a column
        // using this renderer needs to be rendered.
        
        public MyTableCellReenderer(){
            
            super();
            //super ("<html> <center> OK </center></html>", SwingConstants.CENTER);
            //this.setText("<html> <center> OK </center></html>");
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
            // 'value' is value contained in the cell located at
            // (rowIndex, vColIndex)
    
            if (isSelected) {
                // cell (and perhaps other cells) are selected
            }
    
            if (hasFocus) {
                // this cell is the anchor and the table has the focus
            }
    
            // Configure the component with the specified value
            setText(value.toString());
    
            // Set tool tip if desired
            setToolTipText((String)value);
    
            // Since the renderer is a component, return itself
            return this;
        }
    
        // The following methods override the defaults for performance reasons
        public void validate() {}
        public void revalidate() {}
        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
        public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    }


так я его сечу :

Код


        MyTableCellReenderer a = new MyTableCellReenderer();
        table.getTableHeader().getColumnModel().getColumn(PositionsTableModel.COLUMN_CHECK).setHeaderRenderer( a );


Ничего особого... Но хедер изуродован полнустью...
Пробовал добавить лабел с листенером, тоже самое :|

Идеи?
PM MAIL Skype   Вверх
PashaOvechkin
Дата 14.2.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да уж... Гуру молчат.
Неужели никто не решал сабж проблему...

И я оооочень удивлён что нету стандартного решения  smile 
PM MAIL Skype   Вверх
Kangaroo
Дата 14.2.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



PashaOvechkin, 
все правильно. Надо только поиграться, чтобы было похоже на стандартные хедеры (бодеры поменять, чекбокс в панель засунуть и выводить, етс).


Цитата(PashaOvechkin @  14.2.2008,  14:52 Найти цитируемый пост)
И я оооочень удивлён что нету стандартного решения 

Это нормальное стандартное решение. Я другого пока не знаю.

Это сообщение отредактировал(а) Kangaroo - 14.2.2008, 16:32


--------------------
Lost....
PM MAIL MSN   Вверх
PashaOvechkin
Дата 14.2.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, ето типо стандартное.


я о другом. Такая необходимая вещ для таблиц как САБЖ, могла бы решатся попроще - например добавлением параметра в конструктор, ну или как то там еще...

Хммм... Действителйно - попробую через панель...

Ни у кого нету готового примера? 
PM MAIL Skype   Вверх
Kangaroo
Дата 14.2.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 15
Всего: 104



Вот код, отлично все работает:
Код

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
public class JTableHeaderCheckBox
{
  Object colNames[] = {"", "String", "String"};
  Object[][] data = {};
  DefaultTableModel dtm;
  JTable table;
  public void buildGUI()
  {
    dtm = new DefaultTableModel(data,colNames);
    table = new JTable(dtm);
    for(int x = 0; x < 5; x++)
    {
      dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2","Row "+(x+1)+" Col 3"});
    }
    JScrollPane sp = new JScrollPane(table);
    TableColumn tc = table.getColumnModel().getColumn(0);
    tc.setCellEditor(table.getDefaultEditor(Boolean.class));
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));
    tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListener()));
    JFrame f = new JFrame();
    f.getContentPane().add(sp);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
  class MyItemListener implements ItemListener
  {
    public void itemStateChanged(ItemEvent e) {
      Object source = e.getSource();
      if (source instanceof AbstractButton == false) return;
      boolean checked = e.getStateChange() == ItemEvent.SELECTED;
      for(int x = 0, y = table.getRowCount(); x < y; x++)
      {
        table.setValueAt(new Boolean(checked),x,0);
      }
    }
  }
  public static void main (String[] args)
  {
    SwingUtilities.invokeLater(new Runnable(){
      public void run(){
        new JTableHeaderCheckBox().buildGUI();
      }
    });
  }
}
class CheckBoxHeader extends JCheckBox
    implements TableCellRenderer, MouseListener {
  protected CheckBoxHeader rendererComponent;
  protected int column;
  protected boolean mousePressed = false;
  public CheckBoxHeader(ItemListener itemListener) {
    rendererComponent = this;
    rendererComponent.addItemListener(itemListener);
  }
  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.setForeground(header.getForeground());
        rendererComponent.setBackground(header.getBackground());
        rendererComponent.setFont(header.getFont());
        header.addMouseListener(rendererComponent);
      }
    }
    setColumn(column);
    rendererComponent.setText("Check All");
    this.setBorderPainted(true);
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    return rendererComponent;
  }
  protected void setColumn(int column) {
    this.column = column;
  }
  public int getColumn() {
    return column;
  }
  protected void handleClickEvent(MouseEvent e) {
    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) {
        doClick();
      }
    }
  }
  public void mouseClicked(MouseEvent e) {
    handleClickEvent(e);
    ((JTableHeader)e.getSource()).repaint();
  }
  public void mousePressed(MouseEvent e) {
    mousePressed = true;
  }
  public void mouseReleased(MouseEvent e) {
  }
  public void mouseEntered(MouseEvent e) {
  }
  public void mouseExited(MouseEvent e) {
  }
}

Нашел тут и немного изменил ( добавил строчку this.setBorderPainted(true);). 
Красиво смотрится, попробуй.


--------------------
Lost....
PM MAIL MSN   Вверх
PashaOvechkin
Дата 14.2.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ого... smile
Спасибо! Сейчас попробую!!!!

Добавлено через 2 минуты и 31 секунду
Kangaroo, ето плюс! smile
Запустил пример - осталось интегрировать к себе...  smile 
PM MAIL Skype   Вверх
PashaOvechkin
Дата 14.2.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, не всё так солнечно... smile 
Етот фрейм Kangaroo и правда хорош smile
но если изменить биулд метод на нот что виден ниже...
(добаляем лук енд фил )

Код


  public void buildGUI()
  { 
      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);
      
    dtm = new DefaultTableModel(data,colNames);
    table = new JTable(dtm);
    for(int x = 0; x < 5; x++)
    {
      dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2","Row "+(x+1)+" Col 3"});
    }
    JScrollPane sp = new JScrollPane(table);
    TableColumn tc = table.getColumnModel().getColumn(0);
    tc.setCellEditor(table.getDefaultEditor(Boolean.class));
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));
    tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListener()));
    JFrame f = new JFrame();
    f.getContentPane().add(sp);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    
      
  }


Хеадер виглядет совсем не нативно... Ужасно
PM MAIL Skype   Вверх
dorogoyIV
Дата 14.2.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 46



ты не туда LaF вставил, надо в конец метода
Код

  public void buildGUI()
  {
    dtm = new DefaultTableModel(data,colNames);
    table = new JTable(dtm);
    for(int x = 0; x < 5; x++)
    {
      dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2","Row "+(x+1)+" Col 3"});
    }
    JScrollPane sp = new JScrollPane(table);
    TableColumn tc = table.getColumnModel().getColumn(0);
    tc.setCellEditor(table.getDefaultEditor(Boolean.class));
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));
    tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListener()));

    JFrame f = new JFrame();
    f.getContentPane().add(sp);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
      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);
  }

PM MAIL   Вверх
PashaOvechkin
Дата 14.2.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile) Можно конечно и в конец метода, только еффекта не будет никакого ;) 
Ето look and feel  options... На уровне ОС, и их надо устанавливать перед запуском ГУИ

Добавлено через 49 секунд
Посмотри как фрейм выглядит если устанавливаем в начале метода, и посмотри как он же выглядит если в конце установить 
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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