2017-03-16 18 views
0

私はPythonで完成したアプリケーションを再作成するために、少しずつJavaを学習しようとしています。ライブラリ制御ソフトウェアです。イベントハンドリングでは問題があります。なぜなら、主にスウィングのことをよく知らずに本格的に行きましたが、私が行ったときにそれを理解するからです。ここでイベント処理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'メソッドとimportを含めるべきですが、できるだけ多くの他のコンポーネントを残しておいてください。 –

答えて

1

コアの問題はおそらくコンテキストの1つで、はおそらくSEHBVまたはloca_commitというボタンのコンテキストを持たないため、参照できません(コンテキスト外です)。

あなたがこの問題を解決するかもしれないいくつかの方法...

あなたは...

LocaHandlerのインスタンスへのloca_commitの参照を渡すことができますが、あなたがLocaHandlerを利用することを意図していない限りがあります複数のアクションを処理し、それは本当に意味がない、を意味している...

にあなたは可能性が...

だけ一つのことを行うためのLocaHandlerが責任を作り、いままでloca_commitが必要です。これは、あなたは... Actions API

どのようにこれまでの領域に

あなたを可能性がリードし...

JButtonActionEvent

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

actionCommandプロパティのサポートの使用これを作りますLocaHandlerの同じインスタンスを使用して複数のコマンドを処理できることを意味します(ifステートメントを展開して)

私の個人的な好み、単一の責任にハンドラに焦点を当て、アクションAPIまたは匿名クラスを使用することで、よくやったならば、それはクラスの再利用性を高めるだろう、それが動作することの

+0

ありがとうございました.3番目の解決方法が有効です。各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); 

これはこれを実行する単なる方法です。同じ結果を達成するための複数の他の方法があります。