Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-05-2008, 15:09   #1
arthurgp
Member
 
Iscritto dal: Dec 2007
Messaggi: 60
[Java] Problema con JScrollPane con Canvas

Ciao a tutti,

ho un piccolo problemino riguardante la visualizzazione delle scrollBar con Java. Vi spiego la situazione:
ho un cavas nel quale eseguo un disegno , che deve avere la possibilità di essere zoomato, questo canvas viene inserito in un JScrollPane il quale a sua volta è contenuto in un pannello. Il problema è che non vengono visualizzate la barre di scrorrimento quando il canvas è piu grande della finestra..

Ecco il codice (solo quello utile)
CLASSE FRAME:

canvas=new DBCanvas();
canvas.setBackground(Color.WHITE);
canvas.setLayout( new FlowLayout());
canvasScrollPane = new JScrollPane();
canvasScrollPane.add(canvas);

inoltre nella classe DBCanvas nel metodo paint() viene disegnato un grafico..

Qualcuno sa darmi qualche consiglio ??


Grazie giulio
__________________
"Commputer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice."

Larry O’Brien & Bruce Eckel
arthurgp è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 10:36   #2
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Penso che nel canvas tu debba reimplementare getPreferredSize(),
altrimenti lo scrollpane non puo' conoscere la dimensione del pannello
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 11:46   #3
arthurgp
Member
 
Iscritto dal: Dec 2007
Messaggi: 60
Ho provato a reinplementere il metodo ma non funziona.

Ho già provato anche a inserire il classico ScrollPane della libreria AWT, ma non risulta adatto alla mia situazione perchè ho tutti componenti Swing che nonn si comportano in modo corretto durante la visualizzazione.

Qualcuno ha qualche idea, anche che non sia strettamante legata alle scrollBar per esempio nello spostare il canvas..?
__________________
"Commputer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice."

Larry O’Brien & Bruce Eckel
arthurgp è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 12:03   #4
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Sicuro che getPreferredSize() ritorni le dim. giuste?

Prova anche con getSize() o getMinimumSize()
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 12:08   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da arthurgp Guarda i messaggi
Qualcuno ha qualche idea, anche che non sia strettamante legata alle scrollBar per esempio nello spostare il canvas..?
Butto lì quello che mi passa in mente:

1) invece di usare la classe Canvas potresti usare un JPanel dentro un JScrollPane: JPanel espone più metodi del Canvas e magari trovi quello che fa per te. Però se non ho capito male tu vorresti le scroll bar per navigare nell'area completa di visualizzazione del canvas/jpanel che ovviamente "virtualmente" si dovrebbe ridimensionare rispetto al valore corrente di zoom utlizzato rispetto ad un valore base di riferimento (cioè la tua vista a zoom = 100%).
Questo perchè lo JScrollPane deve poter valutare le dimensioni dell'oggetto che contiene per decidere come saranno le barre di scorrimento...
Quindi dovresti legare il valore di zoom ad un ridimensionamento dinamico del componente in cui disegni, se non ho capito male.

2) invece delle barre di scorrimento, potresti attaccare un MouseMotionListener alla tua classe che implementa/estende il Canvas/JPanel in cui disegni.
Puoi fare in modo che quando l'utente esegue un "drag" con un pulsante del mouse a tua scelta tu trasli in maniera equivalente il sistema di coordinate in cui disegni. In pratica implementi una funzione di "pan" che permette all'utente di scorrere la vista come vuole.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2008, 20:23   #6
arthurgp
Member
 
Iscritto dal: Dec 2007
Messaggi: 60
con i metodi che riguardano le dimensioni ho fatto tutte le prove possibili,
ma non ho risolto nulla...

No mi sembra male nemmeno la possibilità di ispezionare il Canvas (Che per problemi di progetto non posso sostituire con un pannello) con l'operazione di drag , ora sto facendo delle prove e sto iniziando a vedere dei miglioramenti ma non mi è molto chiaro come lavorare con questi spostamenti...

Sapete darmi qualche indicazione in modo tale da fare delle prove ?
__________________
"Commputer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice."

Larry O’Brien & Bruce Eckel
arthurgp è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 09:42   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da arthurgp Guarda i messaggi
Sapete darmi qualche indicazione in modo tale da fare delle prove ?
Pronti:

- questa è la tua classe dove disegni:
File MyCanvas.java
Codice:
public class MyCanvas extends Canvas
{
   //membri della classe
   //bla bla bla...

   // costruttore: agganciarsi al listener desiderato
   public MyCanvas()
   {
       ....
       // creo il listener per il mouse e lo registro a questo componente
       CanvasMouseAdapter mouseManager = new CanvasMouseAdapter(this);
       addMouseListener(mouseManager );
       addMouseMotionListener(mouseManager );
   }

   //metodi pubblic/privati vari ed eventuali
   public myUsefulMethodOne(...){...}
   public myUsefulMethodTwo(...){...}

   // override del metodo paint
   public void paint(Graphics g)
   {
      super.paint(g)
      
      // cast Graphics to Graphics2D
      Graphics2D g2D = (Graphisc2D) g;

      // IMPORTANTE: save the affineTransform in the Graphics object
      AfineTransform originalAT = g2D.getTransform();
      
      // Transforming...
      // Rendering...

      // IMPORTANT: restore the original affineTransform in the Graphics
      g2D.setTransform(originalAT);
   }
}

/**
 * con questo MouseAdapter implementiamo solo un sistema per intercettare un "drag" del mouse.
 */
class CanvasMouseAdapter extends MouseAdapter
{
     MyCanvas canvas;
     boolean dragging = false;
     Point draggingStart;        // punto di partenza evento Dragging
     
     public CanvasMouseAdapter(MyCanvas canvas)
     {
         this.canvas = canvas;
     }

     // override dei metodi che ti interessano, per il drag è una gestione combinata di:
     // + mousePressed (un pulsante del mouse è stato premuto)
     // + mouseDragged (il puntatore del mouse si sta mouvendo mentre un pulsante viene tenuto premuto)
     // + mouseReleased (un pulsante del mouse è stato rilasciato)

     public void mousePressed(MouseEvent e)
     {
         // vogliamo eseguire il drag quando l'utente trascina col tasto destro
         if (e.getModifiers() == MouseEvent.BUTTON3_MASK)
         {
              dragging = true;
              Point ptCliccato = e.getPoint();
              draggingStart = ptCliccato;
         }
     }

     public void mouseDragged(MouseEvent e)
     {
          // il puntatore del mouse si sta mouvendo con un pulsante premuto, 
          // è il pulsante destro allora stiamo intercettando l'evento che ci interessa
          if (dragging )
          {
               Point p = e.getPoint
               int deltaX = p.x - draggingStart.x;
               int deltaY = p.y - draggingStart.y;
               // calcolati i valori di deltaX/deltaY, vanno passati al Canvas in modo che questo li possa utilizzare
               // internamente per eseguire una traslazione (vedi class AffineTransform, e sue relazioni con Graphics2D)
               draggingStart = p;
          }
     }

     public void mouseReleased(MouseEvent e)
     {
         dragging = false;
     }
}
Si tratta quindi di:
> creare un MouseAdapter che gestisca il "drag" del mouse nel componente a cui sarà agganciato;
> durante il "drag" calcolare il valore deltaX e deltaY dello spostamento catturato;
> passare questi valori al Componente a cui si è registrato il Listener del mouse;
|
> questo Componente userà questi valori per istanziare un'AffineTransform appropriata che esprima la traslazione
> questa AffineTransform verrà utilizzata dal Graphics2D al posto di quella originale;

oppure

> questo Componente userà questi valori per eseguire l'opportuna trasformazione (.translate) dirattamente sull'oggetto Graphics2D

Spero che come spunto iniziale ti basti; ti lascio il piacere di investigare ulteriormente sulle classi Graphics-Graphics2D-AffineTransform.
Inoltre consiglio la lettura di questo: Painting in AWT and Swing

P.S.: scusami eventuali errori: ho scritto il codice di getto e direttamente dell'editor del post del Forum, non in un IDE, quindi posso aver commesso errori di sintassi/vaccate varie.

P.P.S.: nota che non ho implementato tutto quello che ti servirà, ma solo il neccsario per mostrare come legare il MouseListener al Componente su cui disegni, e un abbozzo iniziale di gestione del "drag".
Manca completamente come gestirai lo Zoom. (Graphics2D.scale).
Manca anche la gestione delle coordinate, cioè Screen Space / User Space.
Nota che nei metodi del MouseAdapter le coordinate del punto restituito dal MouseEvent sono sempre in Screen Space, cioè "al netto" di eventuali trasformazioni: se e quando ti sarà neccessiario rimapparle in User Space butta un occhio alla classe AffineTransform, il suo metodo statico AffineTransform.createInverse() e il suo metodo .transform() in particolare ti potranno essere utili.

P.P.(eccheppalle )P.S.:
il sistema di coordinate in Screen Space che trovi nel Graphics di un Component è mappato così:
- l'origine è alto a sinistra (0,0)
- l'asse delle ascisse si estende con verso positivo verso destra, a partire da X0 fino all'infinito, visibile nel Component è fino a X = Component.getWidth()
- l'asse delle ordinate sis estende con verso positivo verso il basso, a partire da Y0 fino all'infinito, visibile nel Component è fino a Y = Component.getHeight().

Ciao

Ultima modifica di banryu79 : 23-05-2008 alle 10:44.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 12:09   #8
arthurgp
Member
 
Iscritto dal: Dec 2007
Messaggi: 60
Innanzitutto grazie ... ho fatto dei tentativi e non mi sembra male come soluzione... io l'ho applicata, in modo tale da potere fare scorrere il canvas e funziona ma ci sono alcuni bachi..
Se ho degli altri oggetti nel frame , il canvas si va a sovrapporre a questi oggetti...
Credo che il problema sia per il fatto che il canvas sia un componente awt, per cio piu "pesante" degli altri oggetti swing...
Come mi devo comportare ?

Inoltre come posso fare per mettere delle condizioni in modo tale che quando il canvas non c'è non deve essere validato il trascinamento....




Vi posto il mio codice, perchè potrebbe essere che ci sianco anche errori che magari non riesco a capire..
....
__________________
"Commputer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice."

Larry O’Brien & Bruce Eckel

Ultima modifica di arthurgp : 23-05-2008 alle 12:56.
arthurgp è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 12:35   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Appena ho tempo guardo il tuo codice, ora devo scappare, però la prossima volta mettilo tra i tag "["CODE"]""["/CODE"]" (senza le virgolette), almeno è leggibile (puoi sempre editare il post).

Ciao
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 12:55   #10
arthurgp
Member
 
Iscritto dal: Dec 2007
Messaggi: 60
ok chiedo scusa..



Codice:
//classe evento
public class list implements MouseListener,MouseMotionListener {

Canvas dd=null;
JScrollPane scroll=null;
public list(Canvas a,JScrollPane ppp)
{
dd=a;
scroll=ppp;
}
boolean dragging = false;
Point draggingStart; // punto di partenza evento Dragging


// override dei metodi che ti interessano, per il drag è una gestione combinata di:
// + mousePressed (un pulsante del mouse è stato premuto)
// + mouseDragged (il puntatore del mouse si sta mouvendo mentre un pulsante viene tenuto premuto)
// + mouseReleased (un pulsante del mouse è stato rilasciato)

public void mousePressed(MouseEvent e)
{

dragging = true;
Point ptCliccato = e.getPoint();
draggingStart = ptCliccato;

}

public void mouseDragged(MouseEvent e)
{
// il puntatore del mouse si sta mouvendo con un pulsante premuto, 
// è il pulsante destro allora stiamo intercettando l'evento che ci interessa
if (dragging )
{
Point p = e.getPoint();
int deltaX = p.x - draggingStart.x;
int deltaY = p.y - draggingStart.y;
// calcolati i valori di deltaX/deltaY, vanno passati al Canvas in modo che questo li possa utilizzare
// internamente per eseguire una traslazione (vedi class AffineTransform, e sue relazioni con Graphics2D)
draggingStart = p;



Point viewPosition = scroll.getViewport().getViewPosition();

viewPosition.y=viewPosition.y-deltaY;
viewPosition.x=viewPosition.x-deltaX;
scroll.getViewport().setViewPosition(viewPosition);
System.out.println(viewPosition.toString());
scroll.revalidate();
}
}

public void mouseReleased(MouseEvent e)
{
dd.repaint();
dragging = false;
}


//classe Jframe

public class aaa extends JFrame {
JScrollPane pane=null;
boolean valore=false;
public aaa()
{

Canvas a=new Canvas(){
/**
* 
* Draw the tree in canvas
*/
public void paint(Graphics g)
{ 
if(valore){
g.setColor(Color.black);
g.fillOval(100, 100,200, 200);
g.setColor(Color.red);
g.drawLine(0, 0, 500, 500);

g.draw3DRect(1, 1, 20, 20, false);
}
}
public Dimension getPreferredSize()
{
return new Dimension(600,600);
}
};

pane=new JScrollPane(a);
pane.setLayout(new ScrollPaneLayout());
list listener=new list(a,pane);
a.addMouseMotionListener(listener);
a.addMouseListener(listener);
JButton bottone=new JButton("inizia");
bottone.addActionListener(new ActionListener(){


public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
valore=true;
repaint();
}

});
this.setLayout(new BorderLayout());
this.add(bottone,BorderLayout.NORTH);
this.add(pane,BorderLayout.CENTER);
this.setSize(200,200);
repaint();
}

}
__________________
"Commputer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice."

Larry O’Brien & Bruce Eckel
arthurgp è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 14:49   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Innanzitutto grazie ... ho fatto dei tentativi e non mi sembra male come soluzione... io l'ho applicata, in modo tale da potere fare scorrere il canvas e funziona ma ci sono alcuni bachi..
Se ho degli altri oggetti nel frame , il canvas si va a sovrapporre a questi oggetti...
Credo che il problema sia per il fatto che il canvas sia un componente awt, per cio piu "pesante" degli altri oggetti swing...
Come mi devo comportare ?
Devi sostituire java.awt.Canvas con java.swing.JPanel
Perchè non puoi usare JPanel? E' la versione ligthweight in Swing di Canvas.

Quote:
Inoltre come posso fare per mettere delle condizioni in modo tale che quando il canvas non c'è non deve essere validato il trascinamento....
Ma il Canvas dove disegni non è sempre presente?
Comunque, ti basta gestire una variabile boolean e aggiungere due metodi: uno per registrare i mouse listener al canvas, e uno per deregistrarli.

Quando la variabile cambia di stato, a seconda del valore chiami il metodo opportuno, in un caso registrando il listener (canvas.addMouseListener(myListener) e canvas.addMouseMotionListener(myListener)) e nell'altro deregistrandolo (canvas.removeMouseListener() e remove.mouseMotionListener).

Dai un occhio ai Javadoc per la class Component
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2008, 15:38   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
EDIT:
una buona lettura su JPanel: How to Use Panels (from Sun Java Tutorials)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
Spotify introduce 'Taste Profile': il co...
Sole e pioggia insieme: il nuovo pannell...
AWS e Cerebras uniscono le forze: nuova ...
Windows 11: accesso al drive C: bloccato...
BYD pronta a comprare un marchio storico...
Windows 11 si prepara ai monitor oltre i...
Apple avrebbe fissato un target di vendi...
Ultimi giorni per sfruttare le Offerte d...
I migliori smartphone in offerta ora su ...
Le migliori TV delle Offerte di Primaver...
Uno dei robot più avanzati del 2025 crol...
Robot aspirapolvere con stazione automat...
Il nuovo top di gamma compatto di OPPO n...
Nilox aggiorna la sua gamma di fat e-bik...
Meta valuta tagli fino al 20% della forz...
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: 03:23.


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