如何制作一个可以用户逐个单元格选择的JTable?

时间:2016-08-18 13:45:05

标签: java jtable

如何进行选择,用户可以逐个单元格选择而不进行间隔?

我如何获得行和列位置并存储在 _dvPosicoes = new double[7][7].

Number 0 done in excel

我已经使用过:

  1. setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
  2. setColumnSelectionAllowed(false);
  3. setRowSelectionAllowed(false);
  4. 覆盖方法Component getTableCellRendererComponent
  5. 我试过了:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class UserTable extends JPanel {
    
    // Propriedades.
    // Define o tamanho do Grid.
    private static final int TAMANHOGRID = 7;
    
    // Quarda os valores das posíções das células clícadas pelo Usuário.
    private double[][] _dvPosicoes = new double[7][7];
    
    // Possibilita a mudança das configurações do elemento tipo lista.
    public DefaultListModel _dlmListaUsuario = new DefaultListModel();
    public JList _listaUsuario = new JList(_dlmListaUsuario);
    public JButton _btnVerificar = new JButton("Verificar");
    public JLabel _lblTitulo = new JLabel("Desenhe o Dígito:");
    
    public UserTable() {
    
        super(new FlowLayout(FlowLayout.CENTER, 10, 10));
    
        // Configurações da Lista.        
        _listaUsuario.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        _listaUsuario.setLayoutOrientation(JList.VERTICAL_WRAP);
        _listaUsuario.setVisibleRowCount(7);
        _listaUsuario.setVisibleRowCount(TAMANHOGRID);
        _listaUsuario.setCellRenderer(new RendenrizarLista());
        _listaUsuario.addListSelectionListener(new SelecionarHandler());
    
        /*int start = 0;
        int end = _listaUsuario.getModel().getSize() - 1;
        if (end >= 0) {
            _listaUsuario.setSelectionInterval(start, end);
        }*/
        System.out.println(_listaUsuario.getSelectedValuesList());
    
        // Mostra os valores das posições x e y das células clicadas pelo Usuário.
        for (int _iContadorI = 0; _iContadorI < _dvPosicoes.length; _iContadorI++) {
            for (int _iContadorJ = 0; _iContadorJ < _dvPosicoes[_iContadorI].length; _iContadorJ++) {
    
                _dvPosicoes[_iContadorI][_iContadorJ] = _iContadorI;
    
                //double _strPosPressionada = _dvPosicoes[_iContadorI][_iContadorJ];
                String _strPosPressionada = "X";
    
                // Muda a forma de como é mostrado posição de cada célula do Grid.
                _dlmListaUsuario.addElement(_strPosPressionada);
    
                //System.out.println(_dlmListaUsuario.getElementAt((int)_dvPosicoes[_iContadorI][_iContadorJ]));
            }
    
        }
    
    
    
        // Adiciona os Componentes.
        //this.add(_lblTitulo);
        this.add(_btnVerificar);
        this.add(_listaUsuario);
    }
    
    // Mudar as configurações de cada célula do grid.
    private class RendenrizarLista extends DefaultListCellRenderer {
    
        // Set
        public RendenrizarLista() {
            this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 10, true));
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    
            JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            component.setBorder(BorderFactory.createEmptyBorder((int) TAMANHOGRID, (int) TAMANHOGRID, (int) TAMANHOGRID, (int) TAMANHOGRID));
    
            component.setBorder(BorderFactory.createEmptyBorder(TAMANHOGRID, TAMANHOGRID, TAMANHOGRID, TAMANHOGRID));
            return component;
        }
    
    }
    
    private class SelecionarHandler implements ListSelectionListener {
    
        @Override
        public void valueChanged(ListSelectionEvent e) {
    
            if (!e.getValueIsAdjusting()) {
    
    
    
                //System.out.println(_listaUsuario.getSelectedValuesList());
                //System.out.println(_dvPosicoes);
    
            }
    
        }
    
    }
    
    void mostrarJanelaPrincipal() {
        JFrame frmPrincipal = new JFrame("Reconhecedor de Dígitos");
        frmPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmPrincipal.setLocationRelativeTo(null);
        frmPrincipal.setResizable(false);
        frmPrincipal.add(this);
        frmPrincipal.pack();
        frmPrincipal.setVisible(true);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new UserTable().mostrarJanelaPrincipal();
        });
    }
    }
    

1 个答案:

答案 0 :(得分:1)

ListSelectionModel.MULTIPLE_INTERVAL_SELECTION也可供JList使用,您可以使用HORIZONTAL_WRAP安排任意单元格选择,如here所示。

image

  

我如何获得位置行和列并存储在matrix[N][N]

如图here所示,您可以互换网格坐标和给定array stride的列表坐标:

int index = row * N + col;

int row = index / N;
int col = index % N;