java - 从内部类 : needs to be declared final error java swing 中访问局部变量

标签 java swing inner-classes final

<分区>

我在制作关闭此 Swing 并返回到上一个 Swing 菜单的按钮时遇到问题。我尝试了以下...

btnBack = new JButton("Back");
btnBack.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        MainMenu gui = new MainMenu(uname);
        gui.setVisible(true);
        gui.pack();
        gui.setLocationRelativeTo(null);
        frame.setVisible(false);
        frame.dispose();
    }
});

当我尝试这个时,它给了我错误

Local variable frame is accessed from within inner class: needs to be declared final

我已经修剪了我的代码,删除了我的 JDBC

public class newImageViewer implements ActionListener {

    JLabel lblInstru, lblInstruVal, lblInstrumentID, lblImgnameVal, lblImgtagVal, lblImgsizeVal, lblDateVal, lblImgpathVal, lblTakenbyVal, lblNoteVal, lblImgpath, lblTakenby, lblSalary, lblImgsize, lblDate, lblS,
            lblSVal, lblNote, lblImgtag, lblImgname, imagel;
    JTextField txtDate, txtImgpath, txtTakenby, txtImgname, txtImgtag, txtImgsize, txtNote, txtInstrumentID;
    JButton btnAdd, btnUpdate, btnDelete, btnPrev, btnNext, btnBack;
    ResultSet rs;
    private ImageIcon image1;
    String imagepath, uname;
    static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mysql";
    static final String USERNAME = "root";
    static final String PASSWORD = "root";

    public static void main(String[] args) {
        newImageViewer obj = new newImageViewer();
        obj.createUI();
    }

    private void createUI() {

        JFrame frame = new JFrame("Image Details");

        JPanel pnlInput = new JPanel(new GridLayout(4, 2));

        lblImgname = new JLabel("  Image Name : ");
        txtImgname = new JTextField();

        lblImgtag = new JLabel("  ImageTag : ");
        txtImgtag = new JTextField();

        lblDate = new JLabel("  Date Stamp : ");
        txtDate = new JTextField(15);

        lblImgpath = new JLabel("  Image Path : ");
        txtImgpath = new JTextField();

        lblTakenby = new JLabel("  Taken By : ");
        txtTakenby = new JTextField();

        lblImgsize = new JLabel("  Image Size : ");
        txtImgsize = new JTextField();

        lblNote = new JLabel("  Note : ");
        txtNote = new JTextField();

        lblInstrumentID = new JLabel("  Instrument ID : ");
        txtInstrumentID = new JTextField();

        pnlInput.add(lblImgname);
        pnlInput.add(txtImgname);

        pnlInput.add(lblImgtag);
        pnlInput.add(txtImgtag);

        pnlInput.add(lblImgsize);
        pnlInput.add(txtImgsize);

        pnlInput.add(lblNote);
        pnlInput.add(txtNote);

        pnlInput.add(lblDate);
        pnlInput.add(txtDate);

        pnlInput.add(lblImgpath);
        pnlInput.add(txtImgpath);

        pnlInput.add(lblTakenby);
        pnlInput.add(txtTakenby);

        pnlInput.add(lblNote);
        pnlInput.add(txtNote);

        pnlInput.add(lblInstrumentID);
        pnlInput.add(txtInstrumentID);

        JPanel pnlButton = new JPanel(new GridLayout(1, 3));

        btnAdd = new JButton("Add");
        btnAdd.addActionListener(this);

        btnUpdate = new JButton("Update");
        btnUpdate.addActionListener(this);

        btnDelete = new JButton("Delete");
        btnDelete.addActionListener(this);

        btnBack = new JButton("Back");
        btnBack.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                MainMenu gui = new MainMenu(uname);
                gui.setVisible(true);
                gui.pack();
                gui.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

        pnlButton.add(btnAdd);
        pnlButton.add(btnUpdate);
        pnlButton.add(btnBack);
        pnlButton.add(btnDelete);

        JPanel pnlNavigate = new JPanel(new GridLayout(1, 2));
        btnPrev = new JButton(" << ");
        btnPrev.setActionCommand("Prev");
        btnPrev.addActionListener(this);

        btnNext = new JButton(" >> ");
        btnNext.setActionCommand("Next");
        btnNext.addActionListener(this);

        pnlNavigate.add(btnPrev);
        pnlNavigate.add(btnNext);

        JPanel pnlNavAns = new JPanel(new GridLayout(4, 2));

        lblImgname = new JLabel("  Image Name : ");
        lblImgnameVal = new JLabel("Val");
        lblImgtag = new JLabel("  Image Tag : ");
        lblImgtagVal = new JLabel("Val");
        lblImgsize = new JLabel("  Image Size : ");
        lblImgsizeVal = new JLabel("Val");
        lblDate = new JLabel("  Date Stamp : ");
        lblDateVal = new JLabel("Val");
        lblImgpath = new JLabel("  Image Path : ");
        lblImgpathVal = new JLabel("Val");
        lblTakenby = new JLabel("  Taken By : ");
        lblTakenbyVal = new JLabel("Val");
        lblNote = new JLabel("  Note : ");
        lblNoteVal = new JLabel("Val");
        lblInstru = new JLabel("  Instrument ID : ");
        lblInstruVal = new JLabel("Val");

        pnlNavAns.add(lblImgname);
        pnlNavAns.add(lblImgnameVal);

        pnlNavAns.add(lblImgtag);
        pnlNavAns.add(lblImgtagVal);

        pnlNavAns.add(lblImgsize);
        pnlNavAns.add(lblImgsizeVal);

        pnlNavAns.add(lblDate);
        pnlNavAns.add(lblDateVal);

        pnlNavAns.add(lblImgpath);
        pnlNavAns.add(lblImgpathVal);

        pnlNavAns.add(lblTakenby);
        pnlNavAns.add(lblTakenbyVal);

        pnlNavAns.add(lblNote);
        pnlNavAns.add(lblNoteVal);

        pnlNavAns.add(lblInstru);
        pnlNavAns.add(lblInstruVal);



        final Container cn = frame.getContentPane();
        cn.setLayout(new BoxLayout(cn, BoxLayout.Y_AXIS));

        frame.add(pnlInput);
        frame.add(pnlButton);
        frame.add(pnlNavAns);
        frame.add(pnlNavigate);

        //If this will not be written, the only frame will be closed
        // but the application will be active.
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent evt) {

        String action = evt.getActionCommand();
        if (action.equals("Add")) {
            addOperation();
        } else if (action.equals("Update")) {
            updateOperation();
        } else if (action.equals("Delete")) {
            deleteOperation();
        } else if (action.equals("Prev")) {
            preNavigation();
        } else if (action.equals("Next")) {
            nextNavigation();
        }
    }
    private void addOperation()
    private void updateOperation()
    private void deleteOperation()
    private void preNavigation()
    private void nextNavigation()
    private void populateValue()

}

最佳答案

如前所述,您需要做的就是听取您的编译器并简单地使框架变量成为最终变量:

final JFrame frame = new JFrame("Image Details");

另一种解决方案是使框架成为非静态类字段。

问题的原因是您试图在匿名内部类中使用局部变量,并且由于这些类复制了这些变量,如果变量未标记为 final,则两个框架有可能变量,本地变量和匿名类对象中的副本,可能持有不同的值。


编辑
根据我的评论,您的问题很常见。有关该问题的详细信息,请参阅此可能重复的问题:Why are only final variables accessible in anonymous class? .我将投票决定将这个问题作为重复问题关闭,并鼓励其他人也这样做,以便阅读对已接受答案的评论。对答案的评论是真正的答案所在。

关于java - 从内部类 : needs to be declared final error java swing 中访问局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280796/

相关文章:

java - 迁移到 Android Studio 时进行转换

java - 在 Fitnesse 测试中检索 applicationContext

java - JProgressBar 未触发 setProgress 上的 propertyChange

java - Java Swing 中的 Sierpinski Gasket 实现仅有时出现

尽管存在 NoArgsConstructor,但出现 java.lang.InstantiationException

java - 如何在Java中实现递归方法中的引用传递

java - Android通过url设置ImageButton背景

java - HIbernate 给出未知实体异常

java - 自定义外观 Nimbus

java - 两个类制作同一个实例? java