A ver si este ejemplo te ayuda.
No se como construirás tú las interfaces Swing, supongo que con el GUI Builder de NetBeans, porque es lo que enseñan en todas partes.
Yo las hago escribiendo código, pero bueno, al fin y al cabo la lógica es la misma.
La interfaz que yo proponía era algo así:
Tres paneles, cada uno con sus botones y campos.
Cada panel se puede escribir como una clase independiente de las otras, así que cada botón puede acceder directamente a los campos que necesita para coger los datos y mostrar resultados.
En el ActionListener que escribimos para cada botón, le decimos con que campos ha de interactuar.
En mi caso, puesto que los escribo como clases independientes, es más fácil y queda más ordenado.
Si se hace con el
builder y escrito todo como un único form, puede quedar más caótico al estar todos los JTextField declarados en una misma clase.
Pero bueno, mientras a cada uno se le de un nombre adecuado, luego en los ActionListener tan solo hay que llamar a los que corresponda según la figura.
En mi caso, tengo una clase
PanelTriangulopublic class PanelTriangulo extends JPanel {
private JTextField campoAltura;
private JTextField campoBase;
private JTextField campoResultado;
private JButton btCalcular;
public PanelTriangulo() {
campoBase = new JTextField(8);
campoAltura = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/triangulo.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Base: ", campoBase));
add(new PanelCampo("Valor de Altura: ", campoAltura));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Triangulo")));
}
private class AccionCalcular implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
double base, altura;
if (campoBase.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor de la Base");
else if (campoAltura.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor de la Altura");
else {
base = Double.parseDouble(campoBase.getText());
altura = Double.parseDouble(campoAltura.getText());
campoResultado.setText(String.format("%.2f", (base * altura) / 2));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}
}
}
}
Otra clase
PanelCirculopublic class PanelCirculo extends JPanel {
private JTextField campoRadio;
private JTextField campoResultado;
private JButton btCalcular;
public PanelCirculo() {
campoRadio = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/circulo.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Radio: ", campoRadio));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Círculo")));
}
private class AccionCalcular implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
double radio;
if (campoRadio.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor del Radio");
else {
radio = Double.parseDouble(campoRadio.getText());
campoResultado.setText(String.format("%.2f", Math.PI * Math.pow(radio, 2)));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}
}
}
}
Y la clase
PanelCuadradopublic class PanelCuadrado extends JPanel {
private JTextField campoLado;
private JTextField campoResultado;
private JButton btCalcular;
public PanelCuadrado() {
campoLado = new JTextField(8);
campoResultado = new JTextField(8);
campoResultado.setEditable(false);
btCalcular = new JButton("Calcular");
btCalcular.addActionListener(new AccionCalcular());
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel lbImagen = new JLabel(new ImageIcon(this.getClass().getClassLoader().getResource("areasFigurasSwing/cuadrado.jpg")));
lbImagen.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
add(lbImagen);
add(new PanelCampo("Valor de Lado: ", campoLado));
JPanel pnBoton = new JPanel();
pnBoton.add(btCalcular);
add(pnBoton);
add(new PanelCampo("Area: ", campoResultado));
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(15, 15, 15, 15),
BorderFactory.createTitledBorder("Area del Cuadrado")));
}
private class AccionCalcular implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
double lado;
if (campoLado.getText().isBlank())
JOptionPane.showMessageDialog(null, "Introduzca valor del Lado");
else {
lado = Double.parseDouble(campoLado.getText());
campoResultado.setText(String.format("%.2f", lado * lado));
}
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Introduzca valores numéricos");
}
}
}
}
Todas ellas usan una pequeña clase llamada
PanelCampo que simplemente construye un subpanel con un JTextfield y un texto para acompañarlo con un JLabel:
public class PanelCampo extends JPanel {
public PanelCampo(String texto, JTextField campo) {
setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
add(new JLabel(texto));
add(campo);
}
}
Estas tres clases, se muestran en un mismo JFrame apilándolas en horizontal
public class Main extends JFrame {
public Main() {
setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
add(new PanelCuadrado());
add(new PanelCirculo());
add(new PanelTriangulo());
setTitle("Calcular Areas");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
Si no se quiere mostrar los tres paneles al mismo tiempo, se puede usar la clase JTabbedPane, con la cuál podemos crear paneles con "pestañas" para seleccionar la que queramos.
Solo hay que hacer un pequeño cambio en el constructor del JFrame:
public class Main extends JFrame {
public Main() {
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Cuadrado", new PanelCuadrado());
tabs.addTab("Círculo", new PanelCirculo());
tabs.addTab("Triangulo", new PanelTriangulo());
getContentPane().add(tabs);
setTitle("Calcular Areas");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
Y de esta forma, la interfaz queda un poco más cuqui: