构造函数中的Actionlisteners

时间:2012-02-05 20:57:23

标签: java swing

我正在尝试使用实现框架来创建NewCard类。如何将Actionlisteners添加到NewCard类的构造函数中的元素?我不能把Actionlistener放到构造函数中,当我把它放在外面时,元素“field”对于saveButtonListener块是不可见的。

第二个问题:try块中的类记录抛出两个异常,为什么尝试块生成错误?

package Interface;

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import Engine.*;

class NewCard extends JFrame
{         
    NewCard()
    {
        JFrame Card = new JFrame(); 
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("New Card");
        setSize(340, 580);  
        setVisible(true);
        Container contentPane = getContentPane();
        contentPane.setLayout(null);

        // Field

        JTextField field = new JTextField();
        contentPane.add(field);
        field.setBounds(110,15,200,25);

        // Button:

        JButton saveButton = new JButton("Save");
        powZawartosci.add(saveButton);
        saveButton.setBounds(95,495,150,25);

        saveButtonListener listener1 = new saveButtonListener();
        saveButton.addActionListener(listener1);
    }

    private class saveButtonListener implements ActionListener 
    {
        try
        {
            @Override
            public void actionPerformed(ActionEvent event) 
            {
                new Record(field.getText());
            }
        }
        catch(IOException e)
        {
            System.out.println("IOException");
        }
        catch(SQLException e)
        {
            System.out.println("SQLException");
        }
        finally
        {

        }
    }
}

3 个答案:

答案 0 :(得分:2)

关于:

  

我无法将Actionlistener放入构造函数中,...

谁说你不能?只需添加ActionListener ...

JButton saveButton = new JButton("Save");
saveButton.addActionListener(new SaveButtonListener()); // capitalize class names

或者您可以使用匿名内部类,甚至更好地使用AbstractActions。

编辑1:
关于:

  

第二个问题:try块中的类记录抛出两个异常,为什么尝试阻塞生成错误?

如果您对异常有疑问, 显示 异常会很有意义。

编辑2
关于:

class NewCard extends JFrame
{         
    NewCard()
    {
        JFrame Card = new JFrame();

为什么该类扩展JFrame并在从未使用的类中创建JFrame?最好不要让类扩展JFrame,而是在需要时创建JFrame。

答案 1 :(得分:2)

您可以将动作侦听器放在构造函数中,如下所示:

final JTextField field = new JTextField();
...
saveButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent event) {
      new Record(field.getText());
   }

});

答案 2 :(得分:2)

通过为侦听器创建适当的构造函数,将field传递给saveButtonListener

或者使用匿名听众,如Mersenne的回答所示。