Botão jradio com link de informações
-
19-09-2019 - |
Pergunta
Quero ter um conjunto de JRadiobuttons e ao lado de cada um um pouco de imagem 'I' que, quando clicado, abrirá uma nova janela com informações sobre o texto ao lado do botão de rádio. Qual é o melhor componente a ser usado para alinhar a pequena etiqueta 'i' ao lado do botão de rádio?
Solução
Existem algumas possibilidades para fazer isso com estilo.
O mais simples é obviamente colocar um JButton
com a imagem "I" ao lado do botão de rádio. Usando o gerenciador de layout certo (GridBagLayout
Claro) permitirá que você se alinhe facilmente.
Outro pode ser definir uma propriedade do cliente no botão de rádio e deixar o renderizador do botão de rádio (no look'n'feel) usar esta propriedade cliente para exibir o ícone "i" ao lado do botão. Infelizmente, é um pouco mais difícil implementar, pois exige que você gerencie corretamente os limites do botão de rádio para inclusão da imagem quando necessário (que também é alcançado no LNF, mas não é fácil de encontrar).
Outras dicas
Passe sua imagem como um javax.swing.ImageIcon
para o construtor do JRadioButton
. Em seguida, ouça o mouse clica no botão e verifique se as coordenadas do ponteiro do mouse estão dentro dos limites da sua imagem.
Acho algo como um jlabel o mais útil para o tipo de componente para a parte 'i' do problema. JLABELS como todos os componentes podem ter ouvintes do mouse adicionados a eles e, a partir daí, você tem o acesso necessário para acionar algo quando o usuário clicar em um.
No código abaixo, usei um fluxo simples, pois parece um ajuste lógico para fornecer o alinhamento horizontal se você não gosta de usar um gridbaylayout. Por fim, dependerá de como você está configurando seu layout, mas algo como um FlowLayout ajuda nessas situações.
Veja o código a seguir para um exemplo:
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);
}
});
}
}