¿Hay una manera fácil de manipular los controles en una JTable para proporcionar diferentes funcionalidades cuando se presiona un botón del teclado (es decir, el botón CTRL) y se selecciona una fila? Se me ha pedido que cree una tabla donde el CTRL + clic (clic del mouse) en una fila solo anulará la selección de una fila seleccionada, nunca seleccione una fila. Si el usuario CTRL + hace clic en una fila no seleccionada, no pasará nada.Cambiar el comportamiento de Ctrl + clic en una JTable
He podido crear una tabla y desactivar funciones como CTRL + A (seleccionar todas), y he podido verificar si el botón de control está presionado cuando se genera un evento MouseEvent, pero puedo ' Parece que se da cuenta de cómo se puede ajustar CTRL + Click. Aquí hay algo de código:
package nicky;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;
public class TableTester extends JPanel {
public TableTester() {
super(new GridLayout(1,0));
final String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
final Object[][] data = {
{"Tom", "Roberts","Athletic", new Integer(5), new Boolean(false)},
{"Sarah", "Watt", "Football", new Integer(3), new Boolean(true)},
{"Laura", "Brown", "Swimming", new Integer(2), new Boolean(false)},
{"Simon", "Smith", "Tennis", new Integer(20), new Boolean(true)},
{"Paul", "Jones", "Rugby", new Integer(10), new Boolean(false)}
};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 100));
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.addMouseListener(new MouseListener(){
public void mouseEntered(MouseEvent me){}
public void mouseExited(MouseEvent me){}
public void mouseReleased(MouseEvent me){}
public void mouseClicked(MouseEvent me){}
public void mousePressed(MouseEvent me){
if (me.isControlDown()){
System.out.println("This is working ");
}
}
});
InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);
inputMap.put(keyStroke, "none");
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("TableTester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableTester newContentPane = new TableTester();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
En el método mousePressed He jugado un poco con la obtención de todas las filas seleccionadas de la tabla, y luego iba a comprobar si la fila recién hecho clic en los selectedRows era ... Sin embargo, No estoy seguro de si hay una forma de ver qué fila está asociada con MouseEvent.
(Además, sé comportamiento esperado como este no debe ser jugado con demasiado, pero es replicar un sistema heredado de la empresa)
Cualquier Ideas/sugerencias serán bienvenidos!
Woohoo! ¡Funcionó! Gracias :) Y sí, creo que los requisitos son una locura ... ¡y esto ni siquiera es la mitad! – Nicks