Bloquear Telas

5 respostas
F

Bom dia galera.
Esse é o 1º ou um dos primeiros post meu.
Minha duvida é como eu faço para bloquear os menus(JMENUBAR, JMENU, JMENUITEM) e todas as telas(JINTERNALFRAME) quando eu tenho uma JINTERNALFRAM aberto em um programa, ou seja, deixar ativada somente as funções de uma tela.

Grato.

5 Respostas

L

Bom se for que eu entendi é simples...

vc pode fazer da seguinte forma

public void Visivel() {
itemMenu.setVisible(true);

}


public void Invisivel() {
itemMenu.setVisible(false);

}

isto fora do initComponents()

abrx

F

lookit"s, vlw pela ajuda.
Mais acho q oq eu quero é algo como:
na tela priancipal da aplicação, clico em um botão ele abre uma janela qualquer, caso ele clique em outro botão, da janela principal o programa sobrepõem a outra tela já aberta, mas não queria que isso acontecesse, quero que o usuario mexa somente na tela aberta enquanto ele não fechar essa tela.

S

Talves algo tipo assim:

/*  this = JFrame ou JDialog  */
        // ... 
        if (jInternalFrame.isVisible()) {
            // Para JmenuBar
            if (this.getJMenuBar() != null) {
                Component[] menuComponents = getJMenuBar().getComponents();
                for (Component component1 : menuComponents) {
                    component1.setEnabled(false);
                }
            }

            // Para outros componentes como botões, checks, etc , caso precise.
            Component[] frameComponents = this.getContentPane().getComponents();
            for (Component frameComponent : frameComponents) {
                if (!frameComponent.equals(jInternalFrame)) {
                    frameComponent.setEnabled(false);
                    if (frameComponent instanceof JPanel
                            || frameComponent instanceof JToolBar) {
                        // Necessário tratar recursividades dentro desses tipos de componentes
                    }
                }
            }
        }
        // ...
D

Boa noite a todos.

Seria muito mais simples você utilizar JDialogs do que JFrames ou JInternalFrames.

JDialogs são janelas normais frequentemente utilizadas como caixas de diálogos que podem ser abertos como modais ou não, dependendo de sua configuração.

Um formulário modal faz exatamente aquilo que voce quer, ou seja, ele não permite que você clique fora de sua janela, até que que você o feche, vamos a um exemplo:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;

public class InputMask extends JDialog implements ActionListener {
    
    private JLabel prompt = null;
    private MaskFormatter msk = null;
    private JFormattedTextField text = null;
    private JButton ok, cancel;
    private String response, aprompt, mask;

    public InputMask(JFrame parent, String aprompt, String title, String mask){
        super(parent, title, true);
        this.aprompt = aprompt;
        this.mask = mask;
        setResizable(false);
        initComponents();
        setPreferredSize(new Dimension(200, 100));
        setResponse("");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }

    private void initComponents(){
        setLayout(new BorderLayout());
        Font font = new Font("Tahoma",0,14);
        prompt = new JLabel(aprompt);
        prompt.setFont(font);
        if (!"".equals(mask)){
            try {
                msk = new MaskFormatter(mask);
                msk.setPlaceholderCharacter('_');
                text = new JFormattedTextField(msk);
            } catch (Exception ex){
                JOptionPane.showMessageDialog(this, ex.getMessage());
            }
        } else {
            text = new JFormattedTextField();
        }
        text.setFont(font);
        text.setColumns(15);
        JPanel panelprompt = new JPanel(new GridLayout(2,1));
        panelprompt.add(prompt);
        panelprompt.add(text);
        getContentPane().add(panelprompt, BorderLayout.CENTER);
        ok = new JButton("OK");
        ok.addActionListener(this);
        cancel = new JButton("Cancelar");
        cancel.addActionListener(this);
        JPanel panelbuttons = new JPanel(new GridLayout(1,2));
        panelbuttons.add(ok);
        panelbuttons.add(cancel);
        getContentPane().add(panelbuttons, BorderLayout.SOUTH);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==ok){
            setResponse(text.getText());
        } else if (e.getSource()==cancel){
            setResponse("");
        }
        setVisible(false);
        dispose();
    }

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

}

Praticamente eu criei acima um InputDialog personalizado, onde me permite inserir máscaras, você pode configurará-lo como Modal, utilizando o método “setModal(true)” ou dentro do construtor com a sintaxe “super”, utilizando o último parâmetro, como eu fiz acima assim “super(parent, title, true);”

Agora dentro do frame principal você pode criar um método estático exatamente como faz o InputDialog da Classe JOptionPane, assim:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FramePrincipal extends JFrame {
    
    private String resposta = null;
    
    public FramePrincipal(){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(400, 400));
        JButton btn = new JButton("Digitar data");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                resposta = FramePrincipal.inputBox(null, "Digite uma data", "Data", "##/##/####");
                JOptionPane.showMessageDialog(null, "A data é "+resposta);
            }
        });
        getContentPane().add(btn);
        pack();
    }
    
    public static String inputBox(JFrame caller, String mens, String title, String mask){
        InputMask imask = new InputMask(caller, mens, title, mask);
        imask.setVisible(true);
        return imask.getResponse();
    }
    
}

Voce vai reparar que quando este JDialog está modal, a execução dentro do JFrame parou exatamente na linha “imask.setVisible(true);” e só executará a linha imediatamente abaixo, quando você fechar o JDialog.

Outra coisa que voce precisa reparar é que JDialogs só funcionam como modais, quando voce click dentro da aplicação que o invocou, se o FramePrincipal for menor que a resolução da tela do seu monitor e voce clicar fora da aplicação, a aplicação será minimizada, e quando restaurada, só aparecerá o JDialog, então tenha cuidado de maximar sempre a tela do FramePrincipal quando lidar com JDialogs.

Isto é só pra você ter uma idéia de como configurar JDialogs.

H

Simples, Abra um JDialog sobre sua JFrame, e setModal(true) na chamada da dilaog.

Criado 7 de dezembro de 2011
Ultima resposta 14 de dez. de 2011
Respostas 5
Participantes 5