Dar*_*man 6 java swing dialog final anonymous-function
我偶然发现了这个技巧,从匿名内部类中获取一个值,该变量在外部类中声明.它有效,但感觉就像一个肮脏的黑客:
private int showDialog()
{
final int[] myValue = new int[1];
JPanel panel = new JPanel();
final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
JButton button = new JButton("Hit me!");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
myValue[0] = 42;
dialog.setVisible(false);
}
});
panel.add(button);
dialog.add(panel);
dialog.pack();
dialog.setVisible(true);
return myValue[0];
}
Run Code Online (Sandbox Code Playgroud)
(是的,我意识到这个例子可以用一个简单的替换JOptionPane
,但我的实际对话框要复杂得多.)内部函数坚持认为它与之交互的所有变量都是final
,但我不能将其声明myValue
为final,因为内部函数需要为其分配一个值.将它声明为1元素阵列解决了这个问题,但似乎它可能是某种坏事TM.我想知道是否a.)这是常见做法或b.)这可能导致任何严重问题.
这看起来确实很脏。我真的无法说出它有多“普遍”,而且我不知道你这样做会冒着世界毁灭的风险,但如果我需要这样的东西,我宁愿硬着头皮写一个成熟的内部类(而不是匿名类)来实现ActionListener
. 这样,您就可以让它影响其封闭类的字段,并根据需要调用封闭类中的其他方法。根据您到底在做什么,甚至可能值得全力以赴并子类化Dialog
来保存此逻辑。
作为一个额外的好处,非匿名内部类使调试变得不那么痛苦,因为您可以使用更多信息丰富的类标识符。