Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Usuario Invitado

#331
Java / Re: Ordenar por nombre y sueldo
20 Marzo 2015, 15:45 PM
El código que expuse hace eso. sortByName ordena por nombres. En caso hayan dos o más empleados con nombres iguales (muy raro en una misma empresa pero puede suceder), se ordenarán por sueldo. He modificado un poco SortTest:

Código (java) [Seleccionar]
List<Employee> employees = new ArrayList<>();
        Collections.addAll(employees,
                           new Employee(1, "Homer Simpson", 3500d),
                           new Employee(2, "Peter Griffin", 3000d),
                           new Employee(3, "Bugs Bunny", 3500d),
                           new Employee(4, "Chris Redfield", 2500d),
                           new Employee(5, "Alice Abernathy", 3500d),
                           new Employee(6, "Bugs Bunny", 4200d) // nuevo elemento
                          );


Y como puedes ver en la salida, aunque Bugs Bunny aparezca dos veces en la lista de empleados, se ordenan de acuerdo al sueldo. Esto lo hace automáticamente compare. Si dos propiedades son idénticas, compara la siguiente propiedad en busca de diferencias para poder ordenar.


Ordenando por nombre...

ID: 5
Nombres: Alice Abernathy
Salario: 3500.0
ID: 3
Nombres: Bugs Bunny
Salario: 3500.0
ID: 6
Nombres: Bugs Bunny
Salario: 4200.0
ID: 4
Nombres: Chris Redfield
Salario: 2500.0
ID: 1
Nombres: Homer Simpson
Salario: 3500.0
ID: 2
Nombres: Peter Griffin
Salario: 3000.0


Dime qué cosas no entiendes del código y trataré de explicártelo.
#332
Compila:

javac -cp path/to/classes.jar Main.java

Ejecuta:

java -cp .;path/to/classes.jar Main
#333
Foro Libre / Re: El hacking y la soledad (?)
20 Marzo 2015, 00:57 AM
Muy cierto drvy. La cannabis natural no la considero una droga tan destructiva, la prefiero mil veces que al tabaco. Claro, la cannabis pura, porque acá en mi país algunos le meten muchos químicos y esa no la fumo ni de broma xD.

Lamentablemente si se hace un hábito a largo plazo pasa factura.
#334
Foro Libre / Re: El hacking y la soledad (?)
20 Marzo 2015, 00:10 AM
En el contexto en lo que dice, obviamente no se refiere al café. Lo que yo replico, es que no dé ese tipo de "consejos" que no son nada "buenos" (me refiero a ser bueno para tu salud física, emocional y psicológica). Lo de follar y trollear bueno, son excepciones  ;D


Saludos
#335
Foro Libre / Re: El hacking y la soledad (?)
19 Marzo 2015, 23:52 PM
Obviamente bueno es lo que evita que te sucedan cosas malas. Me parece sin sentido discutir sobre filosofía cuando se toca un tema delicado.

Respecto a:

Citar¿Es bueno lo que da diversión?

¿Diversión? ¿Estás haciendo referencia a que drogarse con los nefastos efectos que tiene en la salud es divertido?

[...]
#336
Foro Libre / Re: El hacking y la soledad (?)
19 Marzo 2015, 22:40 PM
Las drogas no son buenas y punto. No puedes aconsejar a que el muchacho se drogue, no es ético ni lógico. Es como decirle, "mátate lentamente!".
#337
Java / Re: Ordenar por nombre y sueldo
19 Marzo 2015, 22:37 PM
No te compliques, usa Comparator para hacer comparaciones personalizadas:

Employee.java

Código (java) [Seleccionar]
public class Employee {
   private Integer id;
   private String names;
   private Double salary;
   
   public Employee() {}
   
   public Employee(Integer id, String names, Double salary) {
       this.id = id;
       this.names = names;
       this.salary = salary;
   }
   
   public Integer getId() { return id; }
   
   public void setId(Integer id) { this.id = id; }
   
   public String getNames(){ return names; }
   
   public void setNames(String names) { this.names = names; }
   
   public Double getSalary() { return salary; }
   
   public void setSalary(Double salary) { this.salary = salary; }
   
   @Override
   public String toString() {
       return "ID:\t"+id+"\nNombres:\t"+names+"\nSalario:\t"+salary;
   }
   
}


EmployeeUtil.java

Código (java) [Seleccionar]
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class EmployeeUtil {
   
   public static void sortByName(List<Employee> employees) {
       Collections.sort(employees, new Comparator<Employee> () {
           @Override
           public int compare(Employee one, Employee two) {
               return one.getNames().compareTo(two.getNames());
           }
       });
   }
   
   public static void sortBySalary(List<Employee> employees) {
       Collections.sort(employees, new Comparator<Employee> () {
           @Override
           public int compare(Employee one, Employee two) {
               return one.getSalary().compareTo(two.getSalary());
           }
       });
   }
}


SortTest.java

Código (java) [Seleccionar]
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class SortTest {
   public static void main(String[] args) {
       List<Employee> employees = new ArrayList<>();
       Collections.addAll(employees,
                          new Employee(1, "Homer Simpson", 3500d),
                          new Employee(2, "Peter Griffin", 3000d),
                          new Employee(3, "Bugs Bunny", 3500d),
                          new Employee(4, "Chris Redfield", 2500d),
                          new Employee(5, "Alice Abernathy", 3500d)
                         );
       
       System.out.println("Ordenando por nombre...\n");
       EmployeeUtil.sortByName(employees);
       for(Employee employee : employees)
           System.out.println(employee);
       
       System.out.println("\nOrdenando por sueldo...\n");
       EmployeeUtil.sortBySalary(employees);
       for(Employee employee : employees)
           System.out.println(employee);
                         
   }
}


Como puedes ver, el método sort de Collections acepta un objeto Comparator que implementa el método compare que lo puedes sobreescribir para hacer una comparación personalizada a través de compareTo. Como puedes observar, he personalizado dos sobreescrituras de compare para uno ordene por nombres y el otro por salario.

Resultado de la ejecución:


> run SortTest
Ordenando por nombre...

ID: 5
Nombres: Alice Abernathy
Salario: 3500.0
ID: 3
Nombres: Bugs Bunny
Salario: 3500.0
ID: 4
Nombres: Chris Redfield
Salario: 2500.0
ID: 1
Nombres: Homer Simpson
Salario: 3500.0
ID: 2
Nombres: Peter Griffin
Salario: 3000.0

Ordenando por sueldo...

ID: 4
Nombres: Chris Redfield
Salario: 2500.0
ID: 2
Nombres: Peter Griffin
Salario: 3000.0
ID: 5
Nombres: Alice Abernathy
Salario: 3500.0
ID: 3
Nombres: Bugs Bunny
Salario: 3500.0
ID: 1
Nombres: Homer Simpson
Salario: 3500.0
#338
Java / Re: Meter un Frame dentro de otro Frame
19 Marzo 2015, 21:29 PM
Te repito por tercera vez. Esto no debe ir:

Código (java) [Seleccionar]
class AcercaDe implements ActionListener{  // Clase interna

241. public void actionPerformed(ActionEvent e){

242. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(InterfazAWT_AEMET.this);

243. ventanaAcercaDe.setVisible(true);

244. }

245. }//Acerca de

246.

247.

248. //****Acciones menu archivo****

249. class GuardarArchivo implements ActionListener {

250. public void actionPerformed(ActionEvent e) {

251.

252. }

253. }//Guardar en un fichero

254.

255. class CargarArchivo implements ActionListener {

256. public void actionPerformed(ActionEvent e) {

257.

258. }

259. }//Cargar desde un archivo

260.

261. class Salir implements ActionListener {

262. public void actionPerformed(ActionEvent e) {

263.

264. }

265. }//Salir de la aplicacion

266.

267.

268.

269.

270.

271. //Ordena por nombre las poblaciones

272. class OrdenarNombre implements ActionListener {

273. public void actionPerformed(ActionEvent e) {

274.

275. }

276. }

277.

278. //Ordena por numero de habitantes las poblaciones

279. class OrdenarHabitantes implements ActionListener {

280. public void actionPerformed(ActionEvent e) {

281.

282. }

283. }

284.

285. //Modifica los valores de una poblacion

286. class ModPoblacion implements ActionListener {

287. public void actionPerformed(ActionEvent e) {

288.

289. }

290. }

291.

292. //Mueve una poblacion de provincia

293. class MovPoblacion implements ActionListener {

294. public void actionPerformed(ActionEvent e) {

295.

296. }

297. }

298.

299.

300.

301.

302.

303.

304.

305. //Accion actualizar prediccion

306. class ActualizarPrediccion implements ActionListener {

307. public void actionPerformed(ActionEvent e) {

308.

309. }

310. }


Esto es reemplazado por el MainWindowController:

Código (java) [Seleccionar]
@Override
public void actionPerformed(ActionEvent evt) {
   String targetLabel = evt.getActionCommad();
   evaluateAction(targetLabel);
}

private void evaluateAction(String targetLabel) {
   switch(targetLabel) {
       case "Nueva Provincia": new NewProvinceDialog(gui).setVisible(true); break;
       case "Nueva Población": new NewPopulationDialog(gui).setVisible(true); break;
       case "Salir": gui.dispose();
       // asi con todos los botones
   }
}




AlmacenProvincias (ProvinceService)

Vuelvo a repetir, NO mezclar la lógica de negocio con la vistas. Aplica el patrón MVC que es mucho más sencillo, si te empeñas en seguir mezclando las cosas así, llegarás a un punto donde te estanques porque simplemente no hay arquitectura en tu aplicación, se convertirá en un montón de código sin sentido.

Veamos como puedes realizar lo que deseas. Primero, ProvinceService será un Map:

Código (java) [Seleccionar]
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ProvinceService extends LinkedHashMap<String, Set<Population>> {

private static ProvinceService instance;

   static { instance = new ProvinceService(); }

   private ProvinceService() {}
   
   public ProvinceService getInstance() { return instance; }

public String addProvince(String provinceName) throws IllegalArgumentException {
       String response = null;
       if(this.containsKey(provinceName))
           throw new IlegalArgumentException("La provincia ya existe");
else {
           this.put(provinceName, null);
           response = "Provinca añadida correctamente";
       }
       return response;
}

public String addPopulation(String provinceName, Population population) throws IllegalArgumentException {
       String response = null;
if(!this.containsKey(provinceName)) {
throw new IlegalArgumentException("La provincia no existe, primero créela");
} else {
Set<Population> provincePopulation = getPopulationByProvinceName(provinceName);
provincePopulation.add(population);
response = "Provincia añadida correctamente";
}
return response;
}

public String addProvinceAndPopulation(String provinceName, Population population) throws IllegalArgumentException {
String response = null;
if(!this.containsKey(provinceName)) {
Set<Population> provincePopulation = new HashSet<>();
provincePopulation.add(population);
provincesAndPopulations.put(provinceName, provincePopulation);
response = "Provincia y población añadida correctamente";
} else {
           throw new IlegalArgumentException("La provincia ya existe. Agregue solo la población");
       }
return response;
}

private Set<Population> getPopulationByProvinceName(String provinceName) {
Set<Population> population = null;
for(Map.Entry<String, Set<Population>> entry : this.entrySet()) {
if(entry.getKey().equals(provinceName))
population = entry.getValue();
}
return population;
}

}


MainWindowController.java

Código (java) [Seleccionar]
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class MainWindowController implements ActionListener {
private MainWindow gui;

public MainWindowController(MainWindow gui) {
this.gui = gui;
}

@Override
public void actionPerformed(ActionEvent e) {
String targetLabel = evt.getActionCommad();
       evaluateAction(targetLabel);
}
   
   private void evaluateAction(String targetLabel) {
       switch(targetLabel) {
           case "Nueva Provincia":
               new NewProvinceDialog(gui).setVisible(true); break;
           case "Nueva Población":
               new NewPopulationDialog(gui).setVisible(true); break;
           case "Salir": gui.dispose();
           // asi con todos los botones
       }
   }

}


NewProvinceDialog.java

Código (java) [Seleccionar]
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class NewProvinceDialog extends JDialog {
private static final long serialVersionUID = -3369879094143739366L;
private JTextField txtProvince;
private JButton btnAddProvince;

public NewProvinceDialog(JFrame parent) {
super(parent);
initComponents(parent);
}

private void initComponents(JFrame parent) {
JPanel panel = new JPanel(new GridBagLayout());
JLabel label = new JLabel("Nombre de la provincia:");
txtProvince = new JTextField();
btnAddProvince = new JButton("Agregar");

GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weighty = 1.0;
panel.add(label, constraints);

constraints = new GridBagConstraints();
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 3;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.HORIZONTAL;
panel.add(txtProvince, constraints);

constraints = new GridBagConstraints();
constraints.gridx = 3;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.EAST;
panel.add(btnAddProvince, constraints);

this.add(panel);
this.setTitle("Agregar nueva provincia");
this.setSize(280,100);
this.setModal(true);
this.setLocationRelativeTo(parent);
this.setResizable(false);

}
   
   // getters de los controles
   public JTextField getTxtProvince() { return txtProvince; }

}


NewProvinceDialogController.java

Código (java) [Seleccionar]
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class NewProvinceDialogController implements ActionListener {
   private NewProvinceDialog gui;
   
   public NewProvinceDialogController(NewProvinceDialog gui) {
       this.gui = gui;
   }
   
   @Override
   public void actionPerformed(ActionEvent evt) {
       String targetLabel = evt.getActionCommand();
       if(targetLabel.equals("Añadir")) {
           try {
               ProvinceService provinceService = ProvinceService.getInstance();
               String provinceName = gui.getTxtProvince().getText();
               String response = provinceService.addProvince(provinceName);
               new JOptionPane.showMessageDialog(response);
           } catch (IllegalArgumentException e) {
               // muestra 'La provinca ya existe'
               JOptionPane.showMessageDialog(gui, e.getMessage());
           }
       } else {
           gui.dispose();
       }
   }
   
}





ProvinceService la he transformado para que sea un LinkedHashMap. Como te dije será un Singleton (No es nada de extraordinario, es una clase normal solo que su constructor es privado evitando que sea creen instancias de ella) que será compartida por todos los objetos.

En NewProvinceDialogController hacemos uso de ProvinceService:

Código (java) [Seleccionar]
@Override
   public void actionPerformed(ActionEvent evt) {
       String targetLabel = evt.getActionCommand();
       if(targetLabel.equals("Añadir")) {
           try {
               ProvinceService provinceService = ProvinceService.getInstance();
               String provinceName = gui.getTxtProvince().getText();
               String response = provinceService.addProvince(provinceName);
               new JOptionPane.showMessageDialog(response);
           } catch (IllegalArgumentException e) {
               // muestra 'La provinca ya existe'
               JOptionPane.showMessageDialog(gui, e.getMessage());
           }
       } else {
           gui.dispose();
       }
   }


Si se ha clickeado "Añadir" en el JDialog para añadir una nueva provincia, se obtiene la única instancia de ProvinceService que como ya dijimos es un LinkedHashMap. Así mismo, sigue teniendo los mismos métodos por lo que todo sigue funcionando como antes. Obtenemos el JTextField txtProvince de NewProvinceDialog y usamos el método getText() para obtener lo que el usuario ha escrito. Luego, llamamos al método addProvince que se encargará de verificar si existe o si no existe y tomar la acción adecuada. Si la provincia existe mostrará un mensaje que es el que se le asocia a la Exception lanzada desde el método addProvince:

Código (java) [Seleccionar]
throw new IllegalArgumentException("La provincia ya existe");

Que luego recojemos en el controlador de NewProvinceDialogController:

Código (java) [Seleccionar]
catch (IllegalArgumentException e) {
   // muestra 'La provinca ya existe'
   JOptionPane.showMessageDialog(e.getMessage());
}


Si la provincia se añadió correctamente, el mensaje de éxito retornado se muestra:

Código (java) [Seleccionar]
String response = provinceService.addProvince(provinceName);
JOptionPane.showMessageDialog(response);



Sigue el mismo patrón. De ésta manera modularizas bien tu aplicación y le das una arquitectura sólida, claves para un diseño escalable  ;)
#339
Java / Re: Problema con jcheckbox
19 Marzo 2015, 20:35 PM
Buenas tardes,

¿Hay alguna razón por la que deseas implementar ItemStateChange en JCheckBox?

Generalmente se utiliza con JComboBox para saber dinámicamente qué elemento se ha elegido del JComboBox. En JCheckBox no le veo mucha utilidad. El problema que tú tienes es que creas un array de JCheckBox de los cuales no tienes control. Sería mucho más sencillo, práctico y eficiente en términos de buenas prácticas de programación que declares como propiedades los controles con los cuales vas a interactuar.

Código (java) [Seleccionar]
private JCheckBox cbxDebito, cbxCredito, ...

Luego validas qué JCheckBox está activo desde el evento un JButton, por ejemplo:

Código (java) [Seleccionar]
@Override
public void actionPerformed(ActionEvent evt) {
    if(cbxDebito.isSelected()) {
        // hacer algo para débito
    } else {
           // hacer algo para crédito
    }
}
#340
Java / Re: Problema con jcheckbox
19 Marzo 2015, 05:16 AM
¿Podrías explicar con más detalle exactamente qué deseas hacer?