View Full Version : [JAVA] Utilizzo delle scrollbar - Swing
Ciao qualcuno sa dirmi come posso realizzare le scrollbar con java?
Sto realizzando una applicazione che crea e visualizza un grafo in una finestra ma il grafo è troppo grande...
Qui di seguito riporto la parte del codice errato della mia applicazione, mi dite dov'è l'errore?
...
JFrame finestraGrafo = new JFrame("Grafo parziale"); //Questo crea il JFrame in cui voglio sia visualizzato un grafo.
Canvas area =new grafico(nodi,matriceGrafo); //Questo disegna il grafo mediante la classe grafico che estende Canvas
JScrollPane scroll= new JScrollPane(area); //Qui creo le scrollbar e le applico al grafo.
scroll.setPreferredSize(new Dimension(300, 250)); //Qui definisco una dimensione (giusto per provare a vedere le scrollbar)
finestraGrafo.setContentPane(scroll); //Ed inserisco le scrollbar all'interno del JFrame
finestraGrafo.pack();
finestraGrafo.setVisible(true);
...
class grafico extends Canvas{ //Così ho definito la classe grafico che estende Canvas
...
public grafico(Vector v,boolean m[][]){ //Il costruttore prende il vettore dei nodi e la matrice di incidenza e con il metodo paint disegna.
...
Datemi una mano per favore è da due giorni che non riesco ad andare avanti,il grafo viene disegnato correttamente...ma nienete scrollbar!
Grazie a tutti!
Penso che dovresti impostare la dimensione del componente che inserisci nel JScrollPane; ad esempio quando disegni il grafo dovresti impostare la dimensione del Canvas in base al disegno effettuato; se tale dimensione sarà minore dello spazio visualizzato dal JScrollPane allora le barre appariranno.
Ho impostato le dimensioni del canvas ma non va ancora, adesso le scrollbar restano ai lati del canvas e non ai lati del jframe.
Ad esempio appena apro l'applicazione la dimensione della finestra è troppo piccola ma non si vedono le scrollbar, se allargo la finestra orizzontalmente oltre la dimensione del canvas compare la scrollbar verticale scorrendo giu tramite la scrollbar verticale fino ai limiti del canvas si trova la scrollbar orizzontale!
Altri suggerimenti?
Grazie!
Al posto di JScrollPane metti ScrollPane ;)
Comunque non è una buona pratica mischiare componenti swing e componenti awt, ti consiglio di usare solo swing
E' proprio per quello che nn funziona il programma..;)
JScrollPane e' swing, ScrollPane e' awt... poi magari si puo risolvere in qualche altro modo, magari con dei casting..
Ma e' sempre meglio nn mischiare awt e swing..
Ciao ;9
Bhe, ma visto ceh gli altri componenti sono tutti swing, io direi di utilizzare un JPanel al posto del canvas
finestraGrafo.setContentPane(scroll);
Forse sbagli proprio qui... Prova cambiando questa riga in questo modo:
finestraGrafo.getContentPane().add(scroll,BorderLayout.CENTER);
Penso che non devi modificare il ContentPane ma devi aggiungere ad esso l'oggetto JScrollPane che al suo interno ha l'oggetto area.
Cosi dovrebbe funzionare... prova
Funziona!!! Grazie mille, il problema delle scrollbar è risolto. Però ho delle altre domande!
1)Siccome non è una buona cosa mischiare swing e awt esistono dei metodi swing che sostituiscono MouseListener e MouseMotionListener(che si trovano in java.awt.event.*) ? Lo stesso vale per i metodi che disegnano ellissi rettangoli ecc.(che si trovano in java.awt.geom.*)
2)Non riesco a settare lo sfondo dell'oggetto che estende JPanel. Ho provato ad inserire la riga "this.setBackground(Color.white);" nel suo costruttore, il programma viene compilato correttamente ma lo sfondo rimane grigio.
3)A volte quando effettuo lo scroll con le scrollbar o quando un altra finestra si sovrappone al JPanel contenente il grafo, il contenuto della finestra si rovina (si risistema solo quando ridimensiono la finestra)come posso fare per evitarlo?
I mouse listener puoi usarli benissimo, sono i componenti grafici che non andrebbero miskiati. Per disegnare stai usando un JPanel o ancora il canvas? Il problema della finestra sporcata dovrebbe essere automaticamente gestito da java, almeno se effettui il disegno col il metodo paintComponent che java chiama automaticamente quando c'è da ridisegnare il contentuo di un componente, almeno io nn ho problemi di questo tipo
Sto utilizzando JPanel ma il metodo che uso è paint(),devo usare paintComponent al posto di paint?
Ma stai facendo l'esame di Ingegneria del Software?
Si devi usare paintComponent, come diceva anx721 Java richiama in automatico questo metodo quando si tratta di ridisegnare un interfaccia.
ti riporto un esempio di una classe che estende JPanel e modifica il colore di sfondo.
Anche se qui sono un po rozzo nel fare la cosa.
Io l'avevo fatta cosi perchè dovevo fare uno sfondo sfumato... prendi spunto da qui:
import java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
public class Panel extends javax.swing.JPanel {
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setPaint (new java.awt.GradientPaint(0,0,new Color(4, 64, 151),0,getSize().height,new Color(66, 129, 191)));
g2.fillRect(0, 0, size().width, size().height);
g2.setPaint(new Color(237, 109, 70));
g2.drawLine(0,(int)size().getHeight()-1,(int)size().getWidth(),(int)size().getHeight()-1);
g2.drawLine(0,0,(int)size().getWidth(),0);
}
public Panel(XYLayout xYLayout) {
super(xYLayout);
}
public Panel() {
}
}
No, si tratta del progetto di "reti di calcolatori" ho provato a sostituire paintComponent al posto di paint ma non va lo stesso, inoltre non riesco ad "attivare" il colore di background del JPanel.
Altri suggerimenti?
Grazie!
ps:
Queste a cosa servono?
public Panel(XYLayout xYLayout) {
super(xYLayout);
}
public Panel() {
}
bada che devi usare il metodo
public void paintComponent(Graphics g)
che versione di java usi? (java -version)
Io ora sto facendo reti di calcolatori, di quale università sei?
Non ricordo che versione di java ho usato mi pare 1.4, ma ora so che uscita la 1.5 e c'è di tutto li miliardi di cose nuove.
public Panel(XYLayout xYLayout) {
super(xYLayout);
}
Questo è l'estensione di un costruttore della classe, che semplicemente richiama il costruttore della classe estesa e gli passa il layout, a me serviva per settare come layout il borderlayout mi pare, ora non ricordo e un prog vecchio che ho fatto.
L'altro e un costruttore di semplice.
Cmq tu questo devi fare:
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setPaint (new java.awt.GradientPaint(0,0,new Color(4, 64, 151),0,getSize().height,new Color(66, 129, 191)));
g2.fillRect(0, 0, size().width, size().height);
g2.setPaint(new Color(237, 109, 70));
g2.drawLine(0,(int)size().getHeight()-1,(int)size().getWidth(),(int)size().getHeight()-1);
g2.drawLine(0,0,(int)size().getWidth(),0);
}
Studio a Roma, sto facendo anche il progetto di "ingegneria del software" in quello sono bloccato perchè il maledetto Tomcat 5.0 non vuole partire sul mio PC (e perchè non so come si realizzano le sessioni all'interno delle JSP)!
Tornando al problema delle scrollbar, scrivo la parte del codice, magari qualcuno di voi guardandola riesce a capire dov'è l'errore, grazie in ogni caso per l'aiuto che mi avete dato fin qui!
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
...
class grafo extends Thread{
...
private void disegnaGrafo(){
JFrame finestraGrafo = new JFrame("Grafo parziale");
JPanel area =new grafico(nodi,matriceGrafo);
JScrollPane scroll = new JScrollPane(area);
scroll.getViewport().setPreferredSize(new Dimension(640,480));
scroll.getViewport().setBackground(Color.white);
finestraGrafo.getContentPane().add(scroll, BorderLayout.CENTER);
finestraGrafo.pack();
finestraGrafo.setVisible(true);
}
}
class grafico extends JPanel implements MouseListener,MouseMotionListener{
public grafico(Vector v,boolean m[][]){
this.setBackground(Color.white); //Perchè non funziona?
this.setForeground(fg);
setVisible(true);
enum=vettoreNodi.elements();
this.setPreferredSize(new Dimension(DX,DY));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
for (i=0;i<vettoreNodi.size();i++){
for(j=i;j<vettoreNodi.size();j++){
if (matrice[i][j]||matrice[j][i]){
n1=(nodo)vettoreNodi.get(i);
x1=(n1.getX()*Xgrid)+XBordo+(diametroNodi/2);
y1=(n1.getY()*Ygrid)+YBordo+(diametroNodi/2);
n2=(nodo)vettoreNodi.get(j);
x2=(n2.getX()*Xgrid)+XBordo+(diametroNodi/2);
y2=(n2.getY()*Ygrid)+YBordo+(diametroNodi/2);
if (x1!=x2)
g2.draw(new Line2D.Double(x1,y1,x2,y2));
else{
QuadCurve2D.Double curva = new QuadCurve2D.Double();
curva.setCurve(x1,y1,x1+(0.75*Xgrid),(y1+y2)/2,x2,y2);
g2.draw(curva);
}
}
}
}
enum=vettoreNodi.elements();
while (enum.hasMoreElements()) {
n=(nodo)enum.nextElement();
g2.setStroke(contorno);
if (n.getStato().equals("Ok")){
g2.setPaint(Color.green);
g2.fill(new Ellipse2D.Double(((n.getX())*Xgrid)+XBordo, ((n.getY())*Ygrid)+YBordo, diametroNodi, diametroNodi));
g2.setPaint(Color.black);
g2.draw(new Ellipse2D.Double(((n.getX())*Xgrid)+XBordo, ((n.getY())*Ygrid)+YBordo, diametroNodi, diametroNodi));
}else{
g2.setPaint(Color.red);
g2.fill(new Ellipse2D.Double(((n.getX())*Xgrid)+XBordo, ((n.getY())*Ygrid)+YBordo, diametroNodi, diametroNodi));
g2.setPaint(Color.black);
g2.draw(new Ellipse2D.Double(((n.getX())*Xgrid)+XBordo, ((n.getY())*Ygrid)+YBordo, diametroNodi, diametroNodi));
}
}
}
this.setPreferredSize(new Dimension(DX,DY));
DX e DY sono sono corretti? Come li imposti?
Ma il problema è sempre che non ti fa navigare dentro la finestra?
Originariamente inviato da anx721
this.setPreferredSize(new Dimension(DX,DY));
DX e DY sono sono corretti? Come li imposti?
Vedo quanto è grande il grafo (scegliendo la posizione Y del nodo più in basso, quella X del nodo più a destra).
Comunque la dimensione è corretta, le scrollbar funzionano, il problema è che quando le uso il grafo nella finestra si "sporca" (è come se le scrollbar ridisegnassero il grafo su quello già presente nella finestra senza prima cancellare il vecchio contenuto della stessa), se provo a ridimensionare anche di un millimetro la finestra tutto si vede correttamente.
E poi non riesco a settare il colore di sfondo. Nel costruttore del JPanel che uso per disegnare il grafo ho messo la linea "this.setBackground(Color.white);" ma questa non ha effetto perchè lo sfondo del grafo rimane grigio.
Ragazzi finalmente ho risolto!
Ho semplicemente esteso la classe JComponent al posto della classe JPanel e tutto funziona correttamente!
Grazie a tutti! Ciao!
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.