2017-03-16 4 views
0

Ich versuche, Java nach und nach zu lernen, eine Anwendung, die ich in Python abgeschlossen - eine Bibliothekssteuerungssoftware, sehr einfach. Ich habe jedoch Probleme mit Event Handling, hauptsächlich, weil ich (glaube ich) in Swing reingewachsen bin, ohne viel darüber zu wissen, aber ich habe es herausgefunden, während ich ging.Event Handling Swing-Komponenten

Hier ist mein Code so weit:

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 können sagen, dass ich versuche, das Klicken der loca_commit JButton zu behandeln. Ich versuche, einen Event-Handler zu erstellen - gemäß Java-Tutorials und anderen StackOverflow-Fragen/-Antworten - aber der Handler identifiziert loca_commit nicht. Im Moment versuche ich nur, es zum Laufen zu bringen, dann benutze ich es, um eine Methode aufzurufen, aber wenn ich es nicht schaffen kann, ein Pop-up zu erstellen, dann verstehe ich es.

Also, mein Code für die Behandlungsroutine ist so weit dies:

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); 
     } 

Können Sie Kerle hier ein Licht vergießen?

+0

BTW, das wichtigste ist bisher nur Dimensionierung und macht den Rahmen sichtbar, wirklich einfach. – NicolasB

+0

Hinweis: Wenn Sie herausfinden möchten, wie Sie einer Schaltfläche einen Aktionslistener hinzufügen, erfordert das Beispiel eine Schaltfläche und einen Aktionslistener, im Gegensatz zu 4 Schaltflächen, 3 Textbereichen, einer Reihe von Beschriftungen und Textfeldern, 3 Listen und Bild-Symbol .. * "BTW, das wichtigste ist bisher nur Größe und macht den Rahmen sichtbar" * Also müssten wir es vor dem Kompilieren ändern und den Code ausprobieren. Um eine bessere Hilfe zu erhalten, veröffentlichen Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/). Es sollte eine "Haupt" -Methode und die Importe einschließen, aber so viele der anderen Komponenten wie möglich herauslassen. –

Antwort

1

Das Kernproblem ist wahrscheinlich eine der Kontext, die LocaHandler hat wahrscheinlich keinen Kontext zu SEHBV oder die loca_commit Schaltfläche, so dass Sie nicht darauf verweisen können (es ist nicht im Zusammenhang).

Es gibt einige Möglichkeiten, wie Sie dieses Problem beheben könnte ...

könnte Sie ...

Pass eine Referenz von loca_commit auf die Instanz von LocaHandler, aber es sei denn, Sie nutzen LocaHandler machen soll mehrere Aktionen verarbeiten, es ist wirklich nicht sinnvoll sind, was bedeutet, ...

könnte Sie ...

Make LocaHandler verantwortlich für nur eine Sache zu tun, was auch immer loca_commit braucht es dazu. Dies führt Sie in das Reich der Actions API

Wie auch immer ...

könnte Sie ...

Nutzen Sie die actionCommand Eigenschaft Unterstützung von JButton und 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); 
} 

Diese bedeutet, dass Sie dieselbe Instanz von LocaHandler verwenden können, um mehrere Befehle zu verarbeiten (indem Sie die if-Anweisung erweitern)

Meine persönliche Präferenz ist es, die Aktionen API oder anonyme Klassen zu verwenden, auf dem Handler auf eine einzige Verantwortung konzentriert, wenn sie gut gemacht, es wird die Wiederverwertbarkeit der Klassen

+0

Danke, die dritte Lösung sollte funktionieren. Jedes JPanel (jede Registerkarte) führt mehrere Funktionen aus, also ist es optimal für meine Situation. – NicolasB

0

Eine Möglichkeit, die es Arbeit zu erhöhen befestigen action listener auf der Schaltfläche nach der Initialisierung. Versuchen Sie in Ihrem Fall Folgendes:

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); 

Denken Sie daran, dies ist nur eine Möglichkeit, dies zu tun. Es gibt mehrere andere Möglichkeiten, um das gleiche Ergebnis zu erzielen.