Jtable y Jcomboox

Hola soy nuevo en esta comunidad, recien empiezo a programar y tengo una duda. les pongo mi codigo y les explico que sucede.
package venta;

import java.awt.EventQueue;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import java.awt.Color;
import javax.swing.border.BevelBorder;
import java.awt.SystemColor;
import javax.swing.JSeparator;

///////////////////////////////////////////////////////
public class TeatroVentana extends JFrame {
private JComboBox combo1;
private JComboBox combo2;
private JTextField cantidad;
private DefaultTableModel modelo = new DefaultTableModel();
private JTable table = new JTable();
private JTable tablita;
private JTextField ganancia;

///////////////////////////////////////////////////////////////
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TeatroVentana frame = new TeatroVentana();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

///////////////////////////////////////////
public TeatroVentana() {
setResizable(false);
setTitle("Teatro");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 465, 382);
JPanel ventana = new JPanel();
ventana.setBackground(SystemColor.inactiveCaptionBorder);
ventana.setBorder(new BevelBorder(BevelBorder.LOWERED, new Color(0, 0, 0), null, null, null));
setContentPane(ventana);

combo1 = new JComboBox();
combo1.setFont(new Font("Arial", Font.PLAIN, 14));
combo1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
//
rellena(combo1.getSelectedIndex());
} catch (Exception e) {
e.printStackTrace();
}
}
});

combo2 = new JComboBox();
combo2.setFont(new Font("Arial", Font.PLAIN, 14));

JLabel lblBoletos = new JLabel("Boletos");
lblBoletos.setFont(new Font("Perpetua", Font.BOLD | Font.ITALIC, 25));
lblBoletos.setHorizontalAlignment(SwingConstants.CENTER);

cantidad = new JTextField();
cantidad.setHorizontalAlignment(SwingConstants.CENTER);
cantidad.setColumns(10);

JLabel lblCantidad = new JLabel("Cantidad:");
lblCantidad.setFont(new Font("Arial", Font.PLAIN, 14));

JButton btnAceptar = new JButton("Aceptar");
btnAceptar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hacerCompra();
}
});

JLabel lblAsientos = new JLabel("Asientos");
lblAsientos.setHorizontalAlignment(SwingConstants.CENTER);
lblAsientos.setFont(new Font("Perpetua", Font.BOLD | Font.ITALIC, 25));

JButton btnMapa = new JButton("Mapa");

tablita = new JTable();
tablita.setBorder(new BevelBorder(BevelBorder.RAISED, new Color(0, 0, 0), null, null, null));
tablita.setModel(modelo);
tablita.setBounds(new Rectangle(10, 60, 510, 370));
modelo.setColumnCount(4);
modelo.setRowCount(5);

modelo.setValueAt( 39 ,1 ,1 );
modelo.setValueAt( 38 ,2 ,1 );
modelo.setValueAt( 72 ,1 ,2 );
modelo.setValueAt( 48 ,2 ,2 );
modelo.setValueAt( 121,3 ,2 );
modelo.setValueAt( 153,1 ,3 );
modelo.setValueAt( 142,2 ,3 );
modelo.setValueAt( 15 ,3 ,3 );
modelo.setValueAt( 11 ,4 ,3 );

ganancia = new JTextField();
ganancia.setEditable(false);
ganancia.setColumns(10);

JLabel lblGanancia = new JLabel("Ganancia:");
lblGanancia.setFont(new Font("Arial", Font.PLAIN, 14));

GroupLayout gl_ventana = new GroupLayout(ventana);
gl_ventana.setHorizontalGroup(
gl_ventana.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_ventana.createSequentialGroup()
.addContainerGap()
.addGroup(gl_ventana.createParallelGroup(Alignment.TRAILING)
.addComponent(lblBoletos, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE)
.addGroup(gl_ventana.createSequentialGroup()
.addComponent(lblCantidad, GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(cantidad, GroupLayout.PREFERRED_SIZE, 66, GroupLayout.PREFERRED_SIZE))
.addComponent(combo2, 0, 208, Short.MAX_VALUE)
.addComponent(combo1, Alignment.LEADING, 0, 208, Short.MAX_VALUE)
.addComponent(btnAceptar, GroupLayout.PREFERRED_SIZE, 99, GroupLayout.PREFERRED_SIZE))
.addGap(20)
.addGroup(gl_ventana.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_ventana.createParallelGroup(Alignment.LEADING)
.addComponent(btnMapa)
.addComponent(tablita, GroupLayout.PREFERRED_SIZE, 203, GroupLayout.PREFERRED_SIZE)
.addGroup(gl_ventana.createSequentialGroup()
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblAsientos, GroupLayout.PREFERRED_SIZE, 203, GroupLayout.PREFERRED_SIZE)))
.addGroup(gl_ventana.createSequentialGroup()
.addComponent(lblGanancia)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(ganancia, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
gl_ventana.setVerticalGroup(
gl_ventana.createParallelGroup(Alignment.LEADING)
.addGroup(gl_ventana.createSequentialGroup()
.addContainerGap()
.addGroup(gl_ventana.createParallelGroup(Alignment.BASELINE)
.addComponent(lblBoletos, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
.addComponent(lblAsientos))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_ventana.createParallelGroup(Alignment.LEADING)
.addGroup(gl_ventana.createSequentialGroup()
.addComponent(tablita, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnMapa))
.addGroup(gl_ventana.createSequentialGroup()
.addComponent(combo1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(combo2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_ventana.createParallelGroup(Alignment.BASELINE)
.addComponent(cantidad, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(lblCantidad))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnAceptar)))
.addPreferredGap(ComponentPlacement.RELATED, 151, Short.MAX_VALUE)
.addGroup(gl_ventana.createParallelGroup(Alignment.BASELINE)
.addComponent(ganancia, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(lblGanancia))
.addContainerGap())
);
ventana.setLayout(gl_ventana);
init();
}
///////////////////////
void rellena(int num){
while (combo2.getModel().getSize() > 0) combo2.removeItemAt(0);
if(num==0){
combo2.addItem("Seleccione la Seccion");

}else if(num==1){
combo2.addItem("Seleccione la Seccion");
combo2.addItem("Seccion 1");
combo2.addItem("Seccion 2");
}else if(num==2){
combo2.addItem("Seleccione la Seccion");
combo2.addItem("Seccion 1");
combo2.addItem("Seccion 2");
combo2.addItem("Seccion 3");
}else if(num==3){
combo2.addItem("Seleccione la Seccion");
combo2.addItem("Seccion 1");
combo2.addItem("Seccion 2");
combo2.addItem("Seccion 3");
combo2.addItem("Seccion 4");

}
}
void init(){
while (combo1.getModel().getSize() > 0) combo1.removeItemAt(0);
combo1.addItem("Seleccione la Zona");
combo1.addItem("Zona 1");
combo1.addItem("Zona 2");
combo1.addItem("Zona 3");
}
void hacerCompra(){

}
}

Bueno resulta que el programa hasta este punto me muestra una tabla con datos, y la 2da combobox me muestran secciones dependiendo primera, lo que quiero lograr es que al momento de pulsar el boton, este dependiendo si en la combobox1 esta "Zona 1" y en la combobox esta "Seccion 1" y dependiendo el la cantidad ingresada en el txtfield "compra" por ejemplo ingreso 3, y al pulsar el boton este le reste 3 al 39 que esta en modelo.setValueAt( 39 ,1 ,1 ) modificando el valor de la tabla automaticamente.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Sugerencia

Hola. Me parece un caso de una pantalla con muchas reglas de negocio. Yo te sugiero lo siguiente:
Si puedes editar tu entrada para poner tu código entre tags < code> ... </code>

1. Especifica las reglas de negocio en algún documento y validarlas.
2. Verifica que no existan casos que no caigan en ninguna condición, ¿Si los hay debería haber algún tipo de comportamiento?
3. Te es posible aislar la lógica de comportamiento en otra clase. ¿Usas patrón MVC?
4. Sería bueno evitar el uso de código duro, ¿Puedes parametrizar las condiciones en algún archivo de configuración?

¿Existe alguna manera de invertir este control? ¿Que un componente decida que hacer según las condiciones?
Depende de tu estilo de programación, he visto lo siguiente:
a) Algunos cambian los listeners dependiendo de las condiciones.
b) Algunos invierten el control usando observadores para evitar bloqueos o comportamientos no esperados. Sobre todo si un evento dispara a otro y este puede volver a invocar al primero.
Saludos