codice:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import pack.Poligono;
class Area_by_Gauss_w extends JFrame {
private int numero_vertici;
private Double area;
final String descrizione = "<HTML>Con questo piccolo programma si sarà in grado di calcolare l'area di un qualsiasi poligono avendo tutte le coordinate
dei suoi punti rispetto a un generico piano cartesiano.
NB= L'unità di misura del risultato sarà come quella inserita e ovviamente elevata alla seconda.</HTML>";
private JTextField Est;
private JTextField Nord;
private int n;
private Poligono figura;
private JFrame p_ins;
public static void main(String args[]){
Area_by_Gauss_w risultato = new Area_by_Gauss_w();
}
public Area_by_Gauss_w(){
super("Area di Gauss");
JOptionPane.showMessageDialog(null, this.descrizione, "Descrizione Programma", JOptionPane.INFORMATION_MESSAGE);
this.setNVertici();
figura = new Poligono(new Integer(this.numero_vertici));
JOptionPane.showMessageDialog(null, "Bene ora inserisci i valori delle coordinate di tutti i punti", "Info", JOptionPane.INFORMATION_MESSAGE);
//
for(int n = 0; n < figura.getNumeroVertici(); n++) {
p_ins = new JFrame("Inserisci le coordinate del punto "+n);
GridLayout Layout_input = new GridLayout(5,1);
JDialog input = new JDialog(p_ins, p_ins.getTitle(), true);
input.setLayout(Layout_input);
input.add(new JLabel("Inserisci prima la Coordinata Est (X) e poi Nord (Y) del punto "+n+":"));
Est = new JTextField("0.00");
Nord = new JTextField("0.00");
JButton Reimposta = new JButton("Reimposta");
Reimposta.addActionListener(new Reset());
JButton Inserisci = new JButton("Inserisci!");
Inserisci.addActionListener(new Controlla());
Inserisci.addActionListener(new Inserisci());
input.add(Est);
input.add(Nord);
input.add(Inserisci);
input.add(Reimposta);
p_ins.getRootPane().setDefaultButton(Inserisci);
input.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
input.pack();
input.setVisible(true);
}
//esempio/////////////////////////////////////////////
/* figura.setCoordinateVertice(0,0.0,0.0);
figura.setCoordinateVertice(1,15.0,15.0);
figura.setCoordinateVertice(2,2.0,2.0);*/
//dati per la tabella
Object[][] dati;
String[] txt_colonne;
dati = new Object[figura.getNumeroVertici()][3];
txt_colonne = new String[3];
txt_colonne[0] = "Nome Punto";
txt_colonne[1] = "Est";
txt_colonne[2] = "Nord";
for(int n = 0; n < figura.getNumeroVertici(); n++) {
dati[n][0] = "Punto "+n;
dati[n][1] = figura.vertice[n].get_est();
dati[n][2] = figura.vertice[n].get_nord();
}
JTable tabella = new JTable(dati,txt_colonne);
//tabella.setFocusable(false); (non funz)
//tabella.setEditingRow(-1); (non funz)
figura.setArea_by_Gauss();
BorderLayout Layout1 = new BorderLayout();
super.setLayout(Layout1);
super.add(new JLabel(this.descrizione), BorderLayout.NORTH);
super.add(new JLabel("<HTML>Area della Figura:
"+figura.getArea()+"</HTML>"), BorderLayout.SOUTH);
super.add(tabella, BorderLayout.WEST);
super.pack();
super.setVisible(true);
}
public void setNVertici() {
this.numero_vertici = leggiNumero_Integer_from_JOptionPane();
//controllo
if (this.numero_vertici < 3) {
//System.out.println("Una figura ha almeno 3 vertici e corrisponde a un triangolo..reinserisci il numero di vertici!");
setNVertici();
}
}
private int leggiNumero_Integer_from_JOptionPane(){
while(true){
try {
String valore = JOptionPane.showInputDialog("Inserire per cortesia il numero di vertici della Figura.");
return Integer.parseInt(valore);
} catch (NumberFormatException exc){
JOptionPane.showMessageDialog(null, "Il valore inserito non è un numero. Per cortesia riprova", "Errore", JOptionPane.ERROR_MESSAGE);
}
}
}
private Double leggiDouble_from_String(String s) {
while(true) {
try{
double n = Double.parseDouble(s);
return new Double(n);
} catch (NumberFormatException exc) {
JOptionPane.showMessageDialog(null, "Il valore inserito non è un numero. Per cortesia riprova", "Errore", JOptionPane.ERROR_MESSAGE);
}
}
}
//Ascoltatori
private class Reset implements ActionListener {
public void actionPerformed(ActionEvent e) {
Est.setText("0.00");
Nord.setText("0.00");
}
}
private class Inserisci implements ActionListener {
public void actionPerformed(ActionEvent e)
{
double est = 0;
double nord = 0;
try
{
est = Double.parseDouble(Est.getText());
nord = Double.parseDouble(Nord.getText());
}
catch (NumberFormatException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
figura.setCoordinateVertice(n,new Double(est),new Double(nord));
//new WindowEvent(p_ins,WindowEvent.WINDOW_CLOSED);
//new WindowEvent(p_ins,202);
//JFrame.EXIT_ON_CLOSE;
p_ins.setVisible(false);
}
}
private class Controlla implements ActionListener {
public void actionPerformed(ActionEvent e) {
leggiDouble_from_String(Est.getText());
leggiDouble_from_String(Nord.getText());
}
}
}
Alcuni commenti:
-Dovresti gestire meglio le eccezioni che parseDouble può lanciare.
-usi Double e Integer in luogo di int e double. Questa è una buona cosa finche ti limiti a fare in modo che le interfacce dei metodi (parametri e valori di ritorno) usino questi wrappers ma per lavorare all'interno dei metodi (somme,moltiplicazioni,differenze) usa i tipi primitivi,ti semplifichi la vita fidati..
-il tuo codice era pieno di errori di conversione da double a Double ed altri che non permettevano nemmeno la compilazione, conme hai fatto a vedere che la finestra non si chiudeva?????
-Se quello che vuoi ottenere e che la finestra per l'inserimento delle coordinate si chida per lasciar posto alla successiva una volta premuto "inserisci" a me funziona benissimo (una volta corretti gli errori di cui sopra)!
Non so che dirti.