2017-03-16 101 views
0

我试图一点一点地学习Java,重新创建一个我在Python中完成的应用程序 - 一个非常基本的库控制软件。不过,我遇到了问题,主要是因为(我认为)我完全不知道太多关于Swing的内容,但是在我去的时候把它弄清楚了。事件处理Swing组件

这里是我的代码,到目前为止:

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

因此,可以说,我想处理loca_commit JButton的点击。我试图创建一个事件处理程序 - 根据Java教程和其他StackOverflow问题/答案 - 但处理程序不识别loca_commit。现在我只是试图让它起作用,然后我会用它来调用一个方法,但是如果我不能让它弹出来,那么你明白了我的观点。

所以,我对处理程序到目前为止代码是这样的:

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

你们可以流下了光吗?

+0

顺便说一句,目前为止的主要内容仅仅是确定尺寸,使框架可见,真正的基础。 – NicolasB

+0

注意:当试图找出如何将动作侦听器添加到按钮时,该示例需要一个按钮和一个动作侦听器,而不是4个按钮,3个文本区域,一堆标签和文本字段,3个列表,一个图像图标.. *“顺便说一句,目前为止的主要内容是调整大小并使框架可见”*所以我们需要在编译和尝试代码之前对其进行更改。为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。它应该包括一个'main'方法和进口,但尽可能多地留下其他组件。 –

回答

1

核心问题可能是上下文之一,LocaHandler可能没有任何上下文SEHBVloca_commit按钮,所以你不能引用它(它是超出上下文)。

有几个你可能会解决这个问题的方法...

你可以...

传递的loca_commitLocaHandler实例的引用,但除非你打算利用LocaHandler到处理多个动作,真的没有任何意义,这意味着...

你可以...

LocaHandler只负责做一两件事,什么都loca_commit需要它。这导致你进入Actions API

如何过......

你可以...

利用actionCommand属性支持的JButton的和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); 
} 

这意味着您可以使用相同的LocaHandler实例来处理多个命令(通过扩展if语句)

我个人的偏好是使用操作API或者匿名类,注重处理到一个责任,如果做不好,反而会增加类的可重用性

+0

谢谢,第三个解决方案应该可以工作。每个JPanel(每个选项卡)执行多个功能,所以它对我的情况是最佳的。 – NicolasB

0

一个使它的工作方式是附加初始化它后,按钮上的动作监听器。在你的情况下,请尝试以下操作:

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

请记住,这只是一种方法。还有其他多种方法可以实现相同的结果。