By named, you seem to mean storing the button instance in a local variable of your immediate method. Attempting to avoid that is likely to make your code more difficult to read. But to answer your question:
The most obvious way is to use the old but newly-popular double-brace idiom.
alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}});
Note, in this case as i is not final it will not be usable from the anonymous inner class. Either assign it to another (final) variable or reformulate the loop.
Another route would be to go via an Action. (Usually I'd suggest avoiding Actions as they are jsut a poor man's Hashtable. ButtonModel is "good" though.)
alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
public void actionPerformed(ActionEvent event) {
...
}
}));
Then of course there is the application specific library way:
Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
alphabetForm.button("<html><center>" + c, new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}