NicolasB
NicolasB

Reputation: 5

Event Handling Swing components

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

Answers (2)

Mehmood Memon
Mehmood Memon

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

MadProgrammer
MadProgrammer

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...

You could...

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...

You could...

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...

You could...

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

Related Questions