Grafica 3D in Java

Introduzione a OpenGL ed esempi di programmazione:
robot.unipv.it/robolab-website/courses/16-computer-graphics
www3.ntu.edu.sg/home/ehchua/programming/opengl/JOGL2.0.html

Download delle librerie OpenGL per Java dal sito jogamp.org

Istruzioni per l’installazione:

  • Decomprimere il contenuto dei 2 file 7zip in una cartella JOGL2 precedentemente creata.
  • In NetBeans creare una libreria denominata JOGL2 mediante il menu Tools – Libraries – New Library…
  • In Classpath inserire il percoso dei file
    …/JOGL2/jar/jogl-all.jar
    …/JOGL2/jar/gluegen-rt.jar
  • e dei file corrispondenti ai sistemi operativi su cui deve essere utilizzato il programma
    (in Windows a 32 bit)
    …/JOGL2/jar/jogl-all-natives-windows-i586.jar
    …/JOGL2/jar/gluegen-rt-natives-windows-i586.jar
    (in Linux a 32bit)
    …/JOGL2/jar/jogl-all-natives-linux-i586.jar
    …/JOGL2/jar/gluegen-rt-natives-linux-i586.jar
  • In Sources inserire il percoso del file
    …/JOGL2/jogl-java-src.zip
  • In Javadoc inserire il percoso delle cartelle
    …/JOGL2/javadoc
    …/JOGL2/javadoc_jogl_spec
    …/JOGL2/javadoc_nativewindow_spec

Programma di esempio:

Java: finestre di dialogo per l’apertura e il salvataggio dei file

    private void salva(java.awt.event.ActionEvent evt) {                       
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("File di testo (*.txt)", "txt");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            try {
                FileWriter fw = new FileWriter(chooser.getSelectedFile());
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(txtTesto.getText());
                bw.close();
                JOptionPane.showMessageDialog(this, "Salvataggio eseguito correttamente", "Messaggio", JOptionPane.INFORMATION_MESSAGE);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(this, "Si è verificato un errore nella scrittura del file", "Errore", JOptionPane.ERROR_MESSAGE);
            }
        }
    }                      

    private void apri(java.awt.event.ActionEvent evt) {                      
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("File di testo (*.txt)", "txt");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            txtTesto.setText("");
            try {
                FileReader fr = new FileReader(chooser.getSelectedFile());
                BufferedReader br = new BufferedReader(fr);
                String riga;
                while ((riga = br.readLine()) != null) {
                    txtTesto.append(riga + "\n");
                }
                br.close();
                JOptionPane.showMessageDialog(this, "Il file è stato caricato correttamente", "Informazione", JOptionPane.INFORMATION_MESSAGE);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(this, "Il file non è stato caricato correttamente", "Errore", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

Biblioteca

Biblioteca

package biblioteca;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;

public class Main extends javax.swing.JFrame {

    private int pos;
    private Libro[] libri;

    public Main() {
        initComponents();
        libri = new Libro[100];
        for (int i = 0; i < 100; i++) {
            libri[i] = new Libro();
        }
        pos = 0;
    }

[...]
    private void Left(java.awt.event.ActionEvent evt) {                      
        libri[pos].setAutore(txtAutore.getText());
        libri[pos].setEditore(txtEditore.getText());
        libri[pos].setPrezzo(txtPrezzo.getText());
        libri[pos].setTitolo(txtTitolo.getText());
        pos--;
        if (pos < 0) {
            pos = 0;
        }
        lblPos.setText("" + pos);
        txtAutore.setText(libri[pos].getAutore());
        txtTitolo.setText(libri[pos].getTitolo());
        txtEditore.setText(libri[pos].getEditore());
        txtPrezzo.setText(libri[pos].getPrezzo());
    }                     

    private void btnRightActionPerformed(java.awt.event.ActionEvent evt) {                                         
        libri[pos].setAutore(txtAutore.getText());
        libri[pos].setEditore(txtEditore.getText());
        libri[pos].setPrezzo(txtPrezzo.getText());
        libri[pos].setTitolo(txtTitolo.getText());
        pos++;
        if (pos > 100) {
            pos = 100;
        }
        lblPos.setText("" + pos);
        txtAutore.setText(libri[pos].getAutore());
        txtTitolo.setText(libri[pos].getTitolo());
        txtEditore.setText(libri[pos].getEditore());
        txtPrezzo.setText(libri[pos].getPrezzo());
    }                                        

    private void btnSalvaActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            FileWriter fw = new FileWriter("Biblioteca.csv");
            BufferedWriter bw = new BufferedWriter(fw);
            for (int i = 0; i < 100; i++) {
                bw.write(libri[i].getAutore() + ";" + libri[i].getTitolo() + ";" + libri[i].getEditore() + ";" + libri[i].getPrezzo());
                bw.newLine();
            }
            bw.close();
            JOptionPane.showMessageDialog(this, "Archivio salvato", "Informazione", JOptionPane.INFORMATION_MESSAGE);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this, "Errore nel salvataggio dell'archivio", "Errore", JOptionPane.ERROR_MESSAGE);
        }
    }                                        

    private void btnCaricaActionPerformed(java.awt.event.ActionEvent evt) {                                          
        try {
            FileReader fr = new FileReader("Biblioteca.csv");
            BufferedReader br = new BufferedReader(fr);
            for (int i = 0; i < 100; i++) {
                String riga = br.readLine();
                String[] campi = riga.split(";");
                libri[i].setAutore(campi[0]);
                libri[i].setTitolo(campi[1]);
                libri[i].setEditore(campi[2]);
                libri[i].setPrezzo(campi[3]);
            }
            br.close();
            JOptionPane.showMessageDialog(this, "Archivio caricato", "Informazione", JOptionPane.INFORMATION_MESSAGE);
            txtAutore.setText(libri[pos].getAutore());
            txtTitolo.setText(libri[pos].getTitolo());
            txtEditore.setText(libri[pos].getEditore());
            txtPrezzo.setText(libri[pos].getPrezzo());
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this, "Errore nel caricamento dell'archivio", "Errore", JOptionPane.ERROR_MESSAGE);
        }
    }                                         

[...]
}

Tabellina

Realizzare un programma che permetta all’utente di inserire la base di una tabellina in una casella di testo. Mediante un tasto Crea, viene costruita la tabellina nel formato:
2 × 1 = 2
2 × 2 = 4
etc.
all’interno di una textArea. Un bottone Salva, permette di salvare tutta la tabellina in un file avente come titolo TabellinaDel2.txt (il 2 deve variare se la tabellina è del 3 o del 4 etc.). Un bottone Apre deve leggere dal file giusto la tabellina richiesta mediante l’inserimento della base nella casella di testo.

Esercizio in preparazione alla verifica di informatica

Costruire una classe JPulsante costituita da un cerchietto di 40 per 40 pixel con bordo nero ed interno giallo. Agganciare all’oggetto due ascoltatori di evento del mouse: mouseEntered e mouseExited in modo che passandoci sopra il mouse il pulsante diventi con lo sfondo rosso, e togliendovi da sopra il mouse lo sfondo ritorni giallo. Suggerimento: definire un attributo boolean “over” true/false per registrare lo stato del mouse (sopra o non sopra l’oggetto).

Esercizi in preparazione alla verifica

  1. Costruire una classe che disegni una scacchiera bianca e nera di dimensione massima 256×256 pixel
  2. Costruire una classe che serva a rappresentare su un istogramma a rettangoli di colori diversi l’andamento di un titolo azionario durate i vari giorni della settimana; definire gli attributi rend1, rend2, etc. per ogni giorno della settimana.

JOxy

package assicartesiani;

import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JComponent;

public class JOxy extends JComponent {

    private int scalaX, scalaY, traslX, traslY;
    private String asseX, asseY;

    public JOxy() {
        setPreferredSize(new Dimension(400, 400));
        setScalaX(50);
        setScalaY(50);
        setTraslX(40);
        setTraslY(40);
        setAsseX("X");
        setAsseY("Y");
    }

    public int xg(double x) {
        return (int) Math.round(getTraslX() + x * getScalaX());
    }

    public int yg(double y) {
        return (int) Math.round(getHeight() - 1 - getTraslY() - y * getScalaY());
    }

    public double xr(int x) {
        return (double) (x - getTraslX()) / getScalaX();
    }

    public double yr(int y) {
        return (double) (getHeight() - 1 - getTraslY() - y) / getScalaY();
    }

    @Override
    public void paintComponent(Graphics g) {
        int w = getWidth() - 1;
        int h = getHeight() - 1;
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setFont(getFont());
        FontMetrics fm = g2.getFontMetrics();

        g2.setColor(getBackground());
        g2.fillRect(0, 0, w, h);
        g2.setColor(getForeground());

        // asse x
        g2.drawLine(0, yg(0), w, yg(0));
        g2.drawLine(w - 20, yg(0) - 10, w, yg(0));
        g2.drawLine(w - 20, yg(0) + 10, w, yg(0));
        for (int x = -getTraslX() / getScalaX(); x < (w - getTraslX()) / getScalaX(); x++) {
            g2.drawLine(xg(x), yg(0) - 5, xg(x), yg(0) + 5);
            String xs = x + "";
            g2.drawString(xs, xg(x) - fm.stringWidth(xs) / 2, yg(0) + 5 + fm.getHeight());
        }
        g2.drawString(getAsseX(), w - 5 - fm.stringWidth(getAsseX()), yg(0) - 15 - fm.getDescent());

        // asse y
        g2.drawLine(xg(0), h, xg(0), 0);
        g2.drawLine(xg(0) - 10, 20, xg(0), 0);
        g2.drawLine(xg(0) + 10, 20, xg(0), 0);
        for (int y = -getTraslY() / getScalaY(); y < (h - getTraslY()) / getScalaY(); y++) {             g2.drawLine(xg(0) - 5, yg(y), xg(0) + 5, yg(y));             String ys = y + "";             g2.drawString(ys, xg(0) - 10 - fm.stringWidth(ys), yg(y) + fm.getAscent() / 2);         }         g2.drawString(getAsseY(), xg(0) + 15, fm.getHeight());     }     public int getScalaX() {         return scalaX;     }     public final void setScalaX(int scalaX) {         if (scalaX >= 20) {
            this.scalaX = scalaX;
            repaint();
        }
    }

    public int getScalaY() {
        return scalaY;
    }

    public final void setScalaY(int scalaY) {
        if (scalaY >= 20) {
            this.scalaY = scalaY;
            repaint();
        }
    }

    public int getTraslX() {
        return traslX;
    }

    public final void setTraslX(int traslX) {
        if (traslX >= 0) {
            this.traslX = traslX;
            repaint();
        }
    }

    public int getTraslY() {
        return traslY;
    }

    public final void setTraslY(int traslY) {
        if (traslY >= 0) {
            this.traslY = traslY;
            repaint();
        }
    }

    public String getAsseX() {
        return asseX;
    }

    public final void setAsseX(String asseX) {
        if (asseX != null) {
            this.asseX = asseX;
        } else {
            this.asseX = "";
        }
    }

    public String getAsseY() {
        return asseY;
    }

    public final void setAsseY(String asseY) {
        if (asseY != null) {
            this.asseY = asseY;
        } else {
            this.asseY = "";
        }
    }

}

JCirconferenza

JCirconferenza

import java.awt.Color;
import java.awt.Graphics;

public class JCirconferenza extends JOxy {

    private double a, b, c;

    public JCirconferenza() {
        setA(0.0);
        setB(0.0);
        setC(-1.0);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        double xC = -getA()/ 2.0;
        double yC = -getB()/ 2.0;
        double r = Math.sqrt(xC * xC + yC * yC - getC());
        g.setColor(Color.BLUE);
        g.drawOval(xg(xC - r), yg(yC + r), (int) Math.round(2.0 * r * getScalaX()), (int) Math.round(2.0 * r * getScalaY()));
    }

    public double getA() {
        return a;
    }

    public final void setA(double a) {
        this.a = a;
        repaint();
    }

    public double getB() {
        return b;
    }

    public final void setB(double b) {
        this.b = b;
        repaint();
    }

    public double getC() {
        return c;
    }

    public final void setC(double c) {
        this.c = c;
        repaint();
    }
}