|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
[Java] riscrivere listener standard
ho un problemino con un il mouselistener di default della Jslider, vorrei riscriverlo in modo da poter cambiare l'incremento che ha il cursore quando si clicca sulla slider in un punto qualsiasi (avete presente il saltino che fa) mentre volevo lasciare intatta la gestione del trascinamento del cursore. ho provato ad eliminarlo ma mi cancella ovviamente tutte e due le gestioni, nessuno sa dirmi come faccio a vedere il codice che esegue per la gestione del trascinamento così elimino il listener e ne faccio uno nuovo, spero di essere stato chiaro...
dimenticavo, io uso jbuilder quindi mi basterebbe sapere come aprire con jbuilder il codice della classe jslider in cui dovrebbe esserci quello che voglio
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io non sono un esperto di Java...ma conosci già l'intestazione della funzione che si occupa della gestione del mouse ?
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Re: [Java] riscrivere listener standard
Quote:
puoi farlo tranquillamente (i sorgenti dovrebbero essere pubblici) ma e' una porcheria, se distribuisci il tuo prodotto devi poi fare in modo che la classe che venga caricata sia la tua e non quella di default e puo' essere causa di problemi notevoli, senza contare i problemi di licenza (per sun NON hai facoltà di modificare i package standard). Suggerimento: mai sentito parlare di ereditarietà? |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Re: [Java] riscrivere listener standard
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
so cos'è l'ereditarietà ma non capisco cosa centri in questo caso, poi io non voglio modificare il package, ma solo riscrevere il mio listener in modo che contenga una parte del codice originale.
mettiamola così la classe JSlider ha 1 listener di default che gestisce sia il trascinamento che il salto, io voglio instanziare un oggetto JSlider, eliminare il suo listener standard, e crearne uno io che gestisca solo il trascinamento. Mi manca solo il codice che gestisce il trascinamento che vorrei prendere dalla classe padre JSlider, ma come faccio?
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
Quote:
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Appunto ti fai una classe che estende JSlider e ridefinisci solo il listener...
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Non ho idea di come sia fatto il listener di default della classe jslider ma non dovrebbe essere una tragedia farne uno alternativo.
Se ti serve solo il "dragger" probabilmente sei già in grado di determinare il punto relativo in cui il mouse viene premuto sulla barra. Per vedere se il mouse sta trascinando l'indicatore è sufficiente creare un Rectangle che abbia la larghezza dell'indicatore stesso (larghezza che si ottiene con il metodo getExtent() della classe JSlider) e verificare se il punto Point associato all'evento MouseDragged è compreso nell'area definita dall'indicatore. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
e' ben quello che dicevo ... :o |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
Quote:
grazie PGI proverò a fare come mi hai detto, io non avevo idea di cosa scrivere per fare il trascinamento!
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
ho appena controllato e il metodo getExtent() mi ritorna sempre 0 (perchè può muoversi ovunque) , fra l'altro ho visto che il metodo setExtent specifica fino a dove può scorrere il nodo e non quanto è largo
un'altra cosa, come si fa a modificare il valore di cui salta il nodo quando clicco sulla slider ma non sul nodo?
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
sono arrivato alla conclusione che non è per niente facile costruirsi il codice per gestire il trascinamento, almeno per il mio livello di preparazione, e soprattutto se lo si vuole fare riutilizzabile per altre slider, mi sono impiantato sul fatto che non riesco a calcolare di quante unità incrementare la slider per ogni pixel di spostamento nel caso in cui le due quantità nn siano multiple fra di loro (praticamente mai), ma mi chiedo come mai non ci siano metodi all'interno della slider per gestire graficamente il nodo! mi sembra una mancanza abbastanza grave
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
stai usando questo tipo di struttura?
public interface MouseListener { void mousePressed(MouseEvent event); void mouseReleased(MouseEvent event); void mouseClicked(MouseEvent event); void mouseEntered(MouseEvent event); void mouseExited(MouseEvent event); }
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Quote:
Mi sorge una curiosità, esattamente cosa c'è che non va nel trascinamento di default della classe JSlider? |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
Quote:
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
Quote:
Ho trovato il codice che gestisce il salto e molte altre proprietà della slider in javax.swing.plaf.basicBasicSliderUI, però non so cosa farne! mi spiego non sono ancora molto ferrato e quindi non so cosa devo fare per modificare il metodo scrollByBlock(), vorrei fare in modo di avere una classe identica a questa, così modifico il metodo, poi però dovrei dire alla mia slider di usare la mia classe modificata e non quella vecchia, ma come si fa? se avete bisogno di altre informazioni ditemelo che ve le do grazie a tutti
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Premesso che ancora non ho capito cosa vuoi fare, se vuoi modificare il metodo scrollByBlock() del l&f manager per la slider devi:
a) fare una classe che estenda BasicSliderUI con un costruttore così: MyUI(JSlider s) { super(s) } poi fai l'override del metodo scrollByBlock(), nell'esempio si sposta di metà del valore della barra (credo Codice:
public void scrollByBlock(int direction) {
synchronized(slider) {
int oldValue = slider.getValue();
int blockIncrement =
(slider.getMaximum() - slider.getMinimum()) / 2; //esempio
if (blockIncrement <= 0 &&
slider.getMaximum() > slider.getMinimum()) {
blockIncrement = 1;
}
int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
slider.setValue(oldValue + delta);
}
}
JSlider s=new JSlider(); s.setUI(new MyUI); A questo punto dovresti avere una barra estremamente "spoglia" per cui dovresti cercare di importare anche i metodi che "dipingono" gli oggetti secondo il lookandfeel corrente oppure settare il lookandfeel su "basiclookand feel". Ciao. Dimenticavo, per la faccenda del pixel probabilmente parliamo di due cose diverse, perchè che una barra di scorrimento non possa essere spostata di pixel ma solo di unità di valore, tramite accesso esterno, è certo. Se vuoi spostare l'indicatore di 1 pixel devi avere accesso diretto all'oggetto Graphics del componente cosa che è possible solo "riscrivendo" l'immagine della barra di scorrimento. Ari-ciao. |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Megalomania, mi rispondo da solo!
Se ti interessa solo spostare la barra al click del mouse di un valore a piacere potrebbe essere più semplice aggiungere un mouse listener che al click determini se il punto è a destra o a sinistra dell'indicatore e sposti la barra di un tot in quella direzione.
Codice:
public void mouseClicked(MouseEvent m) {
Point p=m.getPoint();
Rectangle r=target.getBounds();
p.y+=r.y;
if(target.getBounds().contains(p)) {
double l=r.getWidth();
double pc=target.getValue()*100/target.getMaximum();
double lA=target.getWidth()*pc/100;
Rectangle rA=new Rectangle(r.x,r.y,(int)lA,(int)r.getHeight());
if(rA.contains(p)) {
System.out.println("LEFT");
target.setValue(target.getValue()-10);
} else {
System.out.println("RIGHT");
target.setValue(target.getValue()+10);
}
}
}
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 1999
Città: Brianza
Messaggi: 374
|
hehe, a questo ci avevo già pensato e l'avevo anche già fatto ma sai cosa succedeva? che avevo 2 listener che mi intercettevano il click, quello di default che me la spostava di 1/10 più quello che hai scritto tu che me la spostava di altri 10! (se elimino quello standandard perdo il drag) è vero anche che si potrebbe farne uno uguale al tuo soltanto con i segni invertiti degli spostamenti (+10 al posto di -10 e viceversa) però non mi sembra un bel lavoro, inoltre graficamente vedi il nodo prima andare a +20 e poi tornare indietro a +10 e non è bello.
per l'altra cosa invece ho capito cosa intendi. per il fatto che ho la barra spoglia, se estendo la classe BasicSliderUI non dovrei avere tutti i sui metodi e proprietà? il fatto che è spoglia dipende solo da cosa contiene la mia classe MyUI? e se ricopio la classe intera BasicSliderUI nella mia MyUI modificando solo quel metodo non avrei una slider perfettamente uguale a una di default tranne che per quel metodo? grazie per la pazienza e per l'aiuto PS quello che voglio ottenere è semplicemente una slider che si incrementa di un blocco che voglio io, il problema ha due soluzioni: 1- elimino il listener standard, gestisco l'incremento nel mio listener, fin qui tutto ok, però poi devo riscrivere anche il dragger e altre proprietà che per me risulta abb complicato 2- modifico in qualche modo la gestione standard dell'incremento che è come mi hai spiegato tu
__________________
Trattato: Rinos, tulnio, toca1979, T0mcat, woofer, Nero81, ArvMau, civas85, hacker@70, 3l3v3n, Bobosassa, AMD_GO, Xfree, Buby84, bronzodiriace, DrossBelly. |
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Se vuoi passare per il lookandfeel devi decidere prima di visualizzare l'interfaccia che lookandfeel usare oppure gestire con un condizionale il lookandfeel corrente.
Diciamo che la tua applicazione usa solo il lookandfeel "Metal", che, essendo lo stile Java dovrebbe essere multipiattaforma per definizione e quindi il più consigliabile. All'inizio del programma (nel costruttore della classe principale ad esempio) selezioni il lookandfeel "Metal" Codice:
try {
UIManager.setLookAndFeel(new MetalLookAndFeel());
} catch(UnsupportedLookAndFeelException e) {...}
Poi estendi il lookandfeel Metal per lo slider Codice:
class MyUI extends MetalSliderUI {
MyUI() {
}
public void scrollDueToClickInTrack(int direction) {
synchronized(slider) {
//esempio
if(direction==POSITIVE_SCROLL) {
slider.setValue(slider.getValue()+5);
} else {
slider.setValue(slider.getValue()-5);
}
//***********************************************************
/* questo qua sotto è quello di default
int oldValue = slider.getValue();
int blockIncrement =
(slider.getMaximum() - slider.getMinimum()) / 2;
if (blockIncrement <= 0 &&
slider.getMaximum() > slider.getMinimum()) {
blockIncrement = 1;
}
int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
slider.setValue(oldValue + delta);*/
}
}
}
Codice:
JSlider s=new JSlider(...); s.setUI(new MyUI()); |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:12.



















