Dúvida sobre caixa de dialogo

11 respostas Resolvido
Thallysson

Olá, eu gostaria de saber neste tópico como eu faço para chamar uma caixa de dialogo com um JSlider?

11 Respostas

wldomiciano

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:

  1. Seu JFrame (ou equivalente) precisa implementar a interface ChangeListener.
  2. Você adiciona seu listener (no caso seu JFrame) ao seu slide com o addChangeListener

O link abaixo pode lhe dar mais informações:

The Java™ Tutorials | How to Use Sliders.

Thallysson

Ok, muito obrigado, funcionou perfeitamente :slightly_smiling:

Thallysson

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.

wldomiciano

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);
    }    
}
Thallysson

Ta mais o change listener adicionado na slider não é direcionado para a classe que extende de jframe?

wldomiciano

Eu mudei o exemplo, agora quem implementa o ChangeListener é o JLabel. Testa ai, vê se o efeito é o que você imaginou.

Thallysson

O que eu queria fazer é aquela caixinha de dialogo que você fez mais somente gostaria de adicionar um jlabel nela

wldomiciano

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.

Thallysson

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?

wldomiciano
Solucao aceita

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.

Thallysson

Ok, está tudo bem, vou dar uma modificada e ver o que eu posso fazer, muito obrigado por me ajudar :slightly_smiling:

Criado 17 de março de 2016
Ultima resposta 18 de mar. de 2016
Respostas 11
Participantes 2