Created
August 26, 2012 16:19
-
-
Save TonyWhite/3481431 to your computer and use it in GitHub Desktop.
Sistemi Di Numerazione
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * La classe converte da un sistema decimale ad un sistema qualsiasi e viceversa | |
| * | |
| * Autore: Antonio Bianco | |
| */ | |
| public class Conversioni implements Runnable | |
| { | |
| public static final String ERRORE = "Err"; | |
| public static final long MAX_DEC = 9999999999999990L; // Numero decimale più grande da convertire | |
| /** | |
| * Constructor for objects of class Conversioni | |
| */ | |
| public Conversioni() | |
| { | |
| // Metodo vuoto | |
| } | |
| /** | |
| * Converte un carattere nel relativo codice ASCII nella base specificata | |
| * | |
| * char carattere: il carattere da codificare | |
| * int base: la base di codifica | |
| * | |
| * Esempio: | |
| * carattere = 'A' | |
| * base = 2 | |
| * codice ASCII = 65 | |
| * return: "1000001" | |
| */ | |
| public static String charToBase(char carattere, int base) | |
| { | |
| return decToBase(((int)carattere)+"", base); | |
| } | |
| /** | |
| * Converte un numero in base 10 in un qualsiasi altra base | |
| * | |
| * String num: numero in base 10 | |
| * int base: la base nella quale convertire | |
| * return: la stringa che rappresenta il numero convertito | |
| * | |
| * Nota 1: La conversione è assicurata solo per numeri interi positivi fino a 9999999999999990 | |
| * Nota 2: base <= 36 perché le cifre rappresentate con le lettere dell'alfabeto sono solo maiuscole | |
| */ | |
| public static String decToBase(String num, int base) | |
| { | |
| /** | |
| * Oltre 9999999999999990 il double non riesce a gestire con precisione tutti i decimali | |
| */ | |
| String valore = ERRORE; | |
| try | |
| { | |
| if (numeroValido_privato(num, 10)) //Assicuriamoci che il numero inserito sia in base 10 | |
| { | |
| valore = ""; | |
| Long intero = new Long(num); // Istruzione con pericolo di overflow | |
| if (intero > MAX_DEC) | |
| { | |
| valore = ERRORE + ": num deve essere < " + MAX_DEC; | |
| } | |
| else | |
| { | |
| if (base==1) // Calcola per la base più inutile e pericolosa in assoluto | |
| { | |
| /** | |
| * Con il massimo valore possibile 9'999'999'999'999'990 si consuma una quatara di RAM. | |
| * Ogni carattere della stringa è rappresentato da 16 bit, | |
| * quindi il consumo massimo sarebbe di (9'999'999'999'999'990+1)*2 byte | |
| * che sarebbero 19'999'999'999'999'982 byte | |
| * che sarebbero 19'073'486'328,1 MB | |
| * che sarebbero 18'626'451,4923 GB | |
| * che sarebbero cazzi amari espressi in potenze di 2 | |
| * E allora perché non ho messo un controllo per limitare lo spreco di memoria? | |
| * 1) Per vedere chi è tanto http://lmgtfy.com/?q=persona+poco+avveduta+che+non+prevede+le+conseguenze+dei+propri+atti+per+insufficiente+intelligenza&l=1 | |
| * 2) Me lo ha chiesto Fabio (no, non è quello di Striscia) | |
| */ | |
| /*for (int i=0; i<=intero; i++) // Per il ciclo alta tensione... | |
| { | |
| valore += "0"; | |
| }*/ | |
| valore = ERRORE; // DEBUG: Questo metodo non è sicuro per compiere questa conversione | |
| } | |
| else // Calcola per tutte le altre basi | |
| { | |
| Long risultato; | |
| Double decimale; | |
| while(intero>0) | |
| { | |
| decimale = intero.doubleValue()/base; // In realtà la vera trappola non è l'overflow del Long, ma la notazione del double che perde precisione oltre un certo valore (definito in MAX_DEC) | |
| intero = decimale.longValue(); // Prendo la parte intera del numero | |
| decimale = decimale - intero.doubleValue(); // Prendo la parte decimale del numero | |
| risultato = Math.round(new Double(base*decimale)); // Prendo il risultato | |
| valore = valoreCifra(risultato.byteValue()) + valore; // Aggiorno il risultato | |
| } | |
| } | |
| } | |
| } | |
| else | |
| { | |
| valore = ERRORE; | |
| } | |
| } | |
| catch(Exception e) | |
| { | |
| valore = ERRORE; | |
| } | |
| return valore; | |
| } | |
| /** | |
| * Ritorna la cifra in base 36 che rappresenta il valore in base decimale dato in input | |
| */ | |
| private static char valoreCifra(byte valore) | |
| { | |
| if (valore<10) valore += 48; | |
| else valore += 55; | |
| return (char)valore; | |
| } | |
| /** | |
| * Converte un numero in base decimale | |
| * | |
| * String num: numero da convertire | |
| * int base: base del numero da convertire | |
| * return: una stringa che rappresenza il numero num convertito in decimale | |
| * | |
| * Nota 1: Il metodo controlla che il numero in input sia valido | |
| * Nota 2: La conversione è assicurata solo per numeri interi positivi fino a Long.MAX_VALUE | |
| * Nota 3: base<=36 perché le cifre rappresentate con le lettere dell'alfabeto sono solo maiuscole | |
| */ | |
| public static String baseToDec(String num, int base) | |
| { | |
| String risultato = ERRORE; | |
| long risultato_num = 0; | |
| num = num.toUpperCase(); | |
| if (numeroValido_privato(num, base)) // Numero valido | |
| { | |
| if (base==1) // Se la base è 1 | |
| { | |
| int numero = num.length(); | |
| numero--; | |
| risultato = numero+""; | |
| } | |
| else if (base==10) // Se la base è già decimale | |
| { | |
| try | |
| { | |
| // non convertire niente | |
| long numero = new Long(num); // Ma rendilo almeno leggibile | |
| risultato = numero + ""; | |
| } | |
| catch(Exception e) | |
| { | |
| // Impossibile, tanto il numero è stato verificato prima, ed È decimale. In ogni caso... | |
| risultato = ERRORE; | |
| } | |
| } | |
| else // Per tutte le altre basi | |
| { | |
| risultato = ""; | |
| double j=num.length(); // Esponente per il calcolo | |
| for (int i=0; i<num.length(); i++) | |
| { | |
| j--; | |
| byte cifra = (byte)num.charAt(i); | |
| if (cifra<=57) cifra -= 48; | |
| else cifra -= 55; | |
| double conversione = cifra*(Math.pow(base, j)); | |
| risultato_num += conversione; | |
| } | |
| risultato = "" + risultato_num; | |
| } | |
| } | |
| else risultato = ERRORE; | |
| return risultato; | |
| } | |
| /** | |
| * Verifica se la cifra può essere espressa con la base indicata | |
| * | |
| * String num: numero da verificare | |
| * int base: base per la quale verificare | |
| * return: ritorna true se il numero può essere espresso nella base indicata | |
| * | |
| * Nota: il metodo è privato ed è più snello | |
| */ | |
| private static boolean numeroValido_privato(String num, int base) | |
| { | |
| /** | |
| * Intervalli | |
| * 0...9 = 48...57 | |
| * A...Z = 65...90 | |
| * la differenza tra il codice ascii della cifra e della base è: | |
| * --> 47 quando la base è minore di 10 | |
| * --> 54 quando la base è almeno 11 | |
| */ | |
| boolean valido = true; | |
| if ((base>0)&&(base<=36)) // Verifica che la base scelta sia gestibile | |
| { | |
| for (int i=0; (i<num.length())&&(valido); i++) | |
| { | |
| byte ascii = (byte)num.charAt(i); | |
| if (ascii==48) // Lo zero è compreso in tutte le basi | |
| { | |
| valido = true; | |
| } | |
| else | |
| { | |
| // Verifica che la cifra sia rappresentabile nella base indicata | |
| if (((ascii>48)&&(ascii<=57))||((ascii>=65)&&(ascii<=90))) | |
| { | |
| int differenza = 54; | |
| if (base<=10) differenza = 47; | |
| if ((ascii-base)<=differenza) valido = true; | |
| else valido = false; | |
| } | |
| else valido = false; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| valido = false; | |
| } | |
| return valido; | |
| } | |
| /** | |
| * Verifica se la cifra può essere espressa con la base indicata | |
| * | |
| * String num: numero da verificare | |
| * int base: base per la quale verificare | |
| * return: ritorna true se il numero può essere espresso nella base indicata | |
| */ | |
| public static boolean numeroValido(String num, int base) | |
| { | |
| /** | |
| * Intervalli | |
| * 0...9 = 48...57 | |
| * A...Z = 65...90 | |
| * la differenza tra il codice ascii della cifra e della base è: | |
| * --> 47 quando la base è minore di 10 | |
| * --> 54 quando la base è almeno 11 | |
| */ | |
| boolean valido = true; | |
| num = num.toUpperCase(); | |
| if ((base>0)&&(base<=36)) // Verifica che la base scelta sia gestibile | |
| { | |
| for (int i=0; (i<num.length())&&(valido); i++) | |
| { | |
| byte ascii = (byte)num.charAt(i); | |
| if (ascii==48) // Lo zero è compreso in tutte le basi | |
| { | |
| valido = true; | |
| } | |
| else | |
| { | |
| // Verifica che la cifra sia rappresentabile nella base indicata | |
| if (((ascii>48)&&(ascii<=57))||((ascii>=65)&&(ascii<=90))) | |
| { | |
| int differenza = 54; | |
| if (base<=10) differenza = 47; | |
| if ((ascii-base)<=differenza) valido = true; | |
| else valido = false; | |
| } | |
| else valido = false; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| valido = false; | |
| } | |
| return valido; | |
| } | |
| /** | |
| * Thread per salvaguardare la conversione più rischiosa: da decimale a base 1 | |
| */ | |
| public void run() | |
| { | |
| while(true) | |
| { | |
| try | |
| { | |
| Thread.sleep(100); | |
| } | |
| catch(Exception e){} | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * La finestra principale | |
| * | |
| * Autore: Antonio Bianco | |
| */ | |
| import java.awt.BorderLayout; | |
| import java.awt.Component; | |
| import java.awt.Dimension; | |
| import java.awt.GridLayout; | |
| import java.awt.Font; | |
| import java.awt.FlowLayout; | |
| import java.awt.Toolkit; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.awt.event.WindowEvent; | |
| import java.awt.event.WindowListener; | |
| import java.net.URL; | |
| import javax.swing.Action; | |
| import javax.swing.BoxLayout; | |
| import javax.swing.ComboBoxEditor; | |
| import javax.swing.event.ChangeEvent; | |
| import javax.swing.event.ChangeListener; | |
| import javax.swing.ImageIcon; | |
| import javax.swing.JFrame; | |
| import javax.swing.JButton; | |
| import javax.swing.JComboBox; | |
| import javax.swing.JComponent; | |
| import javax.swing.JCheckBox; | |
| import javax.swing.JLabel; | |
| import javax.swing.JMenuItem; | |
| import javax.swing.JOptionPane; | |
| import javax.swing.JPanel; | |
| import javax.swing.JPopupMenu; | |
| import javax.swing.JProgressBar; | |
| import javax.swing.JScrollPane; | |
| import javax.swing.JSpinner; | |
| import javax.swing.JSpinner.DefaultEditor; | |
| import javax.swing.JTabbedPane; | |
| import javax.swing.JTextArea; | |
| import javax.swing.JTextField; | |
| import javax.swing.SpinnerListModel; | |
| import javax.swing.SwingConstants; | |
| import javax.swing.SwingUtilities; | |
| import javax.swing.text.DefaultEditorKit; | |
| import java.util.HashMap; | |
| public class Finestra extends JFrame implements ActionListener, WindowListener, ChangeListener, Runnable | |
| { | |
| // Componenti grafici | |
| JButton btnConverti; | |
| JButton btnInverti; | |
| JButton btnEsci; | |
| JComboBox cbbDa; | |
| JComboBox cbbA; | |
| JProgressBar progress; | |
| JTextArea txtDa; | |
| JTextArea txtA; | |
| JPopupMenu menuDa, menuA; | |
| // Componenti grafici delle opzioni | |
| JComboBox cbbTemi; | |
| JComboBox cbbFont; | |
| JCheckBox ckbGrassetto; | |
| JCheckBox ckbCorsivo; | |
| JSpinner spnDimensioneFont; | |
| JTextArea txtAnteprima; | |
| // Stato del programma | |
| boolean conversione = false; | |
| /** | |
| * Costruttore | |
| */ | |
| public Finestra() | |
| { | |
| super("Sistemi di numerazione"); | |
| this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); | |
| this.addWindowListener(this); | |
| this.impostaIcona("img/48/binary.png"); | |
| // Inizializzazione dei font | |
| //font = new Font(Opzioni.FONT_NAME, Opzioni.FONT_STILE, Opzioni.FONT_SIZE); | |
| Font font = new Font(Opzioni.FONT_NAME, Opzioni.FONT_STILE, Opzioni.FONT_SIZE); | |
| // Inizializzazione della lista dei combo box | |
| String[] listacodifiche = new String[37]; | |
| listacodifiche[0] = "TESTO"; | |
| for (int i=1; i<listacodifiche.length; i++) | |
| { | |
| String voce = i+""; | |
| switch (i) | |
| { | |
| case 2: voce += " (BIN)"; | |
| break; | |
| case 8: voce += " (OCT)"; | |
| break; | |
| case 10: voce += " (DEC)"; | |
| break; | |
| case 16: voce += " (HEX)"; | |
| break; | |
| } | |
| listacodifiche[i] = voce; | |
| } | |
| /**************************** | |
| * Creazione dei componenti * | |
| ****************************/ | |
| // Creazione dei CheckBox | |
| ckbGrassetto = new JCheckBox("Grassetto"); | |
| if ((Opzioni.FONT_STILE==Font.BOLD)||(Opzioni.FONT_STILE==Font.BOLD+Font.ITALIC)) ckbGrassetto.setSelected(true); // Seleziona il componente solo se il testo è grassetto | |
| ckbGrassetto.addActionListener(this); | |
| ckbCorsivo = new JCheckBox("Corsivo"); | |
| if ((Opzioni.FONT_STILE==Font.ITALIC)||(Opzioni.FONT_STILE==Font.BOLD+Font.ITALIC)) ckbCorsivo.setSelected(true); // Seleziona il componente solo se il testo è corsivo | |
| ckbCorsivo.addActionListener(this); | |
| // Creazione dei combo box | |
| cbbDa = new JComboBox(listacodifiche); | |
| //cbbDa.setEditable(true); | |
| cbbDa.addActionListener(this); | |
| cbbA = new JComboBox(listacodifiche); | |
| //cbbA.setEditable(true); | |
| cbbA.addActionListener(this); | |
| cbbTemi = new JComboBox(Opzioni.TEMI); | |
| cbbTemi.setSelectedItem(Opzioni.TEMA_CORRENTE); // Seleziona il tema corrente | |
| cbbTemi.addActionListener(this); | |
| cbbFont = new JComboBox(Opzioni.LISTA_FONT); | |
| cbbFont.setSelectedItem(Opzioni.FONT_NAME); // Seleziona il font corrente | |
| cbbFont.setToolTipText(Opzioni.FONT_NAME); // Imposta il tooltip | |
| System.out.println("cbbFont.getPrototypeDisplayValue() = " + cbbFont.getPrototypeDisplayValue()); | |
| cbbFont.setPrototypeDisplayValue("1234567890123456789012345"); // Imposta la larghezza del combobox a 25 caratteri | |
| cbbFont.addActionListener(this); | |
| // Inizializzazione dello spinner per la dimensione dei font | |
| String[] dimensioniCaratteri = new String[100]; // Array delle dimensioni da utilizzare | |
| for (int i=0; i<100; i++) dimensioniCaratteri[i] = (i+1) + ""; // Si utilizzano dimensioni di carattere da 1 a 100 | |
| SpinnerListModel modelloDimensioneCaratteri = new SpinnerListModel(dimensioniCaratteri); // Si crea il modello di Spinner con le dimensioni di caratteri | |
| spnDimensioneFont = new JSpinner(modelloDimensioneCaratteri); // Si crea lo spinner con le dimensioni di caratteri da utilizzare | |
| { | |
| // Formatta il componente | |
| JComponent editor = spnDimensioneFont.getEditor(); | |
| if (editor instanceof DefaultEditor) | |
| { | |
| ((DefaultEditor)editor).getTextField().setColumns(3); // Imposta una larghezza per 3 caratteri | |
| ((DefaultEditor)editor).getTextField().setHorizontalAlignment(JTextField.RIGHT); // Allineamento del testo a destra | |
| } | |
| } | |
| // Visualizza la dimensione del font corrente | |
| spnDimensioneFont.setValue(Opzioni.FONT_SIZE+""); | |
| spnDimensioneFont.setToolTipText("Dimensione del font"); | |
| spnDimensioneFont.addChangeListener(this); | |
| // Inizializzazione dei bottoni | |
| btnConverti = new JButton("Converti"); | |
| btnConverti.setToolTipText("Converte nella base specificata"); | |
| btnConverti.addActionListener(this); | |
| btnInverti = new JButton("Inverti"); | |
| btnInverti.setToolTipText("Inverti i risultati nelle aree di testo"); | |
| btnInverti.addActionListener(this); | |
| btnEsci = new JButton("Esci"); | |
| btnEsci.setToolTipText("Esce dall'applicazione"); | |
| btnEsci.addActionListener(this); | |
| // Inizializzazione della ProgressBar | |
| progress = new JProgressBar(SwingConstants.HORIZONTAL); | |
| // Aree di testo con scrolling e testo monospace | |
| txtDa = new JTextArea(); | |
| txtDa.setFont(font); | |
| txtDa.setEditable(true); | |
| txtDa.setAutoscrolls(true); | |
| txtDa.setTabSize(2); | |
| txtDa.setLineWrap(true); | |
| txtDa.setWrapStyleWord(true); | |
| { | |
| /** | |
| * Crea le azioni copia/taglia/incolla per il componente | |
| * Crea il menu delle azioni | |
| * http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#commands | |
| */ | |
| HashMap<Object, Action> mappaAzioni = new HashMap<Object, Action>(); | |
| Action[] azioni = txtDa.getActions(); | |
| for (int i = 0; i < azioni.length; i++) mappaAzioni.put(azioni[i].getValue(Action.NAME), azioni[i]); | |
| menuDa = new JPopupMenu(); // Crea il menu per questo componente | |
| menuDa.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GRAY)); // Crea un bordo nero intorno al menu | |
| { | |
| JMenuItem menuTaglia = new JMenuItem(mappaAzioni.get(DefaultEditorKit.cutAction)); | |
| menuTaglia.setText("Taglia"); | |
| menuDa.add(menuTaglia); | |
| JMenuItem menuCopia = new JMenuItem(mappaAzioni.get(DefaultEditorKit.copyAction)); | |
| menuCopia.setText("Copia"); | |
| menuDa.add(menuCopia); | |
| JMenuItem menuIncolla = new JMenuItem(mappaAzioni.get(DefaultEditorKit.pasteAction)); | |
| menuIncolla.setText("Incolla"); | |
| menuDa.add(menuIncolla); | |
| menuDa.addSeparator(); | |
| JMenuItem menuSelezionaTutto = new JMenuItem(mappaAzioni.get(DefaultEditorKit.selectAllAction)); | |
| menuSelezionaTutto.setText("Seleziona tutto"); | |
| menuDa.add(menuSelezionaTutto); | |
| } | |
| txtDa.setComponentPopupMenu(menuDa); | |
| } | |
| JScrollPane scrollDa = new JScrollPane(txtDa); | |
| txtA = new JTextArea(); | |
| txtA.setFont(font); | |
| txtA.setEditable(true); | |
| txtA.setAutoscrolls(true); | |
| txtA.setTabSize(2); | |
| txtA.setLineWrap(true); | |
| txtA.setWrapStyleWord(true); | |
| { | |
| /** | |
| * Crea le azioni copia/taglia/incolla per il componente | |
| * Crea il menu delle azioni | |
| * http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#commands | |
| */ | |
| HashMap<Object, Action> mappaAzioni = new HashMap<Object, Action>(); | |
| Action[] azioni = txtA.getActions(); | |
| for (int i = 0; i < azioni.length; i++) mappaAzioni.put(azioni[i].getValue(Action.NAME), azioni[i]); | |
| menuA = new JPopupMenu(); // Crea il menu per questo componente | |
| menuA.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GRAY)); // Crea un bordo nero intorno al menu | |
| { | |
| JMenuItem menuTaglia = new JMenuItem(mappaAzioni.get(DefaultEditorKit.cutAction)); | |
| menuTaglia.setText("Taglia"); | |
| menuA.add(menuTaglia); | |
| JMenuItem menuCopia = new JMenuItem(mappaAzioni.get(DefaultEditorKit.copyAction)); | |
| menuCopia.setText("Copia"); | |
| menuA.add(menuCopia); | |
| JMenuItem menuIncolla = new JMenuItem(mappaAzioni.get(DefaultEditorKit.pasteAction)); | |
| menuIncolla.setText("Incolla"); | |
| menuA.add(menuIncolla); | |
| menuA.addSeparator(); | |
| JMenuItem menuSelezionaTutto = new JMenuItem(mappaAzioni.get(DefaultEditorKit.selectAllAction)); | |
| menuSelezionaTutto.setText("Seleziona tutto"); | |
| menuA.add(menuSelezionaTutto); | |
| } | |
| txtA.setComponentPopupMenu(menuA); | |
| } | |
| JScrollPane scrollA = new JScrollPane(txtA); | |
| txtAnteprima = new JTextArea("123 456 789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n000 111 .,' abcdefghijklmnopqrstuvwxyz", 2, 39); | |
| txtAnteprima.setFont(font); | |
| txtAnteprima.setEditable(false); | |
| txtAnteprima.setAutoscrolls(true); | |
| txtAnteprima.setTabSize(2); | |
| txtAnteprima.setLineWrap(true); | |
| txtAnteprima.setWrapStyleWord(true); | |
| /************************************************ | |
| * Posizionamento dei componenti nella finestra * | |
| ************************************************/ | |
| JTabbedPane pannelloTab = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT); | |
| pannelloTab.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); // Elimina l'artefatto grafico con un artefatto grafico. ESTIQAATZI. | |
| this.add(pannelloTab); | |
| JPanel pnlTabPrincipale = new JPanel(new BorderLayout()); | |
| pannelloTab.addTab("Codifica", pnlTabPrincipale); | |
| JPanel pnlGenerale = new JPanel(new BorderLayout()); // Pannello generale: comandi e barra di avanzamento | |
| pnlTabPrincipale.add(pnlGenerale, BorderLayout.CENTER); | |
| // Barra di avanzamento | |
| pnlTabPrincipale.add(progress, BorderLayout.SOUTH); | |
| // Aree di testo | |
| JPanel pnlAreeTesto = new JPanel(new GridLayout(1, 2)); | |
| pnlAreeTesto.add(scrollDa); | |
| pnlAreeTesto.add(scrollA); | |
| pnlGenerale.add(pnlAreeTesto, BorderLayout.CENTER); | |
| // Pannello dei controlli | |
| JPanel pnlControlli = new JPanel(new BorderLayout()); | |
| pnlGenerale.add(pnlControlli, BorderLayout.SOUTH); | |
| // Controlli orientati a sinistra | |
| { | |
| JPanel pnlComandi = new JPanel(new FlowLayout()); | |
| pnlComandi.add(btnConverti); | |
| pnlComandi.add(new JLabel("da")); | |
| pnlComandi.add(cbbDa); | |
| pnlComandi.add(new JLabel("a")); | |
| pnlComandi.add(cbbA); | |
| pnlControlli.add(pnlComandi, BorderLayout.WEST); | |
| } | |
| // Controlli orientati a destra | |
| { | |
| JPanel pnlComandi = new JPanel(new FlowLayout(FlowLayout.RIGHT)); | |
| pnlComandi.add(btnInverti); | |
| pnlComandi.add(btnEsci); | |
| pnlControlli.add(pnlComandi, BorderLayout.EAST); | |
| } | |
| /****************************************** | |
| * Posiziona i componenti nel secondo Tab * | |
| ******************************************/ | |
| JPanel pnlTabOpzioni = new JPanel(new BorderLayout()); | |
| pannelloTab.addTab("Opzioni", pnlTabOpzioni); | |
| JPanel pnlTabOpzioniSuperiore = new JPanel(); | |
| pnlTabOpzioniSuperiore.setLayout(new BoxLayout(pnlTabOpzioniSuperiore, BoxLayout.Y_AXIS)); | |
| { | |
| JPanel pnlTmp = new JPanel(new FlowLayout(FlowLayout.LEFT)); // Pannello di convenienza: serve a contenere le dimensioni del pannello pnlTabOpzioni; il layout allinea i componenti a sinistra | |
| pnlTmp.add(pnlTabOpzioniSuperiore); | |
| pnlTabOpzioni.add(pnlTmp, BorderLayout.NORTH); | |
| //pannelloTab.addTab("Opzioni", pnlTmp); | |
| } | |
| // Scelta del tema | |
| { | |
| JPanel pnlTema = new JPanel(new FlowLayout(FlowLayout.LEFT)); | |
| pnlTema.add(new JLabel("Tema grafico")); | |
| pnlTema.add(cbbTemi); | |
| pnlTabOpzioniSuperiore.add(pnlTema); | |
| } | |
| // Scelta del font | |
| { | |
| JPanel pnlFont = new JPanel(new FlowLayout(FlowLayout.LEFT)); | |
| pnlFont.add(new JLabel("Font")); // Nome del font | |
| pnlFont.add(cbbFont); | |
| pnlFont.add(ckbGrassetto); // Stile grassetto | |
| pnlFont.add(ckbCorsivo); // Stile corsivo | |
| pnlFont.add(spnDimensioneFont); // Dimensione del font | |
| pnlTabOpzioniSuperiore.add(pnlFont); | |
| } | |
| // Area per l'anteprima del testo | |
| pnlTabOpzioni.add(txtAnteprima, BorderLayout.CENTER); | |
| /***************************************************** | |
| * Crea il tab con le informazioni dell'applicazione * | |
| *****************************************************/ | |
| JPanel pnlTabInfo = new JPanel(new BorderLayout()); | |
| pannelloTab.addTab("Info", pnlTabInfo); | |
| { | |
| JPanel pnlCentrato = new JPanel(); // Pannello centrale | |
| pnlCentrato.setLayout(new BoxLayout(pnlCentrato, BoxLayout.Y_AXIS)); | |
| JLabel lblLogoProgramma = new JLabel(creaIcona("img/128/binary.png"), JLabel.CENTER); | |
| JPanel pnlLogo = new JPanel(); | |
| pnlLogo.add(lblLogoProgramma); | |
| JLabel lblTitolo = new JLabel("Sistemi Di Numerazione", JLabel.CENTER); | |
| lblTitolo.setFont(lblTitolo.getFont().deriveFont(Font.BOLD)); // Applica lo stile grassetto | |
| JPanel pnlTitolo = new JPanel(); | |
| pnlTitolo.add(lblTitolo); | |
| JLabel lblVersione = new JLabel("1.5", JLabel.CENTER); | |
| JPanel pnlVersione = new JPanel(); | |
| pnlVersione.add(lblVersione); | |
| JLabel lblDescrizione_1 = new JLabel("Il programma permette di convertire numeri interi positivi tra basi numeriche differenti.", JLabel.CENTER); | |
| JPanel pnlDescrizione_1 = new JPanel(); | |
| pnlDescrizione_1.add(lblDescrizione_1); | |
| JLabel lblDescrizione_2 = new JLabel("È possibile codificare il testo in ASCII rappresentato in diverse basi numeriche.", JLabel.CENTER); | |
| JPanel pnlDescrizione_2 = new JPanel(); | |
| pnlDescrizione_2.add(lblDescrizione_2); | |
| URLJLabel lblWebPage = new URLJLabel("www.antoniobianco.altervista.org/java/SistemiDiNumerazione", JLabel.CENTER, "http://www.antoniobianco.altervista.org/java/SistemiDiNumerazione/"); | |
| JPanel pnlWebPage = new JPanel(); | |
| pnlWebPage.add(lblWebPage); | |
| JLabel lblDiritti = new JLabel("Copyleft © 2011-2012 Antonio Bianco", JLabel.CENTER); | |
| JPanel pnlDiritti = new JPanel(); | |
| pnlDiritti.add(lblDiritti); | |
| URLJLabel lblLicenza = new URLJLabel(creaIcona("img/128/gplv3.png"), JLabel.CENTER, "http://www.gnu.org/licenses/gpl.html"); | |
| JPanel pnlLicenza = new JPanel(); | |
| pnlLicenza.add(lblLicenza); | |
| pnlCentrato.add(pnlLogo); | |
| pnlCentrato.add(pnlTitolo); | |
| pnlCentrato.add(pnlVersione); | |
| pnlCentrato.add(pnlDescrizione_1); | |
| pnlCentrato.add(pnlDescrizione_2); | |
| pnlCentrato.add(pnlWebPage); | |
| pnlCentrato.add(pnlDiritti); | |
| pnlCentrato.add(pnlLicenza); | |
| JPanel pnlCentratoPack = new JPanel(); // Pannello di convenienza per contenere le dimensioni | |
| pnlCentratoPack.add(pnlCentrato); | |
| pnlTabInfo.add(pnlCentratoPack, BorderLayout.CENTER); | |
| } | |
| Dimension dimensioni = Toolkit.getDefaultToolkit().getScreenSize(); | |
| setSize((int)(dimensioni.getWidth()/100*50), (int)(dimensioni.getHeight()/100*50)); | |
| setLocation((int)(dimensioni.getWidth()/2-getWidth()/2), (int)(dimensioni.getHeight()/2-getHeight()/2)); | |
| this.setVisible(true); | |
| txtDa.requestFocus(); // Setta il focus alla prima area di testo | |
| } | |
| /** | |
| * Avvia o ferma la conversione | |
| */ | |
| private void converti() | |
| { | |
| conversione= !conversione; | |
| } | |
| public void run() | |
| { | |
| while(true) // Mantiene il thread attivo | |
| { | |
| try | |
| { | |
| Thread.sleep(50); | |
| } | |
| catch(Exception e){} | |
| if(conversione) // Si muove solo quando inizia una conversione (es.: fronte di salita) | |
| { | |
| // Avviso sui numeri in base 1 | |
| if (cbbA.getSelectedIndex()==1) | |
| { | |
| if (JOptionPane.YES_OPTION!=JOptionPane.showConfirmDialog(this,"ATTENZIONE!\n\nL'usoimpropriopuòesserenocivotenerefuoridallaportatadeinabbini\nVuoi continuare ugualmente?", this.getTitle(), JOptionPane.YES_NO_OPTION)) | |
| { | |
| conversione = false; | |
| } | |
| //System.out.println("ATTENZIONE! L'usoimpropriopuòesserenocivotenerefuoridallaportatadeinabbini."); | |
| } | |
| // Preparazione alla conversione: viene eseguito una sola volta | |
| txtDa.setEditable(false); | |
| txtA.setEditable(false); | |
| btnConverti.setText("Stop"); | |
| btnConverti.setToolTipText("Ferma la conversione"); | |
| btnInverti.setEnabled(false); | |
| btnEsci.setEnabled(false); | |
| cbbDa.setEnabled(false); | |
| cbbA.setEnabled(false); | |
| progress.setIndeterminate(true); | |
| // Cicli di conversione | |
| while(conversione) | |
| { | |
| try | |
| { | |
| if (txtDa.getText().length()>0) // Converti solo se la lunghezza della stringa da convertire è maggiore di zero | |
| { | |
| int base_da = cbbDa.getSelectedIndex(); | |
| int base_a = cbbA.getSelectedIndex(); | |
| /** | |
| * Converti per: | |
| * TESTO → TESTO: prendi per il culo | |
| * TESTO → NUMERO: converte ciascun carattere in ascii al valore specificato nella base | |
| * NUMERO → TESTO: codifica ogni numero nel carattere corrispondente | |
| * NUMERO → NUMERO: facile | |
| */ | |
| txtA.setText(""); | |
| if ((base_da==0)&&(base_a==0)) // TESTO → TESTO: prendi per il culo | |
| { | |
| JOptionPane.showMessageDialog(this, "GUARDA...\nIo te lo scrivo lo stesso il risultato,\nMa tu promettimi di fare qualcosa per quei neuroni diversamente grigi che hai, OK?", this.getTitle(), JOptionPane.INFORMATION_MESSAGE); | |
| txtA.setText(txtDa.getText()); | |
| progress.setIndeterminate(false); | |
| } | |
| else if ((base_da==0)&&(base_a>0)) // TESTO → NUMERO: converte ciascun carattere in ascii al valore specificato nella base | |
| { | |
| String testo = txtDa.getText(); | |
| String risultato = ""; | |
| progress.setIndeterminate(false); | |
| progress.setMaximum(testo.length()); | |
| for (int i=0; (i<testo.length())&&(conversione); i++) | |
| { | |
| progress.setValue(i); | |
| if (base_a==1) | |
| { | |
| // converte in base 10 e poi in base 1 | |
| int intero = Integer.parseInt(Conversioni.charToBase(testo.charAt(i), 10)); | |
| long avanzamento = 0; | |
| long avanzamentoDaVisualizzare = 0; | |
| int stepAvanzamento = 50; | |
| for (int j=0; (j<=intero)&&(conversione); j++) // Per il ciclo alta tensione.. | |
| { | |
| risultato += "0"; | |
| avanzamento++; | |
| if (avanzamento>=avanzamentoDaVisualizzare) | |
| { | |
| txtA.setText(avanzamento + "/" + intero); | |
| avanzamentoDaVisualizzare = avanzamento + stepAvanzamento; | |
| if (avanzamentoDaVisualizzare>intero) avanzamentoDaVisualizzare=intero; | |
| } | |
| Thread.sleep(1); | |
| } | |
| if (conversione) // Se è finito bene | |
| { | |
| risultato += " "; | |
| } | |
| else // Se è stato interrotto | |
| { | |
| risultato = ""; | |
| JOptionPane.showMessageDialog(this, "La conversione è stata annullata dall'utente.", this.getTitle(), JOptionPane.INFORMATION_MESSAGE); | |
| } | |
| } | |
| else | |
| { | |
| risultato += Conversioni.charToBase(testo.charAt(i), base_a) + " "; | |
| } | |
| Thread.sleep(1); | |
| } | |
| risultato = risultato.trim(); // Toglie gli spazi iniziali e finali | |
| txtA.setText(risultato); | |
| progress.setValue(0); | |
| } | |
| else if ((base_da>0)&&(base_a==0)) // NUMERO → TESTO: codifica ogni numero nel carattere corrispondente | |
| { | |
| String[] numeri = txtDa.getText().split(" "); | |
| String risultato = ""; | |
| progress.setIndeterminate(false); | |
| progress.setMaximum(numeri.length); | |
| for (int i=0; (i<numeri.length)&&(conversione); i++) | |
| { | |
| String tmp = Conversioni.baseToDec(numeri[i], base_da); | |
| if (tmp.startsWith(Conversioni.ERRORE)) | |
| { | |
| conversione = false; | |
| JOptionPane.showMessageDialog(this, "Il numero da convertire non è espresso in base " + base_da, this.getTitle(), JOptionPane.WARNING_MESSAGE); | |
| } | |
| else | |
| { | |
| int ascii = new Integer(tmp); | |
| char[] carattere = Character.toChars(ascii); | |
| risultato += carattere[0] + ""; | |
| progress.setValue(i); | |
| } | |
| Thread.sleep(1); | |
| } | |
| risultato = risultato.trim(); // Toglie gli spazi iniziali e finali | |
| txtA.setText(risultato); | |
| progress.setValue(0); | |
| } | |
| else if ((base_da>0)&&(base_a>0)) // NUMERO → NUMERO: facile | |
| { | |
| String[] numeri = txtDa.getText().split(" "); | |
| String risultato = ""; | |
| progress.setIndeterminate(false); | |
| progress.setMaximum(numeri.length); | |
| for (int i=0; (i<numeri.length)&&(conversione); i++) | |
| { | |
| String tmp = Conversioni.baseToDec(numeri[i], base_da); | |
| if (tmp.startsWith(Conversioni.ERRORE)) | |
| { | |
| conversione = false; | |
| JOptionPane.showMessageDialog(this, "Il numero da convertire non è espresso in base " + base_da, this.getTitle(), JOptionPane.WARNING_MESSAGE); | |
| } | |
| else | |
| { | |
| progress.setValue(i); | |
| if (base_a==1) | |
| { | |
| Long intero = new Long(tmp); // Istruzione con pericolo di overflow | |
| if (intero > Conversioni.MAX_DEC) | |
| { | |
| conversione = false; | |
| JOptionPane.showMessageDialog(this, "Overflow:\nIl numero da convertire è maggiore di " + Conversioni.MAX_DEC, this.getTitle(), JOptionPane.WARNING_MESSAGE); | |
| } | |
| else | |
| { | |
| long avanzamento = 0; | |
| long avanzamentoDaVisualizzare = 0; | |
| int stepAvanzamento = 50; | |
| for (int j=0; (j<=intero)&&(conversione); j++) // Per il ciclo alta tensione... | |
| { | |
| risultato += "0"; | |
| avanzamento++; | |
| if (avanzamento>=avanzamentoDaVisualizzare) | |
| { | |
| txtA.setText(avanzamento + "/" + intero); | |
| avanzamentoDaVisualizzare = avanzamento + stepAvanzamento; | |
| if (avanzamentoDaVisualizzare>intero) avanzamentoDaVisualizzare=intero; | |
| } | |
| Thread.sleep(1); | |
| } | |
| if (conversione) // Se è finito bene | |
| { | |
| risultato += " "; | |
| } | |
| else // Se è stato interrotto | |
| { | |
| risultato = ""; | |
| JOptionPane.showMessageDialog(this, "La conversione è stata annullata dall'utente.", this.getTitle(), JOptionPane.INFORMATION_MESSAGE); | |
| } | |
| } | |
| } | |
| else | |
| { | |
| risultato += Conversioni.decToBase(tmp, base_a) + " "; | |
| } | |
| } | |
| Thread.sleep(1); | |
| } | |
| risultato = risultato.trim(); // Toglie gli spazi iniziali e finali | |
| txtA.setText(risultato); | |
| progress.setValue(0); | |
| } | |
| } | |
| else | |
| { | |
| JOptionPane.showMessageDialog(this, "Non credi che manchi qualcosa?", this.getTitle(), JOptionPane.INFORMATION_MESSAGE); | |
| txtDa.setText("Inserisci in questa casella il testo o il numero da convertire."); | |
| } | |
| conversione = false; | |
| } | |
| catch(Exception e) | |
| { | |
| // Qualsiasi errore di conversione | |
| conversione = false; | |
| } | |
| } | |
| // Fine della conversione (es.: fronte di discesa) | |
| progress.setIndeterminate(false); | |
| txtDa.setEditable(true); | |
| txtA.setEditable(true); | |
| btnConverti.setText("Converti"); | |
| btnConverti.setToolTipText("Converte nella base specificata"); | |
| btnInverti.setEnabled(true); | |
| btnEsci.setEnabled(true); | |
| cbbDa.setEnabled(true); | |
| cbbA.setEnabled(true); | |
| } | |
| } | |
| } | |
| /** | |
| * Aggiorna il font delle caselle di testo | |
| */ | |
| private void aggiornaFont() | |
| { | |
| Font font = new Font(Opzioni.FONT_NAME, Opzioni.FONT_STILE, Opzioni.FONT_SIZE); | |
| txtDa.setFont(font); | |
| txtA.setFont(font); | |
| txtAnteprima.setFont(font); | |
| } | |
| /** | |
| * Esce dal programma | |
| */ | |
| private void esci() | |
| { | |
| if (conversione) return; | |
| if (JOptionPane.YES_OPTION==JOptionPane.showConfirmDialog(this,"Vuoi uscire dall'inutility?", this.getTitle(), JOptionPane.YES_NO_OPTION)) | |
| { | |
| SistemiDiNumerazione.salvaOpzioni(); | |
| System.exit(0); | |
| } | |
| } | |
| /** | |
| * Crea un'icona generica per qualsiasi componente | |
| */ | |
| private ImageIcon creaIcona(String path) | |
| { | |
| URL imgURL = Finestra.class.getResource(path); | |
| if (imgURL != null) | |
| { | |
| return new ImageIcon(imgURL); | |
| } | |
| else | |
| { | |
| System.err.println("Impossibile trovare l'immagine " + path); | |
| return null; | |
| } | |
| } | |
| /** | |
| * Imposta l'icona per la finestra corrente | |
| */ | |
| private void impostaIcona(String path) | |
| { | |
| URL imgURL = Finestra.class.getResource(path); | |
| if (imgURL != null) | |
| { | |
| setIconImage(Toolkit.getDefaultToolkit().getImage(imgURL)); | |
| } | |
| else | |
| { | |
| System.err.println("Impossibile trovare " + imgURL.getPath() + "\nFile: " + imgURL.getFile()); | |
| } | |
| } | |
| /** | |
| * Ascoltatore dei bottoni | |
| */ | |
| public void actionPerformed(ActionEvent e) | |
| { | |
| if (e.getSource().equals((Object)btnConverti)) | |
| { | |
| converti(); | |
| } | |
| else if (e.getSource().equals((Object)btnInverti)) | |
| { | |
| String tmp = txtDa.getText(); | |
| txtDa.setText(txtA.getText()); | |
| txtA.setText(tmp); | |
| int indice = cbbDa.getSelectedIndex(); | |
| cbbDa.setSelectedIndex(cbbA.getSelectedIndex()); | |
| cbbA.setSelectedIndex(indice); | |
| } | |
| else if (e.getSource().equals((Object)cbbDa)) | |
| { | |
| //int scelta = cbbDa.getSelectedIndex(); | |
| //if (scelta==1) | |
| //{ | |
| // Barra di stato con Warning | |
| //JOptionPane.showMessageDialog(this, "ATTENZIONE!\n\nL'usoimpropriopuòesserenocivotenerefuoridallaportatadeinabbini", this.getTitle(), JOptionPane.WARNING_MESSAGE); | |
| //} | |
| } | |
| else if (e.getSource().equals((Object)cbbA)) | |
| { | |
| //int scelta = cbbA.getSelectedIndex(); | |
| //if (scelta==1) | |
| //{ | |
| // Barra di stato con Warning | |
| //JOptionPane.showMessageDialog(this, "ATTENZIONE!\n\nL'usoimpropriopuòesserenocivotenerefuoridallaportatadeinabbini", this.getTitle(), JOptionPane.WARNING_MESSAGE); | |
| //} | |
| } | |
| else if (e.getSource().equals((Object)cbbTemi)) | |
| { | |
| // Aggiorna il tema corrente | |
| Opzioni.TEMA_CORRENTE = (String)cbbTemi.getSelectedItem(); | |
| SistemiDiNumerazione.cambiaTema(); | |
| SwingUtilities.updateComponentTreeUI(menuDa); // Aggiorna il tema dei menu | |
| SwingUtilities.updateComponentTreeUI(menuA); | |
| /* | |
| * bug di Java6: JSpinner perde l'allineamento quando cambia Tema | |
| * CORRETTO | |
| */ | |
| JComponent editor = spnDimensioneFont.getEditor(); | |
| if (editor instanceof DefaultEditor) ((DefaultEditor)editor).getTextField().setHorizontalAlignment(JTextField.RIGHT); // Allineamento del testo a destra | |
| } | |
| else if (e.getSource().equals((Object)cbbFont)) | |
| { | |
| // Aggiorna il font corrente | |
| Opzioni.FONT_NAME = (String)cbbFont.getSelectedItem(); | |
| cbbFont.setToolTipText(Opzioni.FONT_NAME); | |
| aggiornaFont(); | |
| } | |
| else if ((e.getSource().equals((Object)ckbGrassetto))||(e.getSource().equals((Object)ckbCorsivo))) | |
| { | |
| // Aggiorna lo stile del font corrente | |
| Opzioni.FONT_STILE = 0; | |
| if (ckbGrassetto.isSelected()) | |
| { | |
| Opzioni.FONT_STILE = Font.BOLD; | |
| } | |
| if (ckbCorsivo.isSelected()) | |
| { | |
| Opzioni.FONT_STILE += Font.ITALIC; | |
| } | |
| aggiornaFont(); | |
| } | |
| else if (e.getSource().equals((Object)btnEsci)) | |
| { | |
| esci(); | |
| } | |
| else | |
| { | |
| System.out.println("DEBUG: Nessun'azione associata al componente."); | |
| } | |
| } | |
| /** | |
| * Ascoltatore del JSpinner | |
| */ | |
| public void stateChanged(ChangeEvent e) | |
| { | |
| if (e.getSource().equals((Object)spnDimensioneFont)) | |
| { | |
| try | |
| { | |
| Opzioni.FONT_SIZE = Integer.parseInt((String)spnDimensioneFont.getValue()); | |
| aggiornaFont(); | |
| } | |
| catch(Exception exc){} | |
| } | |
| } | |
| /** | |
| * Ascoltatore della finestra | |
| */ | |
| public void windowActivated(WindowEvent e) {} | |
| public void windowClosed(WindowEvent e) {} | |
| public void windowClosing(WindowEvent e) | |
| { | |
| esci(); | |
| } | |
| public void windowDeactivated(WindowEvent e) {} | |
| public void windowDeiconified(WindowEvent e) {} | |
| public void windowIconified(WindowEvent e) {} | |
| public void windowOpened(WindowEvent e) {} | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Questa classe conserva le informazioni che devono essere gestite da più classi | |
| * | |
| * Autore: Antonio Bianco | |
| */ | |
| import java.awt.Font; | |
| import java.util.HashMap; | |
| import java.util.Vector; | |
| public class Opzioni | |
| { | |
| // Istanza di variabili | |
| public static Vector<String> TEMI = new Vector<String>(); // Elenco dei temi disponibili | |
| public static HashMap<String, String> MAP_TEMI = new HashMap<String, String>(); // Hash Map dei temi(chiavi) e dei relativi nomi di classe(valori) | |
| public static Vector<String> LISTA_FONT = new Vector<String>(); // Lista dei font installati nel sistema | |
| public static boolean FONT_PERSONALIZZATO = false; // Specifica se il font che si sta utilizzando è personalizzato o predefinito | |
| // Opzioni da caricare/salvare | |
| public static String TEMA_CORRENTE = ""; // Tema corrente | |
| public static String FONT_NAME = ""; // Font selezionato | |
| public static int FONT_STILE = 0; // Stile del font selezionato | |
| public static int FONT_SIZE = 0; // Altezza del font selezionato | |
| // Opzioni di default | |
| public static String TEMA_DEFAULT = ""; // Tema predefinito di sistema | |
| public static String FONT_DEFAULT_NAME = Font.MONOSPACED; // Font predefinito | |
| public static int FONT_DEFAULT_STILE = Font.PLAIN; // Stile del font predefinito | |
| public static int FONT_DEFAULT_SIZE = 12; // Altezza del font predefinito | |
| /** | |
| * Costruttore della classe | |
| */ | |
| public Opzioni() | |
| { | |
| // Assolutamente NIENTE | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Avvia il programma | |
| * | |
| * Autore: Antonio Bianco | |
| */ | |
| import java.awt.Font; | |
| import java.awt.GraphicsEnvironment; | |
| import java.io.File; | |
| import java.io.FileReader; | |
| import java.io.FileWriter; | |
| import java.io.BufferedReader; | |
| import java.io.PrintWriter; | |
| import java.net.URL; | |
| import javax.swing.JFrame; | |
| import javax.swing.UIManager; | |
| import javax.swing.UIManager.LookAndFeelInfo; | |
| import javax.swing.SwingUtilities; | |
| import java.util.HashMap; | |
| public class SistemiDiNumerazione | |
| { | |
| /* | |
| * Avvia l'applicazione con il tema grafico scelto dell'utente | |
| */ | |
| public static String ABS_PATH; | |
| final static String OPZIONI = ".SistemiDiNumerazione.txt"; | |
| private static Finestra gui; | |
| public static void main(String args[]) | |
| { | |
| ABS_PATH = getAbsolutePath(); // Definisce il percorso assoluto dell'applicazione | |
| boolean argomento = false; | |
| leggiOpzioni(); | |
| // Applica il tema scelto | |
| // Carico la lista dei temi, vedo qual è il tema predefinito e nel frattempo vedo se il tema corrente è valido | |
| boolean temaCorrenteValido = false; | |
| try | |
| { | |
| String classeTemaPredefinito = UIManager.getSystemLookAndFeelClassName(); | |
| for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) | |
| { | |
| // Carico la lista dei temi disponibili | |
| Opzioni.MAP_TEMI.put(info.getName(), info.getClassName()); | |
| Opzioni.TEMI.add(info.getName()); | |
| // Identifico il tema predefinito | |
| if (classeTemaPredefinito.equals(info.getClassName())) Opzioni.TEMA_DEFAULT = info.getName(); | |
| // Vedo se il tema corrente è valido | |
| if (Opzioni.TEMA_CORRENTE.equals(info.getName())) temaCorrenteValido = true; | |
| } | |
| if (!temaCorrenteValido) Opzioni.TEMA_CORRENTE = Opzioni.TEMA_DEFAULT; // Se il tema corrente non è valido, seleziona il tema di default | |
| UIManager.setLookAndFeel(Opzioni.MAP_TEMI.get(Opzioni.TEMA_CORRENTE)); // Applico il tema valido | |
| } | |
| catch (Exception e) | |
| { | |
| System.err.println("Ecchitelo!"); | |
| } | |
| // Elenco i font di sistema | |
| String[] elencoFont = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); | |
| for (int i=0; i<elencoFont.length; i++) | |
| { | |
| Opzioni.LISTA_FONT.add(elencoFont[i]); | |
| } | |
| // Se il font delle opzioni non è stato trovato, usa il font di default: Font.MONOSPACED | |
| if (!Opzioni.LISTA_FONT.contains(Opzioni.FONT_NAME)) Opzioni.FONT_NAME = Opzioni.FONT_DEFAULT_NAME; | |
| // Se lo stile memorizzato nelle opzioni non è valido, prende lo stile di default: Font.PLAIN | |
| if ((Opzioni.FONT_STILE!=Font.PLAIN)&&(Opzioni.FONT_STILE!=Font.BOLD)&&(Opzioni.FONT_STILE!=Font.ITALIC)&&(Opzioni.FONT_STILE!=Font.BOLD+Font.ITALIC)) Opzioni.FONT_STILE = Font.PLAIN; | |
| // se la dimensione del font memorizzato nelle opzioni non è valido, prende la dimensione di default: 12 | |
| if (Opzioni.FONT_SIZE==0) Opzioni.FONT_SIZE = Opzioni.FONT_DEFAULT_SIZE; | |
| // Visualizza la finestra del programma | |
| //JFrame.setDefaultLookAndFeelDecorated(true); // DEBUG: Funziona solo su Metal. Gli altri sono troppo checche. | |
| gui = new Finestra(); | |
| new Thread(gui).start(); | |
| } | |
| /** | |
| * Legge il tema salvato nel file delle opzioni. | |
| * Ritorna false se il file è corrotto o inesistente | |
| */ | |
| private static void leggiOpzioni() | |
| { | |
| if (new File(OPZIONI).exists()) | |
| { | |
| // Il file esiste | |
| // Si sceglie il tema salvato | |
| try | |
| { | |
| FileReader streamOpzioni = new FileReader(OPZIONI); | |
| BufferedReader bufferOpzioni = new BufferedReader(streamOpzioni); | |
| Opzioni.TEMA_CORRENTE = bufferOpzioni.readLine(); | |
| Opzioni.FONT_NAME = bufferOpzioni.readLine(); | |
| Opzioni.FONT_STILE = Integer.parseInt(bufferOpzioni.readLine()); | |
| Opzioni.FONT_SIZE = Integer.parseInt(bufferOpzioni.readLine()); | |
| bufferOpzioni.close(); | |
| streamOpzioni.close(); | |
| } | |
| catch(Exception e){} | |
| } | |
| } | |
| /** | |
| * Salva le opzioni nel file | |
| */ | |
| public static void salvaOpzioni() | |
| { | |
| try | |
| { | |
| FileWriter fileOpzioni = new FileWriter(OPZIONI); | |
| PrintWriter fileOut = new PrintWriter(fileOpzioni); | |
| fileOut.println(Opzioni.TEMA_CORRENTE); | |
| fileOut.println(Opzioni.FONT_NAME); | |
| fileOut.println(Opzioni.FONT_STILE + ""); | |
| fileOut.println(Opzioni.FONT_SIZE + ""); | |
| fileOut.close(); | |
| fileOpzioni.close(); | |
| } | |
| catch(Exception e){} | |
| } | |
| /** | |
| * Ritorna il percorso assoluto dell'applicazione | |
| */ | |
| private static String getAbsolutePath() | |
| { | |
| URL fileURL = SistemiDiNumerazione.class.getResource("/"); | |
| if (fileURL == null) | |
| { | |
| return null; | |
| } | |
| else | |
| { | |
| return fileURL.getPath(); | |
| } | |
| } | |
| /** | |
| * Cambia il tema grafico in runtime | |
| */ | |
| public static void cambiaTema() | |
| { | |
| try | |
| { | |
| UIManager.setLookAndFeel(Opzioni.MAP_TEMI.get(Opzioni.TEMA_CORRENTE)); | |
| SwingUtilities.updateComponentTreeUI(gui); | |
| } | |
| catch (Exception e) | |
| { | |
| System.err.println(e.getMessage()); | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * JLabel cliccabile con URL | |
| * | |
| * Autore: Antonio Bianco | |
| * Copyright (c) 2012 | |
| */ | |
| import java.awt.Color; | |
| import java.awt.Cursor; | |
| import java.awt.Desktop; | |
| import java.awt.event.MouseEvent; | |
| import java.awt.event.MouseListener; | |
| import java.awt.font.TextAttribute; | |
| import java.net.URI; | |
| import java.util.Hashtable; | |
| import java.util.Map; | |
| import javax.swing.Icon; | |
| import javax.swing.JLabel; | |
| public class URLJLabel extends JLabel implements MouseListener | |
| { | |
| private String url; | |
| /** | |
| * Crea l'istanza di una URLJLabel senza immagine e nessun testo. | |
| */ | |
| public URLJLabel() | |
| { | |
| super(); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando l'immagine. | |
| */ | |
| public URLJLabel(Icon image) | |
| { | |
| super(image); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando l'immagine e l'url. | |
| */ | |
| public URLJLabel(Icon image, String url) | |
| { | |
| super(image); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando l'immagine e l'allineamento orizzontale. | |
| */ | |
| public URLJLabel(Icon image, int horizontalAlignment) | |
| { | |
| super(image, horizontalAlignment); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando l'immagine, l'allineamento orizzontale e l'url. | |
| */ | |
| public URLJLabel(Icon image, int horizontalAlignment, String url) | |
| { | |
| super(image, horizontalAlignment); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando il testo. | |
| */ | |
| public URLJLabel(String text) | |
| { | |
| super(text); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando il testo e l'url. | |
| */ | |
| public URLJLabel(String text, String url) | |
| { | |
| super(text); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando il testo, l'immagine e l'allineamento orizzontale. | |
| */ | |
| public URLJLabel(String text, Icon icon, int horizontalAlignment) | |
| { | |
| super(text, icon, horizontalAlignment); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando il testo, l'immagine e l'url. | |
| */ | |
| public URLJLabel(String text, Icon icon, String url) | |
| { | |
| super(icon); | |
| setText(text); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanza di una URLJLabel specificando il testo, l'immagine, l'allineamento orizzontale e l'url. | |
| */ | |
| public URLJLabel(String text, Icon icon, int horizontalAlignment, String url) | |
| { | |
| super(text, icon, horizontalAlignment); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanda di una URLJlabel specificando il testo e l'allineamento orizzontale. | |
| */ | |
| public URLJLabel(String text, int horizontalAlignment) | |
| { | |
| super(text, horizontalAlignment); | |
| setProprieta(); | |
| addMouseListener(this); | |
| } | |
| /** | |
| * Crea l'istanda di una URLJlabel specificando il testo, l'allineamento orizzontale e l'url. | |
| */ | |
| public URLJLabel(String text, int horizontalAlignment, String url) | |
| { | |
| super(text, horizontalAlignment); | |
| setProprieta(); | |
| setUrl(url); | |
| addMouseListener(this); | |
| } | |
| /** Imposta le proprietà del componente */ | |
| private void setProprieta() | |
| { | |
| setForeground(Color.BLUE); // Testo blu | |
| setCursor(new Cursor(Cursor.HAND_CURSOR)); // Cursore mano | |
| Map<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>(); | |
| map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); | |
| setFont(getFont().deriveFont(map)); | |
| } | |
| /** | |
| * Ritorna l'url | |
| */ | |
| public String getUrl() | |
| { | |
| return url; | |
| } | |
| /** | |
| * Imposta l'url | |
| */ | |
| public void setUrl(String url) | |
| { | |
| this.url = url; | |
| setToolTipText(url); | |
| } | |
| /** | |
| * Avvia l'url come se il componente avesse ricevuto il click. Ritorna false se si verifica un errore. | |
| */ | |
| public boolean click() | |
| { | |
| boolean errore = false; | |
| if (Desktop.isDesktopSupported()) | |
| { | |
| try | |
| { | |
| errore = true; // Controllo ridondante dell'errore | |
| Desktop.getDesktop().browse(new URI(url)); // Avvia l'url | |
| setForeground(Color.BLUE.darker()); // Testo blu scuro | |
| errore = false; | |
| } | |
| catch(Exception e) | |
| { | |
| errore = true; | |
| } | |
| } | |
| return errore; | |
| } | |
| /** Invoked when the mouse button has been clicked (pressed and released) on a component. */ | |
| public void mouseClicked(MouseEvent e) | |
| { | |
| click(); | |
| } | |
| /** Invoked when the mouse enters a component. */ | |
| public void mouseEntered(MouseEvent e) {} | |
| /** Invoked when the mouse exits a component. */ | |
| public void mouseExited(MouseEvent e) {} | |
| /** Invoked when a mouse button has been pressed on a component. */ | |
| public void mousePressed(MouseEvent e) {} | |
| /** Invoked when a mouse button has been released on a component. */ | |
| public void mouseReleased(MouseEvent e) {} | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment