Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Inserire JScrollBar in java

    ciao a tutti ho un problema con la grafica di java non riesco a inserire delle scrollbar funzionanti per questo programma che visualizza un albero binario

    codice:
    public class BinaryTreeView extends JPanel  {
        
        // the binary tree
        private BinAlbero tree = null;
        // the node location of the tree
        private HashMap nodeLocations = null;
        // the sizes of the subtrees
        private HashMap subtreeSizes = null;
        // do we need to calculate locations
        private boolean dirty = true;
        // space between nodes
        private int parent2child = 50, child2child = 20;
        
        // helpers
        private Dimension empty = new Dimension(0, 0);
        private FontMetrics fm = null;
        
        
        JScrollBar hbar;
        private org.accada.hal.impl.sim.Tag tag;
        
        public BinaryTreeView(BinAlbero tree, org.accada.hal.impl.sim.Tag t) {
            this.tree = tree;
            this.tag = t;
            nodeLocations = new HashMap();
            subtreeSizes = new HashMap();
           //registerKeyboardAction(this, "add", KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), WHEN_IN_FOCUSED_WINDOW);
        
           JFrame f = new JFrame("Albero Binario");
           
            hbar = new JScrollBar(JScrollBar.HORIZONTAL);
           
           
           hbar.setBlockIncrement(10);
           
           
           hbar.addAdjustmentListener(new AdjustmentListener() {
         	    public void adjustmentValueChanged(AdjustmentEvent ae) {
         		// the value of scrollbar has changed
         	    	
         	     repaint();
         	    
         	    }
         	});
          
           
           
          // f.add(pane.add(hbar),BorderLayout.SOUTH);
          f.getContentPane().add(hbar, BorderLayout.NORTH);
          f.getContentPane().add(this);
          
          // repaint();
           // create and add an event handler for window closing event
       f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            
          }
       });
       		
       
       
            f.setSize(1000,1000);
          
           f.show();
       }    
        
        
        // event handler for pressing "A"
     /*   public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("add")) {
                String c = JOptionPane.showInputDialog("Add a new node:");
                if (c != null && !"".equals(c)) {
                    tree.addNode(c);
                    dirty = true;
                    repaint();
                }
            }
        }*/
        
        // calculate node locations
        private void calculateLocations() {
            nodeLocations.clear();
            subtreeSizes.clear();
            Nodo n = tree.albero[0];
            if (n != null) {
                calculateSubtreeSize(n);
                calculateLocation(n, Integer.MAX_VALUE, Integer.MAX_VALUE, 0);
            }
        }
        
        // calculate the size of a subtree rooted at n
        private Dimension calculateSubtreeSize(Nodo n) {
            if (n == null) return new Dimension(0, 0);
            int s = (n.getEtichetta());
            System.out.println(s);
            Dimension ld = calculateSubtreeSize(n.getFiglioSinistro());
            Dimension rd = calculateSubtreeSize(n.getFiglioDestro());
            int h = fm.getHeight() + parent2child + Math.max(ld.height, rd.height);
            int w = ld.width + child2child + rd.width;
            Dimension d = new Dimension(w, h);
            subtreeSizes.put(n, d);
            return d;
        }
        
        // calculate the location of the nodes in the subtree rooted at n
        private void calculateLocation(Nodo n, int left, int right, int top) {
            if (n == null) return;
            Dimension ld = (Dimension) subtreeSizes.get(n.getFiglioSinistro());
            if (ld == null) ld = empty;
            Dimension rd = (Dimension) subtreeSizes.get(n.getFiglioDestro());
            if (rd == null) rd = empty;
            int center = 0;
            if (right != Integer.MAX_VALUE)
                center = right - rd.width - child2child/2;
            else if (left != Integer.MAX_VALUE)
                center = left + ld.width + child2child/2;
            int width =fm.stringWidth(String.valueOf(n.getEtichetta()));
            Rectangle r = new Rectangle(center - width/2 - 3, top, width + 6, fm.getHeight());
            nodeLocations.put(n, r);
            calculateLocation(n.getFiglioSinistro(), Integer.MAX_VALUE, center - child2child/2, top + fm.getHeight() + parent2child);
            calculateLocation(n.getFiglioDestro(), center + child2child/2, Integer.MAX_VALUE, top + fm.getHeight() + parent2child);
        }
        
        // draw the tree using the pre-calculated locations
        private void drawTree(Graphics2D g, Nodo n, int px, int py, int yoffs,int j,Color c) {
            if (n == null) return;
            g.setColor(c);
            Rectangle r = (Rectangle) nodeLocations.get(n);
            g.draw(r);
            g.drawString(String.valueOf(n.getEtichetta()), r.x + 3, r.y + yoffs);
            if (px != Integer.MAX_VALUE){
            	
                g.drawLine(px, py, r.x + r.width/2, r.y);
            }
            System.out.println("valore j "+j+" etichetta"+n.getEtichetta());
            
            if( (j!=-1) && (tag!=null)){
            	if(tag.strada!=null){
            	if(tag.strada[j].equalsIgnoreCase("SX")){
            		if(j<tag.strada.length-1){
            			j++;
            		}
            		drawTree(g, n.getFiglioSinistro(), r.x + r.width/2, r.y + r.height, yoffs,j, Color.red);
            	}
            	else{
            		
            		drawTree(g, n.getFiglioSinistro(), r.x + r.width/2, r.y + r.height, yoffs,-1,Color.black);
            	}
            }
            	else{
                	drawTree(g, n.getFiglioSinistro(), r.x + r.width/2, r.y + r.height, yoffs,j,Color.black);
    
            	}
            }
            else{
            	
            	drawTree(g, n.getFiglioSinistro(), r.x + r.width/2, r.y + r.height, yoffs,j,Color.black);
            }
            
            if( (j!=-1) && (tag!=null)){
            	if(tag.strada!=null){
            	if(tag.strada[j].equalsIgnoreCase("DX")){
            		if(j<tag.strada.length-1){
            			j++;
            		}
            		drawTree(g, n.getFiglioDestro(), r.x + r.width/2, r.y + r.height, yoffs,j,Color.red);
            	}
            	else{
            		j=-1;
            		drawTree(g, n.getFiglioDestro(), r.x + r.width/2, r.y + r.height, yoffs,j,Color.black);
            	}
            }
            	else{
                	drawTree(g, n.getFiglioDestro(), r.x + r.width/2, r.y + r.height, yoffs,j, Color.black);
    
            	}
            }
            else{
            	drawTree(g, n.getFiglioDestro(), r.x + r.width/2, r.y + r.height, yoffs,j, Color.black);
            }
            
            
            
            
        }
        
        public void paint(Graphics g) {
            super.paint(g);
            fm = g.getFontMetrics();
            // if node locations not calculated
            if (dirty) {
                calculateLocations();
                dirty = false;
            }
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(getWidth() / 2, parent2child);
            
            
           
            
            drawTree(g2d, tree.albero[0], Integer.MAX_VALUE, Integer.MAX_VALUE, fm.getLeading() + fm.getAscent(),0,Color.black);
            fm = null;
        }
        
       
    }
    aiutatemi grazie a tutti

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Cerca di aiutare tu noi:

    1) Qual è il problema?
    2) Hai qualche eccezione in compilazione/esecuzione? (se sì, quali??)
    3) Usa i tag [code] e [/code] per postare il codice... così com'è è praticamente illeggibile (nessuna formattazione di font, nessuna indentazione... è a questo che servono quei tag).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    scusate è la prima che scrivo su un forum
    il problema è che quando visualizzo l'albero binario, è troppo grosso e non entra tutto nello schermo, io vorrei inserireri una scrollbar in modo da visualizzare le parti nascoste

    però non riesco a far scorrere lo schermo.

    grazie mille

  4. #4
    a un altra cosa i metodi che disegnano l'albero e lo visualizzano sono gli untimi 2

    paint(Graphic g)

    drawTree

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non usare JScrollBar: usa JScrollPane.
    C'è scritto tutto nella documentazione e nei tutorial della Sun!


    PS: modifico il tuo primo post aggiungendo i tag...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ok ho provato con scrollPane ma come faccio ad inserirlo per tutto il frame

  7. #7
    grazie di aver modificato il mio codice,

    io ho seri problemi con la lettura in inglese

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sul JFrame, aggiungi il JScrollPane al quale, a sua volta, avrai aggiunto il JPanel...

    Vediamo un po' la struttura:
    codice:
    private class BinaryTreeView extends JPanel {
       ...   // Tutto ciò che serve per disegnarci sopra, come da te già fatto
    }
    
    BinaryTreeView btv = new BinaryTreeView();
    
    JScrollPane jsp = new JScrollPane( btv );
    
    JFrame f = new JFrame();
    f.getContentPane().setLayout( new BorderLayout() );
    f.getContentPane().add(jsp, BorderLayout.CENTER);
    ...
    PS: per far visualizzare le barre di scorrimento dovrai settare la dimensione del JPanel a mano utilizzanso setPreferredSize().

    PPS: Ti sconsiglio di implementare così il progetto... solitamente si crea una classe che estende JFrame e nel suo costruttore si istanziano i componenti... estendere un componente e crearne il JFrame al suo interno sconvolge non poco la logica...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    ok non riesco a capire io ho fatto cosi però non funziona

    codice:
      JFrame f = new JFrame("Albero Binario");
         hbar = new JScrollPane(this);
            hbar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
             hbar.getHorizontalScrollBar().setUnitIncrement(10);
              f.getContentPane().add(hbar, BorderLayout.NORTH);
          f.getContentPane().add(this);

    PS. la classe non lo scritta io lo presa da internet e lo modificata per visualizzare il mio albero binario

  10. #10
    sono riusvito a farlo funzionare dovevo solo settare la dimensione come quella di

    setSize();

    però ora mi visualizza solo una barra verticale mentre a mè serve quella orizzontale

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.