Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-01-2007, 20: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, 23: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 21-01-2007, 00: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 : 21-01-2007 alle 00:23.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2007, 00: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 21-01-2007, 00: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 21-01-2007, 00: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


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Oral-B iO: sconti pazzeschi su spazzolin...
Intel Core Ultra 200 Plus: l'azienda pro...
Thinking Machines: la startup di Mira Mu...
Coalizione di gruppi di tutela chiede a ...
Reprompt è l'attacco invisibile s...
Robot aspirapolvere ECOVACS DEEBOT N20 P...
Batteria a stato solido: tra tre mesi Do...
iPhone 17 Pro in forte sconto su Amazon:...
Apple Studio Display finalmente in offer...
OpenAI sfida Google e lancia ChatGPT Tra...
Attenti ai commenti LinkedIn: come ricon...
Xiaomi Redmi Note 15 al prezzo minimo ga...
REDMI Buds 8 Lite in arrivo in Italia: A...
USA: i dettagli del via libera condizion...
I nuovi REDMI Note 15 Series arrivano in...
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: 11:53.


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