Olá, eu gostaria de saber neste tópico como eu faço para chamar uma caixa de dialogo com um JSlider?
Dúvida sobre caixa de dialogo
11 Respostas
Acredito que difícilmente você pensará em algo que não daria pra se fazer de um jeito ou de outro.
A resposta é sim e aqui está um exemplo de como eu fiz (código meramente ilustrativo, porém funcional):
class MyJFrame extends JFrame implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
this.setTitle( Integer.toString( slider.getValue() ) );
if ( slider.getValue() == 60 ) {
JDialog dialog = new JDialog(this, "Abrindo JDialogs!!!" );
dialog.setVisible(true);
}
}
}
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new MyJFrame();
JSlider slider = new JSlider();
slider.addChangeListener((ChangeListener) frame);
frame.add( slider );
frame.setVisible(true);
frame.pack();
}
}
Os pontos chaves são:
- Seu
JFrame(ou equivalente) precisa implementar a interfaceChangeListener. - Você adiciona seu listener (no caso seu JFrame) ao seu slide com o
addChangeListener
O link abaixo pode lhe dar mais informações:
Ok, muito obrigado, funcionou perfeitamente 
Oi, me desculpe voltar aqui depois do post ser concluído, mais é que eu gostaria de saber como eu faço para ao invés de adicionar o valor da slider no titulo da jframe adicionar em uma jlabel? Eu passei a tarde toda em cima desse código e não consegui.
Acho que você começaria com isso:
class MyLabel extends JLabel implements ChangeListener {
/* ... */
}
e em algum lugar você faria algo como:
slider.addChangeListener( (ChangeListener) label );
Aqui o teste:
class MyLabel extends JLabel implements ChangeListener {
MyLabel() { super("0"); }
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
this.setText( Integer.toString( slider.getValue() ) );
}
}
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame();
JSlider slider = new JSlider();
JLabel label = new MyLabel();
slider.addChangeListener((ChangeListener) label);
frame.setLayout(new FlowLayout());
frame.add( label );
frame.add( slider );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
frame.setVisible(true);
}
}
Ta mais o change listener adicionado na slider não é direcionado para a classe que extende de jframe?
Eu mudei o exemplo, agora quem implementa o ChangeListener é o JLabel. Testa ai, vê se o efeito é o que você imaginou.
O que eu queria fazer é aquela caixinha de dialogo que você fez mais somente gostaria de adicionar um jlabel nela
Ah, sim. Bom eu fiz assim:
lass MyJFrame extends JFrame implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
this.setTitle( Integer.toString( slider.getValue() ) );
if ( slider.getValue() == 60 ) {
JDialog dialog = new JDialog(this, "Abrindo JDialogs!!!" );
JLabel label = new JLabel( Integer.toString( slider.getValue() ) );
dialog.add( label );
dialog.pack();
dialog.setVisible(true);
}
}
}
Apenas se lembre de que fiz o código apenas para demonstração, se vc for programar algo assim é bom encontrar uma forma mais bonita e organizada de codificar, mas com isso vc já tem um ponto de partida.
Claro, eu vou arrumar depois mais por enquanto o que me importa é que funcione, eu fiz a classe assim como você colocou
`
package Mainmenu;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Vol extends JFrame implements ChangeListener {
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
this.setTitle( Integer.toString( slider.getValue() ) );
if ( slider.getValue() == 60 ) {
JDialog dialog = new JDialog(this, "Abrindo JDialogs!!!" );
JLabel label = new JLabel( Integer.toString( slider.getValue() ) );
dialog.add( label );
dialog.pack();
dialog.setVisible(true);
}
}
}
`
E então na classe que eu necessito chamar a caixa eu fiz assim:
`
Vol v = new Vol();
JSlider slider = new JSlider(JSlider.HORIZONTAL,0,100,50);
slider.addChangeListener((ChangeListener)v);
v.setResizable(false);
v.add(slider);
v.pack();
v.setVisible(true);
v.setLocationRelativeTo(null);
v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
`
Deu pra ver o que eu fiz de errado?
Não vi o que você fez de diferente do meu. Olha meu código todo aqui:
class MyJFrame extends JFrame implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
this.setTitle( Integer.toString( slider.getValue() ) );
if ( slider.getValue() == 60 ) {
JDialog dialog = new JDialog(this, "Abrindo JDialogs!!!" );
JLabel label = new JLabel( Integer.toString( slider.getValue() ) );
dialog.add( label );
dialog.pack();
dialog.setVisible(true);
}
}
}
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new MyJFrame();
JSlider slider = new JSlider();
slider.addChangeListener((ChangeListener) frame);
frame.add( slider );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
}
Talvez eu não tenha feito do jeito que você esperava, pois neste código tudo o que acontece é que um JDialog se abre com o texto “60” e nada mais. Ele não fica atualizando conforme você mexe no slide, sabe? Tente modificar o código e ver se consegue chegar no resultado esperado. Outra opção seria pesquisar especificamente por esta possibilidade.
Abrçs.
Ok, está tudo bem, vou dar uma modificada e ver o que eu posso fazer, muito obrigado por me ajudar 