|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
[Java] non far selezionare una cella su Jtable
Ciao,
Vorrei impostare la mia tabella in modo che possa decidere quali celle (o colonne) sian selezionabili o meno. E' possibile? ![]() Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Dalla documentazione leggo che c'è il metodo:
isCellEditable(int row, int column); magari vedi se trovi qualcosa di utile in questo link: http://forum.java.sun.com/thread.jsp...sageID=1648959
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Quote:
Io vorrei che neanche mi si "accendesse" ![]() |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Quote:
Il problema è proprio questo! Sembrerebbe che le celle non sono viste come oggetti!!! ![]() ![]() |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Nessuno può indicarmi la retta via?!?!?
![]() ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi sovrascrivere il metodo isCellSelected di JTable. Se la cella non deve essere selezionata restituisci false. Dovresti anche creare un TableCellRenderer per togliere il focus alla cella nel caso in cui non sia selezionabile.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Come lo tolgo il focus?!?!
Posso installare sul TableCellRenderer un FocusListner, ma i metodi implementabili sono solo FocusGained e FocusLost. ![]() ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tra i parametri del metodo getTableCellRendererComponent c'è un boolean, isFocused. Puoi sovrascrivere il metodo in questione di DefaultTableCellRenderer in modo tale da rendere false quel parametro, prima di invocare la super definizione del metodo, se gli indici di riga e colonna corrispondano a quelli di una cella non selezionabile.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Quote:
Dov'è? |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Uomo di poca fede, se dico che c'è, c'è
![]() Codice:
import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class CustomCellRenderer extends DefaultTableCellRenderer { private SelectionData selectionData; public CustomCellRenderer(SelectionData data) { this.selectionData = data; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(hasFocus && !selectionData.canSelect(row, column)) { hasFocus = false; } return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Il mio problema è che ho un mio CellRenderer Che implementa TableCellRenderer!
Ho provato a impostare il boolean hasFocus a false, la cella non mi si seleziona più, ma il focus lo acquisisce lo stesso, o almeno, quando premo tab per saltare dalla cella che la precede a quella successiva devo premere il tasto 2 volte!!! ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#13 | |
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
Quote:
Ho provato per scrupolo, ma non funziona! Il Focus lo acquisisce lo stesso!!!! ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Scrivo un esempio completo. Il problema generale è che una tabella supporta una varietà di modelli di selezione e il caso peggiore è certamente quello in cui tutti questi modelli siano desiderati. Vale a dire che è più facile trattare l'esclusione di una cella dalla selezione qualora il modello di selezione preveda esclusivamente l'accesso ad una singola cella per volta. JTable, al contrario, autorizza normalmente la selezione di più colonne ed eventualmente di una singola cella all'interno di una di queste. Detto questo, l'esempio parte con un oggetto in grado di stabilire quali singole celle all'interno della tabella non siano selezionabili.
Codice:
import java.awt.Point; import java.util.*; public class SelectionData { private ArrayList<Point> unselectableCells = new ArrayList<Point>(); public SelectionData(int...cellCoords) { for(int i = 0; i < cellCoords.length; i += 2) { unselectableCells.add(new Point(cellCoords[i], cellCoords[i + 1])); } } public boolean canSelectCell(int row, int col) { Point p = new Point(row, col); return unselectableCells.contains(p) == false; } } SelectionData sd = new SelectionData(0, 0, 3, 4); Non ho trovato un nome migliore di SelectionData ![]() Il resto si appoggia a questo strumento. Il primo di questo resto è il proiettore delle celle. Il proiettore si rende necessario qualora il modello di selezione della tabella consenta di scegliere intere righe o colonne. Il proiettore fa sì che una cella abbia l'aspetto "non selezionato" quando, date le sue coordinate, essa risulti non selezionabile. Codice:
import java.awt.*; import javax.swing.*; import javax.swing.table.*; public class MyRenderer extends DefaultTableCellRenderer { private SelectionData selectionData; public MyRenderer(SelectionData selectionData) { this.selectionData = selectionData; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(selectionData.canSelectCell(row, column) == false) { isSelected = false; hasFocus = false; } return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } } Codice:
import javax.swing.*; public class MyTable extends JTable { private SelectionData selectionData; public MyTable(SelectionData selectionData) { this.selectionData = selectionData; } public boolean isCellSelected(int row, int col) { boolean answer = super.isCellSelected(row, col); return answer ? selectionData.canSelectCell(row, col) : false; } public boolean isCellEditable(int row, int col) { boolean answer = super.isCellEditable(row, col); return answer ? selectionData.canSelectCell(row, col) : false; } } Codice:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SelectionKeyManager extends KeyAdapter { private SelectionData selectionData; private JTable table; private ListSelectionModel rowSelectionModel, colSelectionModel; public SelectionKeyManager(SelectionData selectionData, JTable table) { this.selectionData = selectionData; this.table = table; rowSelectionModel = table.getSelectionModel(); colSelectionModel = table.getColumnModel().getSelectionModel(); } public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_TAB) { if((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK) { previousColumn(); } else { nextColumn(); } } else if(e.getKeyCode() == KeyEvent.VK_UP) { } else if(e.getKeyCode() == KeyEvent.VK_LEFT) { } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) { } else if(e.getKeyCode() == KeyEvent.VK_DOWN) { } } private void previousColumn() { int row = rowSelectionModel.getLeadSelectionIndex(); int col = colSelectionModel.getLeadSelectionIndex() - 1; if(row < 0) { row = table.getRowCount() - 1; } if(col < 0) { col = table.getColumnCount() - 1; } boolean canSelect = selectionData.canSelectCell(row, col); if(!canSelect) { colSelectionModel.setLeadSelectionIndex(col); } } private void nextColumn() { int row = rowSelectionModel.getLeadSelectionIndex(); int col = colSelectionModel.getLeadSelectionIndex() + 1; //key press invocato prima della mutazione di selezione if(row < 0) { row = 0; } if(col == table.getColumnCount()) { row++; if(row == table.getRowCount()) { row = 0; rowSelectionModel.setSelectionInterval(0, 0); } col = 0; } boolean canSelect = selectionData.canSelectCell(row, col); if(!canSelect) { colSelectionModel.setLeadSelectionIndex(col); } } private void cellUp() { } private void cellDown() { } private void cellLeft() { } private void cellRight() { } } Codice:
import java.awt.*; import javax.swing.*; import javax.swing.table.*; public class Main implements Runnable { public static void main(String[] args) { SwingUtilities.invokeLater(new Main()); } public void run() { DefaultTableModel tableModel = new DefaultTableModel(5, 10); SelectionData selectionData = new SelectionData(0, 0, 1, 1, 2, 2, 3, 3); MyTable table = new MyTable(selectionData); table.setModel(tableModel); MyRenderer renderer = new MyRenderer(selectionData); table.setDefaultRenderer(Object.class, renderer); SelectionKeyManager selectionKeyManager = new SelectionKeyManager(selectionData, table); table.addKeyListener(selectionKeyManager); JScrollPane scrollPane = new JScrollPane(table); JFrame window = new JFrame("Table sample"); window.add(scrollPane); window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); window.pack(); window.setVisible(true); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:36.