Я нахожу что-то вроде JLabel наиболее полезным для типа компонента для части 'i' проблемы. JLabels, как и все компоненты, могут иметь добавленных слушателей мыши, и оттуда у вас есть необходимый доступ для запуска чего-либо, когда пользователь нажимает на него.
В приведенном ниже коде я использовал простой FlowLayout, который выглядит как логическая подгонка для обеспечения горизонтального выравнивания, если вы не хотите использовать GridBayLayout. В конечном итоге это будет зависеть от того, как вы настраиваете свой макет, но что-то вроде FlowLayout помогает в этих ситуациях.
Посмотрите на следующий код для примера:
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
final JFrame f = new JFrame();
f.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new FlowLayout());
JLabel l = new JLabel(new ImageIcon(Main.class.getResource("info.png")));
l.addMouseListener(new MouseAdapter(){
@Override
public void mouseReleased(MouseEvent e) {
JOptionPane.showMessageDialog(f, "Clicked");
}
});
p.add(new JRadioButton());
p.add(l);
f.add(p, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}