Reputation: 5
I'm trying to learn Java bit by bit, recreating an application I completed in Python - a library control software, very basic. I am having problems, though, with Event Handling, primarily because (I think) I went full-blown in to Swing without knowing much about it, but figuring it out as I went.
Here's my code, so far:
public class SEHBV extends JFrame{
public SEHBV(){
super("SEHBV Biblio 2.0");
ImageIcon img = new ImageIcon("books.ico");
setIconImage(img.getImage());
JPanel p_ini, locar, devolver, buscar, administrar;
JLabel l_dia, l_mes, l_ano, loca_cs, loca_cl, loca_prazo, loca_cb, locado_state;
JTextField dia, mes, ano, loca_cs_tf, loca_cl_tf, loca_prazo_tf, loca_cb_tf, devolve_cod;
JTextArea loca_prazo_data, loca_oper_res, mostra_multa;
JButton data, loca_cb_bt, loca_commit, ver_multa;
JList<String> loca_s_res, loca_cb_res, atrasos, locados;
p_ini = new JPanel(new GridBagLayout());
GridBagConstraints i = new GridBagConstraints();
l_dia = new JLabel("Dia: ");
l_mes = new JLabel("Mês: ");
l_ano = new JLabel("Ano: ");
dia = new JTextField(6);
mes = new JTextField(6);
ano = new JTextField(6);
data = new JButton("Afirmar Data");
atrasos = new JList<String>();
atrasos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
atrasos.setLayoutOrientation(JList.VERTICAL);
atrasos.setVisibleRowCount(10);
JScrollPane scroll_atrasos = new JScrollPane(atrasos);
atrasos.setBackground(Color.WHITE);
atrasos.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
i.fill = GridBagConstraints.HORIZONTAL;
i.gridx = 0;
i.gridy = 0;
p_ini.add(l_dia, i);
i.gridx = 1;
p_ini.add(dia, i);
i.gridx = 2;
p_ini.add(l_mes, i);
i.gridx = 3;
p_ini.add(mes, i);
i.gridx = 4;
p_ini.add(l_ano, i);
i.gridx = 5;
p_ini.add(ano, i);
i.gridx = 6;
p_ini.add(data, i);
i.gridy = 1;
i.gridx = 0;
i.gridwidth = 7;
p_ini.add(scroll_atrasos, i);
//GUI Locação
locar = new JPanel(new GridBagLayout());
GridBagConstraints l = new GridBagConstraints();
l.gridx = 0;
l.gridy = 0;
JPanel loca_socios = new JPanel(new FlowLayout());
JPanel loca_oper = new JPanel(new GridBagLayout());
GridBagConstraints o = new GridBagConstraints();
JPanel loca_busca = new JPanel(new GridBagLayout());
GridBagConstraints b = new GridBagConstraints();
locar.add(loca_socios, l); //Busca de Sócios na janela de Locação
loca_s_res = new JList<String>();
loca_s_res.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
loca_s_res.setLayoutOrientation(JList.VERTICAL);
loca_s_res.setModel(Runner.nome_socios);
loca_s_res.setVisibleRowCount(25);
JScrollPane scroll_loca_s = new JScrollPane(loca_s_res);
loca_s_res.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
loca_socios.add(scroll_loca_s);
l.gridx = 1;
locar.add(loca_oper, l); //Locação propriamente dita
o.weighty = 1;
o.weightx = 1;
o.anchor = GridBagConstraints.NORTHWEST;
o.insets = new Insets(1,1,1,1);
loca_cs = new JLabel("Código do Sócio: ");
o.fill = GridBagConstraints.HORIZONTAL;
o.gridx = 0;
o.gridy = 0;
loca_oper.add(loca_cs, o);
loca_cs_tf = new JTextField(5);
loca_cs_tf.setEditable(false);
loca_cs_tf.setBackground(Color.WHITE);
o.fill = GridBagConstraints.BOTH;
o.gridx = 1;
o.gridy = 0;
loca_oper.add(loca_cs_tf, o);
loca_cl = new JLabel("Código do Livro: ");
o.fill = GridBagConstraints.BOTH;
o.gridx = 0;
o.gridy = 1;
loca_oper.add(loca_cl, o);
loca_cl_tf = new JTextField(5);
o.fill = GridBagConstraints.BOTH;
o.gridx = 1;
o.gridy = 1;
loca_oper.add(loca_cl_tf, o);
loca_prazo = new JLabel("Prazo para devolução (em dias): ");
o.fill = GridBagConstraints.BOTH;
o.gridx = 0;
o.gridy = 2;
loca_oper.add(loca_prazo, o);
loca_prazo_tf = new JTextField(5);
o.fill = GridBagConstraints.BOTH;
o.gridx = 1;
o.gridy = 2;
loca_oper.add(loca_prazo_tf, o);
loca_prazo_data = new JTextArea();
loca_prazo_data.setBackground(getForeground());
o.gridx = 0;
o.gridy = 3;
o.gridwidth = 3;
loca_oper.add(loca_prazo_data, o);
loca_commit = new JButton("Realizar Locação");
o.fill = GridBagConstraints.BOTH;
o.gridx = 0;
o.gridy = 4;
o.gridwidth = 3;
loca_oper.add(loca_commit, o);
loca_oper_res = new JTextArea();
loca_oper_res.setBackground(getForeground());
o.gridy = 5;
loca_oper.add(loca_oper_res, o);
l.gridx = 2;
locar.add(loca_busca, l);
loca_cb = new JLabel("Chave de Busca: ");
b.fill = GridBagConstraints.HORIZONTAL;
b.gridx = 0;
b.gridy = 0;
loca_busca.add(loca_cb, b);
loca_cb_tf = new JTextField(20);
b.fill = GridBagConstraints.HORIZONTAL;
b.gridx = 1;
b.gridy = 0;
loca_busca.add(loca_cb_tf, b);
loca_cb_bt = new JButton("Busca Rápida");
b.fill = GridBagConstraints.HORIZONTAL;
b.gridx = 2;
b.gridy = 0;
loca_busca.add(loca_cb_bt, b);
loca_cb_res = new JList<String>();
loca_cb_res.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
loca_cb_res.setLayoutOrientation(JList.VERTICAL);
b.fill = GridBagConstraints.HORIZONTAL;
loca_cb_res.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
b.gridx = 0;
b.gridy = 1;
b.gridwidth = 3;
b.gridheight = 2;
loca_cb_res.setVisibleRowCount(25);
JScrollPane scroll_loca_cb = new JScrollPane(loca_cb_res);
loca_cb_res.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
loca_busca.add(scroll_loca_cb, b);
// Other Tabs of the GUI
//GUI Geral
JTabbedPane tp = new JTabbedPane();
tp.addTab("Página inicial (Alt+I)", null, p_ini, "pág. inicial");
tp.addTab("Locação (Alt+L)", locar);
tp.addTab("Devolução (Alt+D)", devolver);
tp.addTab("Busca Avançada (Alt+B)", buscar);
tp.addTab("Administração (Alt+A)", administrar);
tp.setMnemonicAt(0, KeyEvent.VK_I);
tp.setMnemonicAt(1, KeyEvent.VK_L);
tp.setMnemonicAt(2, KeyEvent.VK_D);
tp.setMnemonicAt(3, KeyEvent.VK_B);
tp.setMnemonicAt(4, KeyEvent.VK_A);
add(tp);
}
So, lets say I'm trying to handle the clicking of the loca_commit JButton
. I'm trying to create an Event Handler - according to Java tutorials and other StackOverflow questions/answers - but the handler does not identify loca_commit
. Right now I'm just trying to get it to work, then I'll use it for calling a method, but if I can't make it create a pop up, well, you get my point.
So, my code for the handler so far is this:
private class LocaHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
String string = "";
if(event.getSource()==loca_commit)
string=String.format("Botão Apertado");
JOptionPane.showMessageDialog(null, string);
}
Can you guys shed a light here?
Upvotes: 0
Views: 53
Reputation: 1139
One way of making it work is to attach action listener on button after initializing it. In your case, try the following:
loca_commit = new JButton("Realizar Locação");
//other code
loca_commit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Hello");
}
});
loca_oper.add(loca_commit, o);
Remember, this is just one way of doing it. There are multiple other ways to achieve the same result.
Upvotes: 0
Reputation: 347204
The core issue is probably one of context, the LocaHandler
probably doesn't have any context to SEHBV
or the loca_commit
button, so you can't reference it (it's out of context).
There are couple of ways you might fix this...
Pass a reference of loca_commit
to the instance of LocaHandler
, but unless you intended to make use of LocaHandler
to handle multiple actions, it really doesn't make sense, which means...
Make LocaHandler
responsible for only doing one thing, what ever loca_commit
needs it to. This leads you into the realm of the Actions API
How ever...
Make use of the actionCommand
property support of JButton
and ActionEvent
loca_commit = new JButton("Realizar Locação");
loca_commit.setActionCommand("locaCommit");
//...
private class LocaHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
String string = "";
if("locaCommit".equals(event.getActionCommand()))
string=String.format("Botão Apertado");
JOptionPane.showMessageDialog(null, string);
}
This means that you could use the same instance of LocaHandler
to handle multiple commands (by expanding the if
statement)
My personal preference is to use the Actions API or anonymous classes, focusing on the handlers to a single responsibility, if done well, it will increase the reusability of the classes
Upvotes: 1