我偶然發現了從匿名內部類獲取值到在外部類中聲明的變量的技巧。它的工作原理,但感覺像一個骯髒的黑客:對匿名內部類使用最終的1元素數組
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];
}
(是的,我知道這個例子可以用一個簡單的JOptionPane
更換,但我的實際對話框要複雜得多)的內部函數堅持所有變量它與final
交互,但我不能將myValue
聲明爲final,因爲內部函數需要爲其分配一個值。聲明它是一個1元素數組解決了這個問題,但好像它可能是一個壞東西TM莫名其妙。我想知道是否a。)這是常見做法,或b。)這樣做可能會導致任何嚴重問題。
int'vs'Integer'的好處,但實際上有很多不同的類型(通常不是原始的)可以通過這些對話框訪問,所以這是一件小事。另外,因爲在這種情況下,對話框是模式化的,不能在沒有按下按鈕的情況下關閉,所以幾乎可以保證不成爲問題。 –