Duvidas - JFrame e JDialog [Resolvido]

4 respostas
KaosBr

Boa noite,

Esta é a primeira tela que construo manualmente, normalmente opto pela IDE para contruir UI, agora para ganhar mais autonomia estou contruindo algumas telas manualmente.

No primeiro bloco de código a baixo, criei uma “tela inicial” para o sistema, partindo de um exemplo aqui do forum. Na medida que fui pegando intimidade, fui alterando o codigo original, até ter a saida abaixo. O problema é que não consigo centralizar, o JDialog, usando a “tela inicial” como referencia. O código responsável pela abertura do JDialog, está na linha 83 do primeiro bloco.

package telamanual;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.WindowConstants;

/**
 *
 * @author Kaos
 */
public class Sistema extends JFrame {

    /**
     * Construtor
     */
    public Sistema() {
        this.inicializaTela();
    }

    private void inicializaTela() {
        this.setTitle("Sistema");
        this.setJMenuBar(getMenuPrincipal());
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(800, 600);
        this.setLocationRelativeTo(null);
    }

    private JMenuBar getMenuPrincipal() {
        JMenuBar menuPrincipal = new JMenuBar();

        JMenu menuArquivo = new JMenu("Arquivo");
        menuArquivo.add(getMenuItemSair());

        JMenu menuAplicativo = new JMenu("Sistema");

        JMenu menuRelatorio = new JMenu("Relatorio");

        JMenu menuManutencao = new JMenu("Manutencao");

        JMenu menuAjuda = new JMenu("Ajuda");
        menuAjuda.add(getMenuItemAjuda());

        menuPrincipal.add(menuArquivo);
        menuPrincipal.add(menuAplicativo);
        menuPrincipal.add(menuRelatorio);
        menuPrincipal.add(menuManutencao);
        menuPrincipal.add(menuAjuda);

        return menuPrincipal;
    }

    /**
     * Menu: Arquivo / Item: Sair
     * @return
     */
    private JMenuItem getMenuItemSair() {
        JMenuItem menuItemSair = new JMenuItem("Sair");

        ActionListener acao = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        };

        menuItemSair.addActionListener(acao);

        return menuItemSair;
    }

    /**
     *  Menu: Ajuda / Item: Sobre
     */
    private JMenuItem getMenuItemAjuda() {
        JMenuItem itemMenuSobre = new JMenuItem("Sobre");

        ActionListener acao = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               Sobre sobre = new Sobre(new JFrame(), true);
               sobre.setLocationRelativeTo(this);
            }
        };

        itemMenuSobre.addActionListener(acao);

        return itemMenuSobre;
    }

    /**
     * Usado durante o desenvolvimento para facilitar a visualização da tela.
     * @param args
     */
    public static void main(String args[]) {
        Sistema testeTela = new Sistema();
        testeTela.setVisible(true);
    }

}

Aviso da IDE, referente a linha 83, do código acima:

Abaixo o código, referente a JDialog:

package telamanual;

import java.awt.Frame;
import javax.swing.JDialog;
import javax.swing.WindowConstants;

/**
 *
 * @author Kaos
 */
public class Sobre extends JDialog {

    /**
     * Contrutor
     * @param parent
     * @param modal
     */
    public Sobre(
            Frame parent,
            boolean modal
            ) {
        super(parent, modal);
        this.inicializaComponentes();
    }

    private void inicializaComponentes() {
        this.setTitle("Sobre");
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setResizable(false);
        this.setSize(400, 300);
        this.setVisible(true);
    }

}

Dúvidas:

  • O que está causando o problema na linha 83, do primeiro bloco?

  • Na 19 do segundo bloco, tem um parametro, “parent”. Copiei essa parte do código, de um JDialog, gerado automaticamente na IDE. E acabei mantendo por ser, a forma que estou acostumado a fazer, com que o JDialog fique “modal”. Por que e o que é o parent? Há outra forma de trabalhar esse contrutor, e garantir que a JDialog, fique “modal”?

[]s

4 Respostas

D

pra centralizar coloca no construtor da classe:

setLocationRelativeTo(null);

vle

KaosBr

Bom dia,

Damiao, há um pequeno problema em usar “null”, quanto a tela é aberta é posicionada sempre, no centro da tela. No caso do “this”, se estivesse funcionado, ele iria posicionar no centro da “tela principal”.

Caso a “tela principal”, seja movida, o JDialog “Sobre”, ficaria posicionado ainda no centro da tela que o invocou.

Preciso de algo, que tenha, o mesmo efeito.

Obrigado

[]s

Eric_Yuzo

Como o método setLocationRelativeTo está sendo invocado de uma classe interna, o this está se referindo ao objeto da classe interna que implementa ActionListener assim como está descrito no erro: “required: java.awt.Component - found: anonymous java.awt.event.ActionListener”. Tente assim:

sobre.setLocationRelativeTo(NomeDaClasse.this); // No seu caso o NomeDaClasse seria Sistema

Parent é a janela “pai” do diálogo, ou seja, o JDialog pertence a essa janela, desse modo a caixa de diálogo será exibida sempre na frente dessa janela.

O que diz se o JDialog vai ser modal ou não é parâmetro boolean modal. Se estiver marcado como true, o diálogo será modal, caso contrário não será.

KaosBr

Bom dia,

Excelente, usei Sistema.this, centralizou! :slight_smile: Entendi, a implementação de ActionListener, estava gerando problemas. :slight_smile:

Obrigado

[]s

Criado 14 de novembro de 2010
Ultima resposta 15 de nov. de 2010
Respostas 4
Participantes 3