Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-01-2007, 10:11   #1
spv42
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
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2007, 13:56   #2
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2007, 08:24   #3
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Quote:
Originariamente inviato da RaouL_BennetH
Dalla documentazione leggo che c'è il metodo:

isCellEditable(int row, int column);
Io però intendevo non selezionabile, quel metodo lo conosco, non permette di editare la cella, ma la stessa cella risulta selezionabile!

Io vorrei che neanche mi si "accendesse"
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2007, 14:51   #4
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da spv42
Io però intendevo non selezionabile, quel metodo lo conosco, non permette di editare la cella, ma la stessa cella risulta selezionabile!

Io vorrei che neanche mi si "accendesse"
uhm... ma un "setEnabled(false)" per le celle che ti interessa non rendere selezionabili?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2007, 16:06   #5
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Quote:
Originariamente inviato da RaouL_BennetH
uhm... ma un "setEnabled(false)" per le celle che ti interessa non rendere selezionabili?
Quel metodo si applica a tutto il componente JTable e non alla singola cella!
Il problema è proprio questo!
Sembrerebbe che le celle non sono viste come oggetti!!!

spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 09:16   #6
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Nessuno può indicarmi la retta via?!?!?
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2007, 14:43   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2007, 18:10   #8
spv42
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.


me per Favore
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2007, 21:35   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 09:59   #10
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Quote:
Originariamente inviato da PGI-Bis
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.
Nei metodi di DefaultTableCellRenderer non c'è!!!

Dov'è?
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 12:30   #11
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Uomo di poca fede, se dico che c'è, c'è . Faccio un esempio:

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);
	}
}
Qui SelectionData è un tipo di oggetti creato ad hoc per mantenere un elenco di celle non selezionabili, individuate dagli indici di riga e colonna.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2007, 15:12   #12
spv42
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!!!

spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 29-01-2007, 13:05   #13
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Quote:
Originariamente inviato da PGI-Bis
Uomo di poca fede, se dico che c'è, c'è . Faccio un esempio:

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);
	}
}
Qui SelectionData è un tipo di oggetti creato ad hoc per mantenere un elenco di celle non selezionabili, individuate dagli indici di riga e colonna.

Ho provato per scrupolo, ma non funziona!
Il Focus lo acquisisce lo stesso!!!!

spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 29-01-2007, 17:01   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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;
	}
}
Volendo istruire SelectionData ad escludere le celle (0, 0) e (3, 4), lo si creerà con:

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);
	}
}
Il secondo componente che si appoggia a SelectionData è una tabella personalizzata. La personalizzazione sta in ciò che la tabella esclude la possibilità di mutare il valore di una cella non selezionabile oltre ad indicare come non selezionata una cella se ciò sia escluso da SelectionData.

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;
	}
}
Il terzo incomodo è l'oggetto che gestisce la mutazione di selezione in corrispondenza della pressione dei tasti di controllo. L'esempio contiene unicamente il trattamento del tasto "tab" ma è facile estenderlo anche alle frecce. E' un KeyListener. Gli eventi di pressione di un tasto sono propagati dalla tabella prima che essi si riflettano sui suoi due ListSelectionModel.

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() {

	}
}
La classe Main che segue mette insieme il tutto.

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);
	}
}
Ci sono delle alternative. Puoi definire un tuo ListSelectionModel (ne servono due, uno per le righe e uno per le colonne). Personalmente ritengo più semplice intervenire "dall'esterno", manipolando l'input, anzichè dall'interno, sostituendo in toto il modello di selezione della tabella. La questione della semplicità è tuttavia sempre personale e opinabile.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v