Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-02-2008, 11:31   #1
rai-p
Member
 
Iscritto dal: Nov 2005
Messaggi: 41
[Java - Swing] Problema con righe lunghe nella JTable

Salve a tutti! Sto implementando un progetto e mi trovo in una situazione particolare.
Ho una JTable dove vengono caricate delle descrizioni di lavori disponibili. Queste descrizioni sono lunghe in media 20 25 parole e quindi non entrano tutte nello spazio della colonna (mi escono le prime e poi ci sono i puntini "....") . Vorrei sapere se è possibile espandere questo testo su più righe (della stessa riga) e se qualcuno sa come posso farlo ??

Nella foto si nota che risultato ho ora. Vorrei appunto continuare il testo andando a capo e quindi evitando il troncamento del testo.


grazie a tutti anticipatamente!
__________________
MacBook Pro 13 pollici Processore 2,9 GHz Intel Core i7 Memoria 8 GB 1600 MHz DDR3 Grafica Intel HD Graphics 4000 1024 MB Software OS X 10.9.1 (13B42)

Ultima modifica di rai-p : 02-02-2008 alle 11:48.
rai-p è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 13:25   #2
rai-p
Member
 
Iscritto dal: Nov 2005
Messaggi: 41

nessuno mi può aiutare ? anche con soluzioni alternative...vi prego!
__________________
MacBook Pro 13 pollici Processore 2,9 GHz Intel Core i7 Memoria 8 GB 1600 MHz DDR3 Grafica Intel HD Graphics 4000 1024 MB Software OS X 10.9.1 (13B42)
rai-p è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 13:31   #3
isAlreadyInUse
Senior Member
 
L'Avatar di isAlreadyInUse
 
Iscritto dal: Sep 2007
Messaggi: 754
Scusa non ti basta settare la dimensione della colonna?
__________________
http://www.tevigroup.it/
isAlreadyInUse è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 13:44   #4
rai-p
Member
 
Iscritto dal: Nov 2005
Messaggi: 41
Quote:
Originariamente inviato da isAlreadyInUse Guarda i messaggi
Scusa non ti basta settare la dimensione della colonna?
poi dovrei usare lo scroll orizzontale per leggerla tutta...come ultima ipotesi sicuramente farò così!
probabilmente però quello che vorrei fare io non si può fare
__________________
MacBook Pro 13 pollici Processore 2,9 GHz Intel Core i7 Memoria 8 GB 1600 MHz DDR3 Grafica Intel HD Graphics 4000 1024 MB Software OS X 10.9.1 (13B42)
rai-p è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 13:51   #5
isAlreadyInUse
Senior Member
 
L'Avatar di isAlreadyInUse
 
Iscritto dal: Sep 2007
Messaggi: 754
metti una textArea nella cella
__________________
http://www.tevigroup.it/
isAlreadyInUse è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 14:18   #6
rai-p
Member
 
Iscritto dal: Nov 2005
Messaggi: 41
Quote:
Originariamente inviato da isAlreadyInUse Guarda i messaggi
metti una textArea nella cella
oh mamma...non c'avevo pensato!!!appena posso provo
grazie!!
__________________
MacBook Pro 13 pollici Processore 2,9 GHz Intel Core i7 Memoria 8 GB 1600 MHz DDR3 Grafica Intel HD Graphics 4000 1024 MB Software OS X 10.9.1 (13B42)
rai-p è offline   Rispondi citando il messaggio o parte di esso
Old 02-02-2008, 15:29   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' possibile e abbastanza semplice. Puoi definire un tuo TableCellRenderer che, avvalendosi di alcuni strumenti precotti in swing/awt, disegni il testo distribuendolo su più linee avendo come riferimento la larghezza della colonna.

Incollo un esempio commentato di questo TableCellRenderer.

Codice:
package it.tukano.tprenderer;

import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.text.*;
import javax.swing.table.*;
import java.util.*;

public class MultiLineTableCellRenderer extends JPanel implements TableCellRenderer {
	private Map<Point, Integer> heightMap = new HashMap<Point, Integer>();
	private ArrayList<TextLayout> textLayoutList = new ArrayList<TextLayout>();
	private String text;
	
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		/* Azzera il "buffer" dei TextLayout */
		textLayoutList.clear();
		
		/* Ricava la larghezza della colonna corrente */
		TableColumnModel tableColumnModel = table.getColumnModel();
		TableColumn tableColumn = tableColumnModel.getColumn(column);
		int columnWidth = tableColumn.getWidth();
		
		/* Se il valore è null usiamo come testo un carattere di spaziatura. Altrimenti occorre
		ammazzarsi di if perchè AttributedCharacterIterator e TextLayout non vanno d'accordo con null o
		con stringhe di lunghezza inferiore a 1 carattere. */
		text = value == null ? " " : (text = String.valueOf(value)).length() == 0 ? " " : text;
		
		/* Separiamo il testo in linee e calcoliamo nel contempo quale dev'essere l'altezza della
		riga per mostrare queste linee. */
		AttributedCharacterIterator styledText = new AttributedString(text).getIterator();
		FontRenderContext fontRenderContext = getFontRenderContext(table);
		
		/* Senza un FontRenderContext siamo in braghe di tela. */
		if(fontRenderContext != null) {
			
			/* LineBreakMeasurer è lo strumento che spezza il testo in linee usando una o
			più larghezze come limiti per la separazione dei caratteri. */
			LineBreakMeasurer lineBreakMeasurer = new LineBreakMeasurer(styledText, fontRenderContext);
			
			/* In questo "newHeight" sommeremo l'altezza delle linee di testo e, al termine del
			ciclo, verificheremo se sia diverso dall'altezza corrente della riga row. In caso
			affermativo useremo newHeight come valore di altezza per la riga row. */
			float newHeight = 0;
			
			/* LineBreakMeasurer funziona come un iteratore: man mano che gli si chiede di
			calcolare quanto testo possa essere disegnato in una certa larghezza avanza di
			carattere in carattere. */
			while(lineBreakMeasurer.getPosition() < text.length()) {
				
				/* La linea di testo che lineBreakMeasurer riesce ad "infilare" in un
				certo spazio viene restituita come TextLayout. Per disegnare effettivamente il testo
				occorre applicare questo TextLaout ad un Graphics. Noi salviamo la linea di testo
				nel buffer "textLayoutList" perchè il momento del disegno è successivo rispetto
				all'invocazione del metodo in cui ci troviamo (e passa per paintComponent). */
				TextLayout layout = lineBreakMeasurer.nextLayout(columnWidth);
				textLayoutList.add(layout);
				
				/* Sommiamo l'altezza della riga appena computata da LineBreakMeasurer all'altezza
				totale fin qui ottenuta. Alla fine newHeight sarà la somma delle altezze di tutte
				le righe computate da LineBreakMeasurer e ci dirà quanto deva essere alta la riga
				della tabella che stiamo esaminando. */
				newHeight += layout.getAscent() + layout.getDescent() + layout.getLeading();
			}
			
			/* Se l'altezza totale delle linee di testo è maggiore dall'altezza della riga corrente
			della tabella allora chiediamo alla tabella di cambiarla. L'invocazione di setRowHeight
			causa una nuova richiesta di aggiornamento grafico delle celle contenute in quella riga e,
			quindi, una seconda invocazione di questo nostro getTableCellRendererComponent. Probabilmente
			qui c'è lo spazio per una qualche ottimizzazione.*/
			int rowHeight = table.getRowHeight(row);
			if((int)newHeight > rowHeight) {
				int h = Math.round(newHeight);
				
				/* Salviamo l'altezza della riga nella mappa delle altezze. Useremo poi questa mappa
				per determinare quale sia l'altezza della riga nel caso in cui una cella perda 
				il primato di altezza. */
				heightMap.put(new Point(column, row), h);
				table.setRowHeight(row, h);
			}
			
			/* Se l'altezza è minore allora la faccenda si fa più complicata. Questa cella non è più
			quella più alta. Dobbiamo determinare quale tra le altre celle contenute nella stessa riga
			sia la nuova più alta. */
			else if((int)newHeight < rowHeight) {
				Point cell = new Point();
				cell.y = row;
				int maxHeight = table.getRowHeight();
				for(cell.x = 0; cell.x < table.getColumnCount(); cell.x++) {
					if(cell.x == column) {
						heightMap.put(cell, (int)newHeight);
					}
					Integer cellHeight = heightMap.get(cell);
					if(cellHeight == null) cellHeight = table.getRowHeight();
					maxHeight = Math.max(cellHeight, maxHeight);
				}
				if(maxHeight != rowHeight) {
					table.setRowHeight(row, maxHeight);
				}
			}
			
			/* Queste righe impostano i colori del componente MultiLineTableCellRenderer in modo
			che risulti omogeneo rispetto a quello delle altre celle di table. */
			setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
			setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
		}
		return this;
	}
	
	/* Metodo d'appoggio, estrae un FontRenderContext da un JComponent. La precondizione per
	la riuscita dell'operazione è che il componente sia proiettabile (displayable) */
	private FontRenderContext getFontRenderContext(JComponent c) {
		Graphics2D g = (Graphics2D)c.getGraphics();
		return g == null ? null : g.getFontRenderContext();
	}
	
	/* Questo è il metodo che viene invocato per disegnare concretamente il testo nella
	nostra cella. Qui noi usiamo i valori precomputati nel metodo getTableCellRendererComponent. */
	protected void paintComponent(Graphics graphics) {
		Graphics2D g = (Graphics2D)graphics;
		/* Disegna uno sfondo opaco */
		g.setPaint(getBackground());
		g.fillRect(0, 0, getWidth(), getHeight());
		
		if(text != null) {
			drawText(text, g);
		}
	}
	
	private void drawText(String vaue, Graphics2D g) {
		g.setPaint(getForeground());
		
		/* Ogni TextLayout contenuto in textLayoutList rappresenta una linea di
		testo "creata" dal LineBreakMeasurer nel metodo getTableCellRendererComponent. Qui
		disegnamo quelle linee una sotto l'altra. */
		Point2D.Float pen = new Point2D.Float();
		for(TextLayout layout : textLayoutList) {
			pen.y += layout.getAscent();
			layout.draw(g, pen.x, pen.y);
			pen.y += layout.getDescent() + layout.getLeading();
		}
	}
}
Puoi provare l'effetto con:

Codice:
package it.tukano.tprenderer;

import java.awt.*;
import javax.swing.table.*;
import javax.swing.*;

public class Main implements Runnable {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Main());
	}
	
	public void run() {
		DefaultTableModel tableModel = new DefaultTableModel(10, 5);
		JTable table = new JTable() {
			private MultiLineTableCellRenderer multiLineRenderer = new MultiLineTableCellRenderer();
			public TableCellRenderer getCellRenderer(int row, int column) {
				return multiLineRenderer;
			}
		};
		table.setModel(tableModel);
		
		JScrollPane scroller = new JScrollPane(table);
		JFrame window = new JFrame("MultiLineRenderer Test");
		window.add(scroller, BorderLayout.CENTER);
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.pack();
		window.setVisible(true);
	}
}


La mappa delle altezze dovrebbe essere aggiornata quando la tabella subisce una mutazione strutturale tale da invalidare un indice precedente - ad esempio l'inserimento di una colonna. Nel caso in cui tu voglia usare altri renderer personalizzati - ad esempio per disegnare un thumbnail senza tagliarlo - devi coordinare la gestione delle altezze di riga.
__________________
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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Il nuovo OnePlus Nord 6 è vicino al debu...
Tesla svela i risultati del Q4: conferma...
Nuova rimodulazione da Fastweb: fino a 3...
La NVIDIA RTX 5090 potrebbe presto costa...
ASUS non produrrà più smar...
CoopVoce sta per lanciare il 5G: ecco qu...
Factorial, azienda di batterie allo stat...
Le specifiche fuori di testa della Yangw...
I numeri incredibili di Xiaomi: nel 2025...
In Cina è pronto il parco fotovol...
Neuralink accelera: produzione di massa ...
Starlink abbassa l'orbita di migliaia di...
Dal MIT una nuova batteria per auto elet...
Adam Mosseri parla di IA su Instagram: l...
Suonerie personalizzate e Tone Store: il...
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: 18:24.


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