Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-01-2007, 19:10   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[Java, banale] "flashare" una tab

esiste (in Swing) qualche modo per attirare l'attenzione dell'utente su una particolare tab di un controllo JTabbedPane? la tab è disattivata (ovvero, quella attiva è un'altra) e vorrei farla flashare per indicare all'utente che deve attivarla e vedere che succede lì dentro

considerate che le etichette delle tab sono molto grosse nel mio programma perché non contengono testo ma icone da 64x64 (immagini in PNG con parti trasparenti tra l'altro), quindi flashandole richiamano l'attenzione a sufficienza.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2007, 22:51   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Messa lì tanto per dire si tratta di scambiare periodicamente il colore della linguetta con setBackgroundAt di JTabbedPane.

Per un bel po' di ragioni, tuttavia, la cosa è uno zinzinello più articolata. Non ultimo il fatto che, manco a farlo apposta, devi usare i Thread.

Diciamo che dato un JTabbedPane T e un componente C inserito in quel JTabbedPane vuoi illuminarne l'etichetta finchè l'utente non ci clicca sopra. Potremmo dire una cosa tipo:

TabFlasher flasher = new TabFlasher(T, C);
flasher.start();

Il codice che riciclo è quasi così.

private TabFlasherRegistry flasherRegistry = new TabFlasherRegistry();

//quando vuoi illuminare una tab
flasherRegistry.newTabFlasher(T, C).start();

Lo scopo del registro è quello di poter invocare il suo metodo dispose();

flasherRegistry.dispose();

quando si chiude l'applicazione. Internamente, dispose() altro non fa che fermare tutti i TabFlasher ancora attivi.

TabFlasherRegistry.java
Codice:
package it.tukano.miniwrite.components;

import java.awt.Component;
import java.util.*;
import javax.swing.JTabbedPane;

/** Registro di TabFlasher. */
public class TabFlasherRegistry implements TabFlasher.TabFlasherNotifiable {
	private final List<TabFlasher> FLASHERS =
		Collections.synchronizedList(new ArrayList<TabFlasher>());

	/** Crea e restituisce un nuovo TabFlasher. Il TabFlasher creato è
	applicato alla linguetta del componente tabComponent in tabPane. */
	public TabFlasher newTabFlasher(JTabbedPane tabPane, Component tabComponent) {
		TabFlasher flasher = new TabFlasher(this, tabPane, tabComponent);
		FLASHERS.add(flasher);
		return flasher;
	}

	/** Termina tutti i TabFlasher creati da questo TabFlasher */
	public void dispose() {
		for(int i = 0; i < FLASHERS.size(); i++) {
			FLASHERS.get(i).stop();
		}
		FLASHERS.clear();
	}

	/** @inheritDoc */
	public void notifyTabFlasherStop(TabFlasher f) {
		FLASHERS.remove(f);
	}
}
TabFlasher.java
Codice:
package it.tukano.miniwrite.components;

import java.beans.*;
import java.awt.Component;
import java.awt.Color;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/** Illumina una linguetta di un JTabbedPane. La linguetta è quella
corrispondente ad un certo Component, contenuto nel JTabbedPane. L'illuminazione
si interrompe o per diretta invocazione del metodo stop() o per rimozione
del Component bersaglio dall'albero di visualizzazione o per selezione
della linguetta associata al Component o per rimozione del Component dal
JTabbedPane. */
public class TabFlasher implements Runnable, ActionListener, ChangeListener, PropertyChangeListener {
	/** Interfaccia concretizzata da chi voglia ricevere una notifica
	dell'avvenuta interruzione di questo TabFlasher */
	public static interface TabFlasherNotifiable {

		/** L'oggetto riceve una notifica di interruzione
		del compito del TabFlasher in argomento */
		void notifyTabFlasherStop(TabFlasher t);
	};

	/** Colore di illuminazione usato dai TabFlasher. Questo
	colore è periodicamente scambiato con "null" e applicato
	alla linguetta bersaglio nel JTabbedPane. */
	private static final Color HIGHLIGHT_COLOR = new Color(
		UIManager.getLookAndFeelDefaults().getColor("TabbedPane.selected").getRGB());

	/** JTabbedPane che contiene il componente TAB_COMPONENT la cui
	linguetta sarà illuminata periodicamente */
	private final JTabbedPane TABBED_PANE;

	/** Componente la cui linguetta deve essere periodicamente
	illuminata */
	private final Component TAB_COMPONENT;

	/** Timer Swing per l'applicazione alternata del
	colore di sfondo per la linguetta bersaglio */
	private final Timer TIMER = new Timer(250, this);

	/** Oggetto interessato a ricevere una notifica di interruzione
	del lavoro di questo TabFlasher (Unicast Event Listener) */
	private final TabFlasherNotifiable NOTIFIABLE;

	/** Colore di sfondo corrente. Valore letto e scritto unicamente
	dall'AWT Event Dispatcher Thread. */
	private Color currentBackground;

	/** Crea un TabFlasher per il JTabbedPane tabbedPane.
	@param notifiable, oggetto interessato a ricevere una notifica di
	interruzione dell'illuminazione. Può essere null.
	@param tabbedPane, JTabbedPane che contiene la linguetta da
	illuminare.
	@param tabComponent, Componente contenuto nel JTabbedPane la cui
	linguetta corrispondente sarà illuminata. */
	public TabFlasher(TabFlasherNotifiable notifiable, JTabbedPane tabbedPane, Component tabComponent) {
		TABBED_PANE = tabbedPane;
		TAB_COMPONENT = tabComponent;
		TABBED_PANE.addChangeListener(this);
		TAB_COMPONENT.addPropertyChangeListener(this);
		NOTIFIABLE = notifiable;
	}

	/** Periodicamente invocato dal Timer Swing */
	public void actionPerformed(ActionEvent e) {
			highlight();
	}

	/** Ferma lo scambio dei colori se il JTabbedPane fornito
	in costruzione, a cui questo TabFlasher è connesso come
	PropertyChangeListener, notifichi una mutazione di stato
	derivante dalla perdità di connessione all'albero di
	visualizzazione */
	public void propertyChange(PropertyChangeEvent e) {
		if(e.getPropertyName().equals("ancestor") && e.getNewValue() == null) {
			System.out.println("Stopped");
			stop();
		}
	}

	/** Ferma lo scambio dei colori se il JTabbedPane fornito
	in costruzione, a cui questo TabFlasher è connesso come
	ChangeListener, notifichi una mutazione di stato comportante
	la rimozione del componente bersaglio o l'avvenuta selezione
	della linguetta del componente bersaglio. */
	public void stateChanged(ChangeEvent e) {
		int tabComponentIndex = TABBED_PANE.indexOfComponent(TAB_COMPONENT);
		if(tabComponentIndex < 0 || tabComponentIndex == TABBED_PANE.getSelectedIndex()) {
			stop();
		}
	}

	/** Ferma lo scambio dei colori. Se è stato fornito
	un TabFlasherNotifiable in costruzione, notifica a quel
	TabFlasherNotifiable l'interruzione invocando il suo
	metodo notifyTabFlasherStop, passando questo TabFlasher
	come parametro dell'invocazione. */
	public void stop() {
		TIMER.stop();
		if(NOTIFIABLE != null) {
			NOTIFIABLE.notifyTabFlasherStop(this);
		}
		SwingUtilities.invokeLater(this);
	}

	/** Avvia lo scambio dei colori di sfondo
	per l'etichetta del componente bersaglio */
	public TabFlasher start() {
		TIMER.start();
		return this;
	}

	/** Applica il colore di sfondo corrente alla linguetta del componente
	bersaglio. Se la linguetta selezionata nel JTabbedPane è quella del
	componente bersaglio o il componente bersaglio è stato eliminato, ferma
	tutto. */
	public void highlight() {
		Component selectedComponent = TABBED_PANE.getSelectedComponent();
		int targetTabIndex = TABBED_PANE.indexOfComponent(TAB_COMPONENT);
		boolean targetSelected = TABBED_PANE.getSelectedIndex() == targetTabIndex;
		if(targetSelected || targetTabIndex < 0) {
			stop();
		} else {
			TABBED_PANE.setBackgroundAt(targetTabIndex, switchColor());
		}
	}

	/** Scambia il colore di background tra null e HIGHLIGHT_COLOR */
	public Color switchColor() {
		return currentBackground = currentBackground == null ? HIGHLIGHT_COLOR : null;
	}

	/** Operazioni Swing da eseguire al termine di questo TabFlasher */
	public void run() {
		int targetTabIndex = TABBED_PANE.indexOfComponent(TAB_COMPONENT);
		if(targetTabIndex >= 0) {
			TABBED_PANE.setBackgroundAt(targetTabIndex, null);
		}
		TAB_COMPONENT.removePropertyChangeListener(this);
		TABBED_PANE.removeChangeListener(this);
	}
}
Si nota che a me delle 80 colonne non m'è mai fregato niente?
__________________
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 20-01-2007, 23:20   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
setBackgroundAt! ecco la chiave.
non vorrei che sembrasse che in tal modo me ne frego di tutto il papiro che hai scritto però: ti ringrazio dell'interessamento.

mi complimento, le classi che hai scritto mi sembrano veramente esaustive. inoltre vedo all'opera il tuo stile di scrittura
sinceramente non concordo col documentare il codice a quel livello di dettaglio... io riesco ad essere molto più produttivo tentando di scrivere codice autoesplicativo, e nel mio concetto di produttività rientra anche la riduzione dei bug al giorno e la velocità nella correzione dei bug presenti

però penso anche che ognuno faccia meglio con la propria metodologia, se non altro per questioni "religiose".

PS: per quanto riguarda le 80 colonne, a me frega talmente tanto che nel formatter di Eclipse ho impostato un valore assurdo per il wrapping delle linee, tipo un milione...

e ora scopro che esiste un valore di default percui il formatter non wrappa le linee

...

esiste?
tipo -1 che fa?

Ultima modifica di 71104 : 20-01-2007 alle 23:23.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2007, 23:32   #4
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Non ho letto tutto il papiello, ma dovresti non utilizzare il metodo stop di Thread, è un tantinello deprecato :P
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2007, 23:36   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Sei sicuro che il mio stop() sia sbagliato? Sicuro sicuro? La accendiamo?
__________________
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 20-01-2007, 23:41   #6
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Quote:
Originariamente inviato da PGI-Bis
Sei sicuro che il mio stop() sia sbagliato? Sicuro sicuro? La accendiamo?
no spegnamola, visto che ora ho letto il tuo codice, e stop lo chiami sul timer e non sul thread, dunque di conseguenza non è valido ciò che dicevo prima :P
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
Stop Killing Games: Ross Scott convince ...
Annunciata la tuta di volo di Vast che s...
Vast presenta il nuovo Large Docking Ada...
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: 16:41.


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