Bom dia galera,
Estou com um problema em uma tela Swing que estou fazendo. Não tive muitas oportunidades de desenvolver telas Swing mais complexas como as que estou fazendo agora … é provável que este meu erro seja algo simples, porém se puderem me dar algumas dicas ficarei agradecido.
Tenho uma tela onde possuem alguns combos aninhados.
[list]No primeiro combo o usuário irá escolher uma conexão dentre uma lista fornecida;[/list]
[list]Ao ser escolhida a conexão, a aplicação irá se conectar ao servidor para baixar as informações para carregar o segundo combo;[/list]
O meu problema esta sendo o seguinte:
Em algumas situações, não será possível se conectar com o servidor escolhido por indisponibilidade … neste caso, eu fiz o tratamento de exceções dentro do método que iria carregar os combos conforme pode ser visto logo abaixo.
O mais estranho é que eu faço o tratamento da exceção logando a mensagem com Log4J e mostrando uma mensagem amigável para o usuário através de um popup. Não existe nenhuma exceção sem este tipo de tratamento.
Porém, após a exceção, o combo de conexão fica bobo … é como se ele perdesse o ActionListener que inicialmente foi adicionado a ele.
Alguém teria alguma dica?!?
[]'s
CombosAninhados.java
import java.awt.Dimension;
public class CombosAninhados extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel labelConnection;
private JLabel labelCategory;
private JComboBox comboConnection;
private JComboBox comboCategory;
private JPanel panelGrid;
private JLabel labelProduct;
private JComboBox comboProduct;
private List<String> connections;
private static final String COMBO_CONNECTION_LABEL_SELECT = "Select";
public CombosAninhados() {
super("Combos aninhados");
setPreferredSize(new Dimension(400, 300));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(ScreenUtils.getBounds(400, 300, true));
getContentPane().setLayout(null);
this.connections = new ArrayList<String>();
this.connections.add("192.168.101.23:9810");
this.connections.add("192.168.102.23:9810");
this.connections.add("192.168.103.23:9810");
this.connections.add("192.168.104.23:9810");
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(null, "Combos Aninhados", TitledBorder.LEADING, TitledBorder.TOP, null, null));
panel.setBounds(10, 10, 359, 238);
getContentPane().add(panel);
panel.setLayout(null);
labelConnection = new JLabel("Conex\u00E3o");
labelConnection.setBounds(15, 30, 100, 14);
panel.add(labelConnection);
comboConnection = new JComboBox();
comboConnection.setBounds(115, 27, 230, 20);
panel.add(comboConnection);
labelCategory = new JLabel("Categoria");
labelCategory.setBounds(15, 58, 100, 14);
panel.add(labelCategory);
comboCategory = new JComboBox();
comboCategory.setBounds(115, 55, 230, 20);
comboCategory.setEnabled(false);
panel.add(comboCategory);
labelProduct = new JLabel("Produdo");
labelProduct.setBounds(15, 86, 100, 14);
panel.add(labelProduct);
comboProduct = new JComboBox();
comboProduct.setBounds(115, 83, 230, 20);
comboProduct.setEnabled(false);
panel.add(comboProduct);
panelGrid = new JPanel();
panelGrid.setBounds(15, 111, 330, 110);
panel.add(panelGrid);
comboConnectionInitialize();
setResizable(false);
setVisible(true);
}
private void comboConnectionInitialize() {
comboConnection.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
comboConnectionActionListener(e);
}
});
comboConnection.addItem(COMBO_CONNECTION_LABEL_SELECT);
for( String conn : this.connections ) {
comboConnection.addItem(conn);
}
}
private void comboCategoryInitialize(List<String> categories) {
comboCategory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
comboCategoryActionListener(e);
}
});
comboCategory.addItem(COMBO_CONNECTION_LABEL_SELECT);
for( String category : categories ) {
comboConnection.addItem(category);
}
comboCategory.setEnabled(true);
}
private void comboProductInitialize(List<String> products) {
comboProduct.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
comboCategoryActionListener(e);
}
});
comboProduct.addItem(COMBO_CONNECTION_LABEL_SELECT);
for( String product : products ) {
comboProduct.addItem(product);
}
comboProduct.setEnabled(true);
}
private void comboConnectionActionListener(ActionEvent evt) {
try {
JComboBox combo = (JComboBox) evt.getSource();
String selected = (String) combo.getSelectedItem();
if( COMBO_CONNECTION_LABEL_SELECT.equals(selected) ) {
// do nothing
} else {
ConnectionManager cm = ConnectionManager.getInstance();
cm.connect(selected);
List<String> categories = cm.getCategories();
comboCategoryInitialize(categories);
}
} catch (ConnectionRefusedException cre) {
throw new AppException("application.messages.connection.refused");
} catch (Exception e) {
throw new AppException();
}
}
private void comboCategoryActionListener(ActionEvent evt) {
try {
JComboBox combo = (JComboBox) evt.getSource();
String selected = (String) combo.getSelectedItem();
if( COMBO_CONNECTION_LABEL_SELECT.equals(selected) ) {
// do nothing
} else {
ConnectionManager cm = ConnectionManager.getInstance();
List<String> products = cm.getProducts(selected);
comboProductInitialize(products);
}
} catch (ConnectionRefusedException cre) {
throw new AppException("application.messages.connection.refused");
} catch (Exception e) {
throw new AppException();
}
}
public static void main(String[] args) {
new CombosAninhados();
}
}
AppException.java
import org.apache.log4j.Logger;
public class AppException extends RuntimeException {
public AppException() {
String message = MessageUtils.getString("application.messages.erro.generico");
Logger.getLogger(this.getClass()).error(message);
MessageUtils.showMessage(null, message, MessageUtils.ERROR_MESSAGE_TYPE);
}
public AppException(String message, Throwable cause) {
String msg = MessageUtils.getString(message);
Logger.getLogger(this.getClass()).error(msg, cause);
MessageUtils.showMessage(null, msg, MessageUtils.ERROR_MESSAGE_TYPE);
}
public AppException(String message) {
String msg = MessageUtils.getString(message);
Logger.getLogger(this.getClass()).error(msg);
MessageUtils.showMessage(null, msg, MessageUtils.ERROR_MESSAGE_TYPE);
}
public AppException(Throwable cause) {
Logger.getLogger(this.getClass()).error(cause);
MessageUtils.showMessage(null, cause.getMessage(), MessageUtils.ERROR_MESSAGE_TYPE);
}
}
ConnectionRefusedException.java
public class ConnectionRefusedException extends RuntimeException {
private static final long serialVersionUID = 1L;
private String message;
private Throwable cause;
public ConnectionRefusedException() { }
public ConnectionRefusedException(String message) {
this.message = message;
}
public ConnectionRefusedException(Throwable cause) {
this.cause = cause;
}
public ConnectionRefusedException(String message, Throwable cause) {
this.message = message;
this.cause = cause;
}
}
ConnectionManager.java
import java.util.ArrayList;
import java.util.List;
public class ConnectionManager {
private static ConnectionManager instance;
private ConnectionManager() { }
public static ConnectionManager getInstance() {
if ( instance == null ) instance = new ConnectionManager();
return instance;
}
public void connect(String server) {
try {
// try to connect
} catch( Exception e ) {
throw new ConnectionRefusedException(e);
}
}
public List<String> getCategories() {
return new ArrayList<String>();
}
public List<String> getProducts(String category) {
return new ArrayList<String>();
}
}