Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-03-2010, 11:17   #1
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
[Java SE] Display a 7 Segmenti,come?

Raga,ho cercato su una marea di siti sia italiani che inglesi ma non sono riuscito a trovare niente riguardo il display a 7 segmenti,sapete quale metodo permette di mostrarlo su una finestra grafica?che package va importato?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 11:52   #2
lupoxxx87
Senior Member
 
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
non fai prima a crearti 7 rettangoli e poi decidere quali far vedere e quali no ?
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 11:54   #3
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
Quote:
Originariamente inviato da lupoxxx87 Guarda i messaggi
non fai prima a crearti 7 rettangoli e poi decidere quali far vedere e quali no ?
ho iniziato il java da 2 settimane appena,quindi non sono molto esperto
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 18:14   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' un componente piuttosto specifico, devi crealo da solo. E' un questione elementare (nel senso che è fatta di tante piccole parti relativamente facili). Ad esempio questo:



è generato dalla combinazione di questi tre tipi in un Main:

SSDModelListener.java
Codice:
package sevensegmentdisplay;

/**
 * Ascoltatore di eventi generati dal modello di un display a sette segmenti.
 */
public interface SSDModelListener {

    /**
     * Gestisce una notifica di aggiornamento inviato da un modello
     * @param model il modello che è stato aggiornato
     */
    public void update(SSDModel model);
}
SSDModel.java
Codice:
package sevensegmentdisplay;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import static sevensegmentdisplay.SSDModel.State.ON;
import static sevensegmentdisplay.SSDModel.State.OFF;

/**
 * Modello di un component SevenSegmentDisplay.
 */
public class SSDModel {

    /**
     * Identificatori dei segmenti di un display a sette segmenti. Vedi
     * http://en.wikipedia.org/wiki/File:7_segment_display_labeled.svg
     */
    public static enum SSDSegment {
        A, B, C, D, E, F, G, DP
    }

    /**
     * Lo stato attivo-inattivo di un segmento.
     */
    public static enum State {
        ON, OFF
    }

    /**
     * Utilità per la definizione dell'insieme di stati che creano una lettera o una
     * cifra.
     */
    private static class StatePack {
        private State[] states;
        StatePack(State...states) {
            this.states = states;
        }
        void apply(Map<SSDSegment, State> map) {
            for (int i = 0; i < SSDSegment.values().length; i++) {
                SSDSegment seg = SSDSegment.values()[i];
                map.put(seg, states[i]);
            }
        }
    }

    private Map<SSDSegment, State> states = new HashMap<SSDSegment, State>();
    private List<SSDModelListener> listeners = new CopyOnWriteArrayList<SSDModelListener>();
    private Map<String, StatePack> packs = new HashMap<String, StatePack>();

    /**
     * inizializza questo modello per display a sette segmenti.
     */
    public SSDModel() {
        for (SSDSegment s : SSDSegment.values()) {
            states.put(s, State.OFF);
        }
        packs.put("a", new StatePack(ON, ON, ON, ON, ON, OFF, ON, OFF));
        packs.put("b", new StatePack(ON, ON, ON, ON, ON, ON, OFF, OFF));
        packs.put("c", new StatePack(ON, OFF, OFF, ON, ON, ON, OFF, OFF));
        packs.put("d", new StatePack(OFF, ON, ON, ON, ON, OFF, ON, OFF));
        packs.put("e", new StatePack(ON, OFF, OFF, ON, ON, ON, ON, OFF));
        packs.put("1", new StatePack(OFF, ON, ON, OFF, OFF, OFF, OFF, OFF));
        packs.put("2", new StatePack(ON, ON, OFF, ON, ON, OFF, ON, OFF));
        packs.put("3", new StatePack(ON, ON, ON, ON, OFF, OFF, ON, OFF));
        packs.put("4", new StatePack(OFF, ON, ON, OFF, OFF, ON, ON, OFF));
        packs.put("5", new StatePack(ON, OFF, ON, ON, OFF, ON, ON, OFF));
        packs.put("6", new StatePack(ON, OFF, ON, ON, ON, ON, ON, OFF));
        packs.put("7", new StatePack(ON, ON, ON, OFF, OFF, OFF, OFF, OFF));
        packs.put("8", new StatePack(ON, ON, ON, ON, ON, ON, ON, OFF));
        packs.put("9", new StatePack(ON, ON, ON, ON, OFF, ON, ON, OFF));
        packs.put("0", new StatePack(ON, ON, ON, ON, ON, ON, OFF, OFF));
        packs.put(".", new StatePack(OFF, OFF, OFF, OFF, OFF, OFF, OFF, ON));
        packs.put("err", new StatePack(ON, ON, ON, ON, ON, ON, ON, ON));
        packs.put("off", new StatePack(OFF, OFF, OFF, OFF, OFF, OFF, OFF, OFF));
    }

    /**
     * Imposta lo stato corrente del modello.
     * @param c un carattere o una combinazione di caratteri. Se il carattere
     * non è riconosciuto il modello mostra un errore (tutti i segmenti saranno
     * attivati). La stringa "err" imposta il modello su errore, la stringa "off"
     * imposta il modello su off.
     */
    public void setState(String c) {
        StatePack pack = packs.get(c);
        if(pack != null) {
            pack.apply(states);
        } else {
            packs.get("err").apply(states);
        }
        fireEvent();
    }

    /**
     * Imposta lo stato di un singolo segmento
     * @param s il segmento da impostare
     * @param state lo stato di quel segmento
     */
    public void setState(SSDSegment s, State state) {
        states.put(s, state);
    }

    /**
     * Restituisce lo stato di un segmento
     * @param s il segmento richiesto
     * @return lo stato del segmento richiesto
     */
    public State getState(SSDSegment s) {
        return states.get(s);
    }

    /**
     * Notifica un evento update a tutti gli ascoltatori
     */
    protected void fireEvent() {
        for (SSDModelListener listener : listeners) {
            listener.update(this);
        }
    }

    /**
     * Aggiunge un ascoltatore di eventi a questo modello
     * @param listener l'ascoltatore di eventi da aggiungere
     */
    public void addListener(SSDModelListener listener) {
        listeners.add(listener);
    }

    /**
     * Rimuove un ascoltatore di eventi da questo modello
     * @param listener l'ascoltatore di eventi da rimuovere
     */
    public void removeListener(SSDModelListener listener) {
        listeners.remove(listener);
    }
}
SevenSegmentDisplay.java
Codice:
package sevensegmentdisplay;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JComponent;

/**
 * Display a sette segmenti.
 */
public class SevenSegmentDisplay extends JComponent {
    /**
     * Creatore di istanze. Crea e restituisce un nuovo SevenSegmentDisplay
     * @return un nuovo display a sette segmenti.
     */
    public static SevenSegmentDisplay newInstance() {
        final SevenSegmentDisplay d = new SevenSegmentDisplay();
        d.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        d.model.addListener(new SSDModelListener() {

            public void update(SSDModel model) {
                d.repaint();
            }
        });
        return d;
    }

    private Paint displayBackground = Color.BLACK;
    private Paint off = Color.DARK_GRAY;
    private Paint on = Color.RED;
    private SSDModel model = new SSDModel();

    /**
     * Inizializzazione protetta: per creare un SevenSegmentDisplay usare il metodo
     * SevenSegmentDisplay.newInstance
     */
    protected SevenSegmentDisplay() {}

    /**
     * Imposta il colore di sfondo del display
     * @param p il colore di sfondo del display
     */
    public void setDisplayBackgroundPaint(Paint p) {
        if(p != null) {
            displayBackground = p;
        } else {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Display Background cannot be null.");
        }
    }

    /**
     * Imposta il colore usato per i segmenti attivi
     * @param p il colore per i segmenti attivi
     */
    public void setSegmentOnPaint(Paint p) {
        if(p != null) {
            on = p;
        } else {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Segment on paint cannot be null.");
        }
    }

    /**
     * Imposta il colore usato per i segmenti non attivi
     * @param p il colore per i segmenti non attivi.
     */
    public void setSegmentOffPaint(Paint p) {
        if(p != null) {
            off = p;
        } else {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Segment off paint cannot be null");
        }
    }

    /**
     * Restituisce la dimensione preferita di questo display. Se il display non
     * ha una dimensione preferita impostata, restituisce una dimension predefinita.
     * @return la dimensione preferita di questo display.
     */
    @Override
    public Dimension getPreferredSize() {
        Insets ins = getInsets();
        Dimension pref = super.getPreferredSize();
        if(pref == null || pref.getWidth() <= 1 || pref.getHeight() <= 1) {
            return new Dimension(100 + ins.left + ins.right, 84 + ins.top + ins.bottom);
        } else {
            System.out.println("PD: " + pref);
            return pref;
        }
    }

    /**
     * Disegna il contenuto di questo componente
     * @param graphics il contesto grafico da usare per il disegno
     */
    @Override
    protected void paintComponent(Graphics graphics) {
        JComponent comp = this;
        Insets ins = comp.getInsets();
        double ch = comp.getHeight();
        double cw = comp.getWidth();
        double x0 = ins.left;
        double y0 = ins.top;
        double x1 = cw - ins.right;
        double y1 = ch - ins.bottom;
        double w = x1 - x0;
        double h = y1 - y0;
        double qw = w / 6;
        double qh = h / 5;
        double hqw = qw / 2;
        double hqh = qh / 2;
        double qw4 = 4 * qw;
        Point2D a = pt(hqw + x0, hqh + y0);
        Point2D b = pt(qw4 + x0, hqh + y0);
        Point2D c = pt(hqw + x0, ch / 2);
        Point2D d = pt(qw4 + x0, ch / 2);
        Point2D e = pt(hqw + x0, y1 - hqh);
        Point2D f = pt(qw4 + x0, y1 - hqh);
        Point2D g = pt(w - hqw, y1 - hqh);
        double segWidth = 8;
        double segHeight = 8;
        Shape dp = new Ellipse2D.Double(g.getX() - hqw, f.getY() - segHeight, 2 * segWidth, 2 * segHeight);
        Shape segA = new SegmentShapeBuilder(a, b, segWidth, segHeight).getShape();
        Shape segB = new SegmentShapeBuilder(b, d, segWidth, segHeight).getShape();
        Shape segC = new SegmentShapeBuilder(d, f, segWidth, segHeight).getShape();
        Shape segD = new SegmentShapeBuilder(f, e, segWidth, segHeight).getShape();
        Shape segE = new SegmentShapeBuilder(e, c, segWidth, segHeight).getShape();
        Shape segF = new SegmentShapeBuilder(c, a, segWidth, segHeight).getShape();
        Shape segG = new SegmentShapeBuilder(c, d, segWidth, segHeight).getShape();
        Graphics2D graphics2D = (Graphics2D) graphics;
        graphics2D.setPaint(displayBackground);
        graphics2D.fillRect(0, 0, getWidth(), getHeight());
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        setPaint(SSDModel.SSDSegment.A, graphics2D);
        graphics2D.fill(segA);
        setPaint(SSDModel.SSDSegment.B, graphics2D);
        graphics2D.fill(segB);
        setPaint(SSDModel.SSDSegment.C, graphics2D);
        graphics2D.fill(segC);
        setPaint(SSDModel.SSDSegment.D, graphics2D);
        graphics2D.fill(segD);
        setPaint(SSDModel.SSDSegment.E, graphics2D);
        graphics2D.fill(segE);
        setPaint(SSDModel.SSDSegment.F, graphics2D);
        graphics2D.fill(segF);
        setPaint(SSDModel.SSDSegment.G, graphics2D);
        graphics2D.fill(segG);
        setPaint(SSDModel.SSDSegment.DP, graphics2D);
        graphics2D.fill(dp);
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    }

    /**
     * Restituisce il modello di questo display a sette segmenti
     * @return il modello di questo display a sette segmenti
     */
    public SSDModel getModel() {
        return model;
    }

    /* metodo di appoggio, imposta un colore in base allo stato di un segmento */
    private void setPaint(SSDModel.SSDSegment s, Graphics2D g) {
        g.setPaint(paintForSegment(s));
    }

    /* metodo di appoggio, restituisce un colore in base allo stato di un segmento */
    private Paint paintForSegment(SSDModel.SSDSegment s) {
        return model.getState(s) == SSDModel.State.ON ? on : off;
    }

    /* metodo di appoggio, istanzia un Point2D.Double */
    private static Point2D pt(double x, double y) {
        return new Point2D.Double(x, y);
    }
}
Main.java
Codice:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sevensegmentdisplay;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

/**
 *
 * @author pgi
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame win = new JFrame("test");
                win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                final SevenSegmentDisplay display = SevenSegmentDisplay.newInstance();
                display.addMouseListener(new MouseAdapter() {
                    int number = 0;
                    String loop = "0123456789.";
                    public void mousePressed(MouseEvent e) {
                        number++;
                        if(number == loop.length()) number = 0;
                        display.getModel().setState(loop.substring(number, number + 1));
                    }
                });
                win.add(display);
                win.pack();
                win.setVisible(true);
                display.getModel().setState("0");
            }
        });
    }

}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 19:57   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Pardon, 4 tipi più un main (ne avevo dimenticato uno):

SegmentShapeBuilder.java
Codice:
package sevensegmentdisplay;

import java.awt.Shape;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;

/**
 * Crea una figura corrispondente ad un segmento di un display a sette segmenti.
 */
public class SegmentShapeBuilder {

    /**
     * Utilita per il calcolo di direzioni e spostamenti
     */
    private static class Vector2D extends Point2D {
        private double x, y;
        private double norm;

        Vector2D(double x, double y) {
            norm = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
            this.x = x / norm;
            this.y = y / norm;
        }

        Vector2D(Point2D a, Point2D b) {
            this(b.getX() - a.getX(), b.getY() - a.getY());
        }

        /**
         * Restituisce una nuova direzione ortogonale a quella espressa da questo vettore
         * @return un vettore ortogonale a questo
         */
        Vector2D ortho() {
            return new Vector2D(-y, x);
        }

        @Override
        public double getX() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public double getY() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void setLocation(double x, double y) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        /**
         * Genera la traslazione di un punto lungo la direttrice espressa da questa
         * direzione
         * @param p il punto da traslare
         * @param len la quantità di spostamento
         * @return un punto p pari a p traslato di len nella direzione espressa da questo vettore
         */
        public Point2D translate(Point2D p, double len) {
            return new Point2D.Double(p.getX() + x * len, p.getY() + y * len);
        }
    }

    /* figura geometrica generata da questo creatore di segmenti */
    private final Path2D SHAPE;

    /**
     * Initializza questo generatore di segmenti
     * @param a il punto da cui parte il segmento
     * @param b il punto in cui termina il segmento
     * @param sizeX l'ampiezza assiale della punta del segmento
     * @param sizeY l'ampiezza ortogonale dell'estremita del segmento
     */
    public SegmentShapeBuilder(Point2D a, Point2D b, double sizeX, double sizeY) {
        Vector2D dir = new Vector2D(a, b);
        Vector2D ortho = dir.ortho();
        a = dir.translate(a, 2);
        b = dir.translate(b, -2);
        Point2D f0 = dir.translate(a, sizeX);
        Point2D f1 = dir.translate(b, -sizeX);
        Point2D p0 = a;
        Point2D p1 = ortho.translate(f0, -sizeY);
        Point2D p2 = ortho.translate(f1, -sizeY);
        Point2D p3 = b;
        Point2D p4 = ortho.translate(f1, sizeY);
        Point2D p5 = ortho.translate(f0, sizeY);
        Path2D.Double shape = new Path2D.Double();
        shape.moveTo(p0.getX(), p0.getY());
        shape.lineTo(p1.getX(), p1.getY());
        shape.lineTo(p2.getX(), p2.getY());
        shape.lineTo(p3.getX(), p3.getY());
        shape.lineTo(p4.getX(), p4.getY());
        shape.lineTo(p5.getX(), p5.getY());
        shape.closePath();
        SHAPE = shape;
    }

    /**
     * Restituisce la figura geometrica generata da questo creatore di segmenti
     * sulla base dei dati forniti in costruzione
     * @return la figura di un segmento
     */
    public Shape getShape() {
        return SHAPE;
    }
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 21:55   #6
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
Grazie mille appena ho un attimo lo provo,una domanda: devo creare proprio un package?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2010, 22:00   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non è fisicamene obbligatorio ma di solito un progetto ha sempre un package di base per questioni organizzative e di identità dei tipi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2010, 18:11   #8
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
Ho provato il codice su eclipse,ha funzionato da subito,ora mi chiedevo: se voglio aggiungere un altro display affianco a quello che già c'è,oltre a scrivere
Codice:
final SevenSegmentDisplay display2 = SevenSegmentDisplay.newInstance();
e
Codice:
win.add(display2);
che metodo devo usare per spostare questo secondo display affianco al primo invece che dietro?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2010, 18:40   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Puoi usare un contenitore intermedio. Tipo:

SevenSegmentDisplay d0 = ...
SevenSegmentDisplay d1 = ...
JPanel contenitore = new JPanel(new GridLayout(1, 2));//1 riga, 2 colonne
contenitore.add(d0);
contenitore.add(d1);
win.add(contenitore);

Magari sarebbe meglio creare una classe in grado di mostrare una sequenza di SevenSegmentDisplay, qualcosa che ti faccia dire:

MultiSSD d = new MultiSSD(2);//due SSD uno in fila all'altro
win.add(d);

anche perchè con più caratteri da mostrare sarebbe più immediato poter dire poi:

d.mostra("12536.25");

cioè passi a questo ipotetico MultiSSD una stringa e lui si occupa di affidare i caratteri ai singoli display di cui è composto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2010, 18:54   #10
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
credo che la seconda cosa sia un pò difficile per me al momento,all'uni non sono nemmeno arrivato a fare la grafica
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2010, 18:55   #11
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non era per un compito universitario, vero?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2010, 19:17   #12
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
no assolutamente,poi la grafica ancora la deve spiegare il mio prof,sto chiedendo perchè volevo implementare un orologio che avevo fatto in C
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2010, 02:35   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La classe è in verità breve. Ovviamente all'inizio è sempre tutto un po' strano ma più o meno tutti i programmi java alla fine sono organizzati per piccoli blocci come quelli che abbiamo usato qui.

Nel nostro caso basta una nuova classe di 47 righe:

SSDPanel.java
Codice:
package sevensegmentdisplay;

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JPanel;

/**
 * Una sequenza di SevenSegmentDisplay
 */
public class SSDPanel extends JPanel {
    private SevenSegmentDisplay[] displays;
    private int displayCount;

    /**
     * Inizializza un SSDPanel
     * @param displayCount quanti display mostra il pannello
     */
    public SSDPanel(int displayCount) {
        super(new GridLayout(1, displayCount));//1 riga, display count colonne
        //inizializzo l'array per ospitare displayCount componenti
        displays = new SevenSegmentDisplay[displayCount];
        //creo n SevenSegmentDisplay e li aggiungo a questo pannello, da sinistra a destra
        for (int i = 0; i < displayCount; i++) {
            SevenSegmentDisplay display = SevenSegmentDisplay.newInstance();
            display.setSegmentOnPaint(Color.GREEN);
            add(display);
            displays[i] = display;
        }
        this.displayCount = displayCount;
    }

    /**
     * Mostra del testo nel display. Il pannello mostra un numero di caratteri
     * pari al numero di display presenti in questo pannello. Se ce ne sono
     * in più, vengono ignorati.
     * @param text il testo da mostrare.
     */
    public void setText(String text) {
        int max = Math.min(displayCount, text.length());
        for(int i = 0; i < max; i++) {
            String character = text.substring(i, i + 1);//prendo l'i-esimo carattere
            displays[i].getModel().setState(character);
        }
        /* se ci sono meno caratteri che display bisogna azzerare quei display */
        for(int i = max; i < displays.length; i++) {
            displays[i].getModel().setState("off");
        }
    }
}
Si può testare con un timer:

Main.java
Codice:
package sevensegmentdisplay;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.Timer;

/**
 *
 * @author pgi
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame win = new JFrame("test");
                win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                final SSDPanel display = new SSDPanel(5);
                final Timer timer = new Timer(1000, new ActionListener() {
                    int now = 0;
                    public void actionPerformed(ActionEvent e) {
                        now += 1;
                        display.setText(String.valueOf(now));
                    }
                });
                win.addWindowListener(new WindowAdapter() {

                    @Override
                    public void windowOpened(WindowEvent e) {
                        timer.start();
                    }

                    @Override
                    public void windowClosing(WindowEvent e) {
                        timer.stop();
                    }
                });
                win.add(display);
                win.pack();
                win.setVisible(true);
            }
        });
    }

}
Che genera:



Per allineare i numeri a destra si può partire con l'assegnamento dei caratteri ai display non da 0 a max ma da displayCount - 1 a displayCount - max.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2010, 11:44   #14
Roran
Senior Member
 
L'Avatar di Roran
 
Iscritto dal: Aug 2006
Messaggi: 1730
Grazie ancora,ma se volessi disegnare i due punti tra ogni coppia di numeri?cioè in questo modo ore:minuti:secondi è possibile?Bisognerebbe creare solo una classe con due cerchi riempiti e spostati sugli assi?
__________________
i5-9400F + Zalman CNPS 8X Optima|Asus Prime B365M-A|Corsair Vengeance LP 2x8GB DDR4 2666Mhz|Sapphire Radeon RX 580 Pulse Ed. 4GB|Samsung 970 Evo Plus 250GB + OCZ Trion 100 (120GB) + Seagate Barracuda (1.5 TB)|Corsair TX650M|LG 27UD59 27" UHD|Windows 10 Pro| iPhone 17 Pro 256 Gb  MBA M3 13" 16/512 GB  AW 7  iPad Air 5 | 14 Trattative concluse sul forum, ultime 5 con: robby66,Darius_84,Konrad86,Dolphin69,dream83
Roran è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2010, 18:50   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Alla fine sì. Praticamente in SSDPanel ogni due SevenSegmentDisplay metti un ColonDisplay (per dire un nome) dove ColonDisplay è una classe che estende JComponent e nel suo metodo "paintComponent" disegna due cerchi. In pseudocodice:

Codice:
class ColonDisplay extends JComponent {

    @Override
    protected void paintComponent(Graphics graphics) {
        Graphics2D g = (Graphics2D) graphics;
        g.setPaint(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());//sfondo nero
        Shape dot01 = new Ellipse2D.Double(x0, y0, w, h);
        Shape dot02 = new Ellipse2D.Double(x1, y1, w, h);
        g.setPaint(Color.GREEN);
        g.fill(dot01);
        g.fill(dot02);
    }
}
In SSDPanel avrai una cosa tipo:

Codice:
//costruttore, pseudo codice
public SSDPanel(int displayCount) {
    super(new GridLayout(1, displayCount + (1 colonPanel ogni 2 displayCount)));
    for(...il numero di display count) {
        ogni due display aggiungi un nuovo ColonPanel
    }
}
Per calcolare la posizione dei due punti in ColonDisplay devi fare due conti. Nel metodo paintComponent sai che getWidth() ti dice quanto è largo il componente in cui stai disegnando e getHeight() ti dice quanto è alto. Sai che il sistema di coordinate Java2D stabilisce che il punto (x = 0, y = 0) è in alto a sinistra. Il costruttore di un ellisse (Ellipse2D.Double(x, y, w, h)) vuole come argomento un rettangolo in cui sarà iscritta l'ellisse: x è l'ascissa del punto di partenza del rettangolo, y è l'ordinata, w indica quanto è lungo e h quanto è alto quel rettangolo. Il punto di partenza è il vertice in alto a sinistra.

Così se vuoi centrare i pallini sulle ascisse parti dicendo che:

double xm = getWidth() / 2;

è l'asse verticale che divide in due il componente in lunghezza. Se i pallini devono avere un diametro di, poniamo, 20 pixel, allora l'ascissa del quadrato in cui è iscritta l'ellisse di entrambi i pallini è:

double x0 = xm - (20 / 2);
double x1 = xm - (20 / 2);

per l'ordinata devi vedere dove vuoi metterli, sempre tenendo come riferimento le dimensioni del componente su cui stai disegnando. Ad esempio se vuoi metterli ad un terzo e due terzi dell'altezza:

double h = getHeight();
double y0 = h / 3.0 - (20 / 2);//sempre per via dell'iscrizione nel rettangolo
double y1 = 2.0 * h / 3.0 - (20 / 2);

Quindi avrai:

Shape dp0 = new Ellipse2D.Double(x0, y0, 20, 20);
Shape dp1 = new Ellipse2D.Double(x1, y1, 20, 20);

Puoi fare delle considerazioni di proporzionalità anche sulla largezza dei pallini. Diciamo che vuoi farli grandi un decimo delle dimensioni del componente. Dirai (sempre conti fatti nel paintComponent):

double w = getWidth() / 10.0;
double h = getHeight() ( 10.0;
double x0 = xm - (w/ 2);
double x1 = xm - (w/ 2);
double y0 = getWidth() / 3.0 - (w/ 2);
double y1 = 2.0 * getHeight() / 3.0 - (h/ 2);
Shape dp0 = new Ellipse2D.Double(x0, y0, w, h);
Shape dp 1 = new Ellipse2D.Double(x1, y1, w, h);

In definitiva devi fare un paio di conti e qualche prova.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2010, 19:59   #16
Roscoe90
Junior Member
 
Iscritto dal: Nov 2009
Messaggi: 6
Io non saprei come aiutare Roran sto alle prima armi con java (allora che ho scritto a fare, bah il cervello umano è un oragano strano)
Roscoe90 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Tesla non convince più: crolla il...
OpenAI lancia Prism: l'AI ora lavora fia...
Nissan mette i pannelli solari su Ariya:...
Day 3 a Barcellona: la prima di Norris c...
Usa: il capo della cyber sicurezza ha ca...
Nuovo look per il DJI Store di Milano: f...
I giudici sentenziano: Trump non pu&ogra...
Il kernel Linux si prepara al 'dopo Torv...
Meta, Snap, TikTok e YouTube: la prossim...
Daredevil Born Again seconda stagione: o...
IPTV illegali, Operazione 'Switch off': ...
Gli agenti di IA sono ovunque, e incontr...
Un'email inviata per errore svela che Am...
Samsung ha valutato il tasto fotocamera ...
L'Agenzia Spaziale Europea lancia un'IA ...
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: 15:34.


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