Visualizzazione dei risultati da 1 a 2 su 2

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    1

    Disegno grafico di funzione

    Salve a tutti, per un progetto devo disegnare il grafico di una funzione dal punto a al punto b. Questo mi è riuscito.. solo che vorrei inserire gli assi cartesiani nel disegno, anche se la funzione in quell'intervallo non li tocca... Ho pensato allora di creare gli assi centrati in un pannello e disegnare la funzione rispettivamente ad essi. Il problema è che le dimensioni del pannello rimangono fisse a |b-a|e quindi una parte non si vede. Mi piacerebbe far si che si possa scorrere nel grafico per vederla tutta, o con delle barre di scrolling oppure spostandosi nel disegno con la "manina".. è possibile? Perchè ho provato a utilizzare uno scrollable panel ma non funziona, e non riesco neanche a dare le dimensioni che voglio al JPanel, consigli?

    il codice è questo (senza importazioni):

    public class FunctionPanel extends JPanel{
    private double a;
    private double b;
    private double n;
    private Function f;

    public FunctionPanel(Function f, double a, double b, int n){
    super();
    this.a=a;
    this.b=b;
    this.n=n;
    this.f=f;
    this.setBackground(Color.WHITE);
    }

    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    double h = (b-a)/n;
    int i=0;
    double x1, x2, y1, y2;
    Graphics2D g2 = (Graphics2D) g;
    Line2D lin;
    g.drawLine(this.getWidth()/2, 0, this.getWidth()/2, this.getHeight());
    g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);
    while (i<=n){
    x1 = a+i*h;
    y1 = f.getF(x1);
    x2 = x1+h;
    y2 = f.getF(x2);
    x1 = (this.getSize().width*x1)/(b-a);
    x2 = (this.getSize().width*x2)/(b-a);
    y1 = (this.getSize().width*y1)/(b-a);
    y2 = (this.getSize().width*y2)/(b-a);
    lin = new Line2D.Double(x1+this.getWidth()/2,-y1+this.getHeight()/2,x2+this.getWidth()/2,-y2+this.getHeight()/2);
    g2.setColor(Color.ORANGE);
    g2.draw(lin);
    i++;
    }



    }

    }


    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ire21 Visualizza il messaggio
    Mi piacerebbe far si che si possa scorrere nel grafico per vederla tutta, o con delle barre di scrolling oppure spostandosi nel disegno con la "manina".. è possibile?
    Possibile sì, lo è. Il concetto di spostamento tramite il dragging con la classica "manina" richiede però un pochino di codice.
    Innanzitutto ti serve un cursore apposito, da creare a partire da una immagine esterna. Nel framework esiste già un "hand cursor" ma è quello classico con l'indice alzato, usato tipicamente per i link (o roba del genere) quindi non credo sia molto appropriato.
    Poi devi gestire gli eventi del mouse, per la precisione sia con un MouseListener (interessa il mousePressed() ), sia con un MouseMotionListener (interessa il mouseDragged() ).
    Quando avviene il mousePressed prendi e memorizzi il punto del mouse, poi ad ogni mouseDragged prendi il punto attuale e fai la differenza con il punto precedente memorizzato (a cui poi assegni quello attuale). Da questa differenza ottieni uno spostamento "relativo" che devi usare per spostare il punto fisico nel pannello che rappresenta la "origine" o comunque un tuo punto di riferimento iniziale. Quindi chiedi repaint() sul pannello.
    Tutto questo non è difficile, richiede solo un minimo di ragionamento e di logica.

    Se invece vuoi usare delle scrollbar, si può fare. Basta che il tuo pannello lo metti come "view" dentro JScrollPane:

    JScrollPane sp = new JScrollPane(tuoFunctionPanel);

    È poi il JScrollPane sp che devi inserire dentro un altro tuo "contenitore" (non tuoFunctionPanel che è già dentro JScrollPane!).

    C'è solo una cosa importante da sapere: JScrollPane si basa di serie sul "preferred size" del componente view per determinare se e di quanto deve essere il range di scroll. Pertanto al tuo FunctionPanel devi dare un preferred size che dovrebbe essere tale da contenere tutto il tuo disegno.

    Quote Originariamente inviata da Ire21 Visualizza il messaggio
    non riesco neanche a dare le dimensioni che voglio al JPanel, consigli?
    In generale, quando inserisci un componente dentro un contenitore, la locazione/dimensione del componente dipende innanzitutto dalla presenza o meno di un layout manager nel contenitore. Se c'è un layout manager, dipende dai suoi criteri che ovviamente devi conoscere. Se non c'è un layout manager, devi posizionare/dimensionare tu esplicitamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2026 vBulletin Solutions, Inc. All rights reserved.