jam*_*err 4 java swing final inner-classes
我无法制作一个关闭此挥杆的按钮并返回上一个挥杆菜单.我试过以下......
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();
}
});
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,它给了我错误
从内部类中访问局部变量框:需要声明为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()
}
Run Code Online (Sandbox Code Playgroud)
Hov*_*els 11
如上所述,您需要做的就是监听编译器并简单地使帧变量最终:
final JFrame frame = new JFrame("Image Details");
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使帧成为非静态类字段.
问题的原因是你试图在匿名内部类中使用局部变量,并且因为这些类会复制这些变量,如果变量没有标记为final,那么有可能是两个帧变量, local one和匿名类对象中的副本可能包含不同的值.
编辑
根据我的评论,你的问题很常见.有关该问题的详细信息,请参阅此可能重复的问题:为什么只能在匿名类中访问最终变量?.我打算投票把这个问题作为副本关闭,并鼓励其他人同意,以便对已接受的答案的评论进行阅读.答案的评论是真正答案的地方.