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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable, работа с одной ячейкой 
:(
    Опции темы
diablero
Дата 21.2.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Доброго времени суток!
Суть задачи, необходимо подсветить и сделать определенные действия при выделении ячейки.
У таблицы, две модели выделения, одна для строк, вторая для столбцов.
Все прекрасно работает пока не начинаешь выделять ячейку по какой-нибудь диагонали, происходит выделение по две.

Как это обойти? Кто с этим сталкивался.

Пример:
Код

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


public class TestUI extends JFrame{
    private JTable table; 
    private DataTableModel dataModel;
    
    public TestUI(){
         super();
         dataModel  = new DataTableModel();
         
         table = new JTable(dataModel);
         table.setDefaultRenderer(Object.class, new DataTableCellRenderer());
         table.setCellSelectionEnabled(true);
         
         table.setRowHeight(70);
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
               
         table.getColumnModel().getSelectionModel().addListSelectionListener(
                    new ListSelectionListener() {

                        public void valueChanged(ListSelectionEvent e) {
                            if (e.getValueIsAdjusting() && table.getSelectedRow() != -1 && table.getSelectedColumn() != -1 
                                    ) {

                                System.out.println("1: row=" + table.getSelectedRow()+ " col="+table.getSelectedColumn());
                                
                            }
                        }
                    });
              
         table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {

                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting() && table.getSelectedRow() != -1 && table.getSelectedColumn() != -1) {
                            
                        
                            System.out.println("2: row=" + table.getSelectedRow()+ " col="+table.getSelectedColumn());
                        }                        
                            
                            
                    }
                });
            
         Container cp = getContentPane();
         cp.add(BorderLayout.CENTER, table);

            
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setSize(600, 600);
         setLocationRelativeTo(null);

    }
    
    public static void main(String arg[]) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestUI().setVisible(true);
            }
        });

    }
}


import java.awt.Color;
import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;


public class DataTableCellRenderer implements TableCellRenderer {
    private Color SELECTIONFOREGRAUNDCOLOR, SELECTIONBACKGROUNCOLOR,
            FOREGRAUNDCOLOR, BACKGROUNCOLOR;


    public DataTableCellRenderer() {

        
        SELECTIONFOREGRAUNDCOLOR = UIManager.getColor("Table.selectionForeground");
        SELECTIONBACKGROUNCOLOR = UIManager.getColor("Table.selectionBackground");
        FOREGRAUNDCOLOR = UIManager.getColor("Table.focusCellForeground");
        BACKGROUNCOLOR = UIManager.getColor("Table.focusCellBackground");
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int r, int c) {
        
        JLabel component = new JLabel(value.toString());
        component.setOpaque(true);
        

        if (isSelected) {
            component.setForeground(SELECTIONFOREGRAUNDCOLOR);
            component.setBackground(SELECTIONBACKGROUNCOLOR);
            
        } else {
            component.setForeground(FOREGRAUNDCOLOR);
            component.setBackground(BACKGROUNCOLOR);
        }
        return component;
    }
}


import javax.swing.table.AbstractTableModel;


public class DataTableModel extends AbstractTableModel {

    public DataTableModel() {
        
    }
    
    @Override
    public int getColumnCount() {
        return 8;
    }

    @Override
    public int getRowCount() {
        return 8;
    }

    
    @Override
    public Object getValueAt(int x, int y) {
        return x*y;
    }
    
}





--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
_Y_
Дата 21.2.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А что значит "выделять ячейку по диагонали"?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
diablero
Дата 22.2.2011, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Выделить ячейку(1,1), а потом кликнуть на ячейку (2,2), то отработают сразу два обработчика. Будто вы щелкнули на (1,2) и (2,2)


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Skipy
Дата 22.2.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Если мне не изменяет память, таблицы в Java не поддерживают свободного выделения ячеек. Только блоками.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 22.2.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да тебе просто условие нужно добавить ...
что то вроде такого...
Код

  table.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener()
  {
   public void valueChanged(ListSelectionEvent e)
   {
    int column = table.getSelectedColumn();

    if (e.getValueIsAdjusting() && table.getSelectedRow() != -1 &&
        table.getSelectedColumn() != -1 &&
        column != table.getSelectedColumn())
    {
     System.out.println("2: row=" + table.getSelectedRow() +
                        " col = " + table.getSelectedColumn());
    }
   }
  });

PM MAIL   Вверх
dorogoyIV
Дата 22.2.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



удивительно?  smile 
у меня работает! 
почему работает? - секрет!  smile 
 smile 
PM MAIL   Вверх
dorogoyIV
Дата 23.2.2011, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ладно  smile , если серьезно...

зачем тебе два метода?!!!
к тому же там условия одинаковые...

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


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

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