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


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

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

Пример:
Код

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;
    }
    
}



Автор: _Y_ 21.2.2011, 23:04
А что значит "выделять ячейку по диагонали"?

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

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

Автор: dorogoyIV 22.2.2011, 14:23
да тебе просто условие нужно добавить ...
что то вроде такого...
Код

  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());
    }
   }
  });

Автор: dorogoyIV 22.2.2011, 15:43
удивительно?  smile 
у меня работает! 
почему работает? - секрет!  smile 
 smile 

Автор: dorogoyIV 23.2.2011, 02:19
ладно  smile , если серьезно...

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

или я не улавливаю суть проблемы твоей...  smile 

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