setEnabled(False) do JInternaFrame não funciona?

23 respostas
Z

Boa noite colegas !

Juro que pesquisei, mas o tópico sobre isso não chegava a uma solução.

http://www.guj.com.br/posts/list/7367.java#37966

Então… tenho uma tela criada extendendo JInternalFrame.
Já tentei:

Dentro da própria tela

this.setEnabled(false);

Em outra tela:

minhaTela.setEnabled(false);

Mas dos dois jeitos não funciona, a minhaTela continua habilitada, funcionando botões, textFields, fechando, etc, etc…
Alguém sabe a solução para isso ?

Abraços a todos.

23 Respostas

R

Posta seu codigo aqui.

Z

Boa noite colegas !

Ratao:

O código inteiro da tela acho que fica inviavel, ainda mais que criei usando o NB…

Mas pesquisei no código inteiro e esse é o unico ponto onde encontre setEnabled…
Segue o código do botão onde tento mudar o setEnabled do JInternalFrame para false.

private void btSelecionarEquipamentoActionPerformed(java.awt.event.ActionEvent evt) {                                                        
// TODO adicione seu código de manipulação aqui:
        this.setEnabled(false);
    }

[]s

R

Neste caso, quando você está clicando no botão, vc está tornando o próprio botão como Disable.
Dentro do seu JInternalFrame, vc adicionou seus objetos em um JPanel ou apenas foi colocando eles dentro da mesma?!
Se colocou em um JPanel por exemplo. Passe seu JPanel para Disable ao clicar no botao, que ele vai tornar todos os objetos como Disable.

Z

Boa noite colegas !

Caramba Ratao… se é isso dei uma mancada daquela !
kakakaka

Vou testar de outra forma aqui, mas eu quero que a tela inteira fique enabled(false), não apenas os objetos dentro dela, para que o usuário não possa nem mesmo fechá-la, como eu faço para setar o enabled do JInternalFrame.

É uma situação em que a partir de uma tela principal o usuario chama uma tela de consulta que irá retornar dados para essa tela principal, então não quero que o usuario tenha acesso a essa tela antes de fechar a tela de consulta, entendeu ?

Mas e quando eu tento colocar enabled(false) a partir da tela de consulta, porque não funciona ?

[]s.

Z

Ratao…

Está muito estranho, quando eu estou no método ActionPerform do botão e coloco:

this. (this + PONTO)

O NB me mostra todos os objetos do JInternalFrame, se o this estivesse fazendo referencia ao botão isso não aconteceria, não concorda ?

Em tempo… se você estiver correto e eu estiver setando na verdade o enabled do botão, como eu faço nesse caso para acessar o enabled do JInternalFrame ???

Obrigado.

[]s

R

Opa… to na faculdade e passei aqui rapidinho. Mas olha só! Se vc deseja abrir uma nova janela com pesquisa e deseja que o usuário não tenha acesso a nada mais a não ser essa janela que se abre, porquê não utilizar JDialog e usar o mesmo como Modal, assim ele e fica com foco exclusivo e apenas será permitido dar acesso a outra “janela” se o JDialog for fechado. Eu faço assim no sistema em que estou desenvolvendo.
Para através do botão acessar o JInternalFrame é somente chamar ele:

nomeDoJInternalFrame.setEnabled("false");

Xeu voltar pra aula, depois passo aqui de novo. Espero ajudar! :wink:

Z

Bom dia colegas !

Então, não sei se entendi direito… mas essa tela de pesquisa é personalizada, com um JTable que mostra todos os itens da tabela onde vai pesquisar e tal…

Ou sua idéia é criar minha tela de pesquisa extendendo JDialog ao invés de extender JInternaFrame ?
Se puder explicar melhor…

De qualquer forma não sei se seria a saida ideal para o meu caso, porque só quero que o usuário deixe de ter acesso a tela que chamou a tela de pesquisa, mas ao resto do sistema o acesso deve continuar normal…

Muito obrigado pela força.

[]s

R

A forma como eu disse seria sim estender uma classe de um JDialog e fazer dela MODAL. Como será uma tela de pesquisa, não vejo porque não usar um JDialog. Vc limitaria momentaneamente o acesso para a pesquisa, visto que se o usuário desejasse usar outra parte do sistema, ele fecharia a pesquisa e minimizaria o JInternalFrame normalmente. Mas ai vai de sua necessidade.
A forma como você está desejando, estou pesquisando, nao vi nada parecido ainda de bloquear o JInternalFrame, tem como eu disse anteriormente, bloquear o acesso aos objetos dentro dele. Mas enfim, vou continuar procurando aqui, qualquer coisa te digo.
Testa o JDialog, quem sabe não lhe atenda?!

Abraço!

Z

Bom dia colegas !

Ratao, testei com JDialog e realmente funcionou como você disse.
Por enquanto vou manter assim, mas também estou procurando uma forma de tornar o JInternaFrame enabled = false.

Mas com essa mudança me deparei com outro problema, eu tenho um arraylist para controlar quais telas estão abertas, basicamente, para cada tela aberta eu faço um add nesse arraylist.

Só que antes eu só tinha JInternaFrames… então era um ArrayList de JInternaFrames, agora vou ter também JDialog, existe como cirar um ArrayList de uma classe que depois aceite JInternalFrames e JDialog ?

Obrigado.

[]s

R

Bem amigo, olhando na API do java, veja só as classes pai do JInternalFrame e do JDialog:

java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.JInternalFrame

java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by java.awt.Window
extended by java.awt.Dialog
extended by javax.swing.JDialog

Vc pode criar seu ArrayList usando qq uma das classes pai dos componentes JInternalFrame e JDialo, claro, qq uma das que sejam em comum pra ambos. No caso, vc pode criar essas:

ArrayList<Object>
ArrayList<Component>
ArrayList<Container>

Espero ter ajudado! :wink:

Z

Boa tarde colegas !

Renata:

Foi isso que imaginei… então mudei para Component.
Compilou legal, mas na hora da execução, quando passo como parametro a classe que estende JDialog, esta dando esse erro:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container

O método que esta gerando o erro é este:

public void addTela(Component tela){
        this.jDesktopPane1.add(tela);
    }

Se puder me ajudar fico muito agradecido.

[]s

P.S. - Aproveitando a oportunidade, onde eu consigo help para a API Java ?

R

public void addTela(Component tela){ this.jDesktopPane1.add(tela); }

Esse seu método acima esta adicionando tela no JDesktopPane?!

Se for isso, acho que vc tem que fazer um castdown nesse caso. Algo assim:

public void addTela(Component tela){ if (tela instanceof JDialog) this.jDesktopPane1.add((JDialog)tela); else if (tela instanceof JInternalFrame) this.jDesktopPane1.add((JInternalFrame)tela); }

Se não for isso avise.

Sobre o seu PS, é isso que vc quer?

http://java.sun.com/reference/api/

Ou seria isso?

http://docs.sun.com/source/819-7316-10/javadoc/help-doc.html

Não entendi o que vc quis dizer com “help para a API Java”

F

Mas vc quer adicionar uma janela em um container?

Z

Boa tarde colegas !

RenataFA e fabiosci:

Trata-se de uma aplicação swing, eu tenho uma tela principal que é uma classe que estende JFrame.
Nesta tela tenho meus menus e um JDesktopPane.

Ao selecionar um menu ele abre a tela correspondente, que normalmente era uma classe que estendia JInternalFrame, e adiciona no JDesktopPane.
Essa implementação foi uma sugestão de algum colega daqui do Guj, como forma de implementar uma aplicaão swing onde tenho uma tela principal e diversas telas “filhas”.

Enquanto todas as minhas telas filhas estendiam JInternalFrame tudo funcionava perfeitamente.

No entanto, apareceu uma situação em que uma tela de cadastro chama uma tela de pesquisa e eu preciso tornar a tela de consulta enabled(false).
Dai surgiu minha dúvida, pois aparentemente, setEnabled(false) não funciona com JInternalFrame, embora o método exista e não retorne nenhum erro.

Bom… o Ratao sugeriu que eu mudasse a tela de pesquisa para estender JDialog e colocasse como modal, o que deixaria toda a aplicação disabilitada para o usuario, enquanto ele não fechasse a tela atual.

Disso resultou que agora tenho JInternalFrames e JDialogs…

Me parece que ficou meio confuso… sempre sou horrível nessa parte.

Vocês já passaram por isso ? Sabem como posso driblar essa situação ?
Na verdade a opção do JDialog não atende 100% a minha necessidade, porque eu queria que somente a tela de cadastro que chamou a tela de pesquisa ficasse indisponível, e não toda a aplicação.

Muito obrigado a todos !

[]s

P.S. (de novo): Renata, sobre o outro PS, era isto mesmo que eu precisava: o link para sun onde consultar a documentação.
Valeu !
Fabio, sobre adicionar uma janela em um container, desculpe, me parece que isto te espantou… mas eu não faço a minima idéia de porque não posso fazer isso ! Pode me explicar ?
Valeu também !

R

Vc tentou fazer com o método que eu mencionei acima?!

Z

Boa tarde colegas !

Renata:

Eu tentei, mas do mesmo jeito que antes, quando eu faço:

this.jDesktopPane1.add((JDialog)tela);

Recebo o erro:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container

Só para ficar claro… o meu array ficou

private static ArrayList <Component> telasAbertas = telasAbertas = new ArrayList <Component>();

E quando eu adiciono as telas nesse array esta tudo bem, funciona adicionando um JDialog e um JInternalFrame.
O erro que estou recebendo é quando tento adicionar o JDialog no JDesktopPane, que uso para mostrar as telas que abro como “filhas” do JFrame principal.

Tem alguma idéia ?
Ou melhor ainda, sabe alguma forma de deixar tudo como JInternalFrame e fazer com que a tela fica enabled(false) de verdade ?

Obrigado

[]s

F

public Component add(Component comp)Appends the specified component to the end of this container. [color=red]This is a convenience method for addImpl(java.awt.Component, java.lang.Object, int). [/color]Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.

Parameters:
comp - the component to be added
Returns:
the component argument
See Also:
addImpl(java.awt.Component, java.lang.Object, int), validate(), JComponent.revalidate()


addImpl
protected void addImpl(Component comp,
Object constraints,
int index)Adds the specified component to this container at the specified index. This method also notifies the layout manager to add the component to this container’s layout using the specified constraints object via the addLayoutComponent method. The constraints are defined by the particular layout manager being used. For example, the BorderLayout class defines five constraints: BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST, BorderLayout.WEST, and BorderLayout.CENTER.
Note that if the component already exists in this container or a child of this container, it is removed from that container before being added to this container.

This is the method to override if a program needs to track every add request to a container as all other add methods defer to this one. An overriding method should usually include a call to the superclass’s version of the method:

super.addImpl(comp, constraints, index)

Parameters:
comp - the component to be added
constraints - an object expressing layout constraints for this component
index - the position in the container’s list at which to insert the component, where -1 means append to the end
Throws:
IllegalArgumentException - if index is invalid
IllegalArgumentException - if adding the container’s parent to itself
[color=red]IllegalArgumentException - if adding a window to a container[/color]


Resumindo:

Você não pode adicionar uma Janela numa JDesktopPane. Pelo menos não com o método add

R

Zeed01:
Tem alguma idéia ?
Ou melhor ainda, sabe alguma forma de deixar tudo como JInternalFrame e fazer com que a tela fica enabled(false) de verdade ?

Obrigado

[]s

Opa! Desculpa!!! Vc pode sim adicionar um JInternalFrame a um JDesktopPane usando .add (bem, vc já fazia isso e sabe que dá certo, não é mesmo?) Eu tb faço de forma parecida aqui, não há problema nenhum.

O que eu esqueci (me desculpe! viajei legal) e que pra criar o JDialog não é da mesma forma! :oops:

O JDialog não é assim que adiciona… vc não precisa dar o .add.

Voltando ao seu código, qdo se tratar de um JDialog, tente fazer isso:

if (tela instanceof JDialog){ ((JDialog)tela).setVisible(true); // imaginando que seu JDialog já foi criado }else{ // JInternalFrame this.jDesktopPane1.add((JInternalFrame)tela); }

Sobre sua questão sobre como deixar um JInternalFrame como setEnabled(false) eu te digo que também já tentei isso… Eu já tentei até colocar todos os componentes dentro de um JPanel, imaginando que se eu deixasse o JPanel como .setEnabled(false) tudo dentro dele tb ficaria (como ocorre no Delphi). Mas que nada! A única forma que encontrei que funciona (apesar de não ser viável) é settar um por um dos componentes da tela como setEnabled(false). Se vc descobrir outra maneira por favor me conte! :wink:

fabiocsi, eu vi o que vc colocou na msg anterior, de fato está desta forma na API, mas não sei, acho que qdo eles dizem “window” devem estar se referindo a outra coisa, pq de fato eu uso desta forma e funciona, todo meu sistema está assim sem nenhuma exception. Não sei o que eles quiseram dizer, mas acho que não é o que vc está pensando não.

Alguém sabe nos explicar?!

F

JInternalFrame nao extende de Window :wink: por isso no seu caso funciona.

Mas JDialog extende. Entao com JDialog nao funfa.

Z

Boa tarde colegas !

Renata:

Realmente fazendo só o tela.setVisible(true), sem adicionar o JDialog ao JDesktopPane funciona, com o único inconveniente que toda a aplicação fica desabilitada pelo usuário até que o JDialog seja fechada, considerando que estou colocando-o como modal.

Será que eu poderia usar outra coisa que não o JInternalFrame ?
Um JFrame direto, quem sabe…

[]s

R

Tem toda razão fabiocsi! Agora entendi! :wink:

Então Zeed01, eu entendi seu problema, mas infelizmente não sei como resolvê-lo. Tem muitos campos nessa tela?! Desabilitá-los seria algo muito inviável no seu caso?!

Por ex, se eles estiverem todos dentro de um único JPanel, podemos fazer algo como:

Component[] c = meuPanel.getComponents(); for(int i = 0; c.length; i++) c[i].setEnabled(false);

Acha que no seu caso dá?!

Z

Boa tarde colegas !

Renata, na verdade eu não teria muita dificuladade, ja que tenho um método que faz exatamente isso para a situação em que o usuário acessa a tela sem nenhum registro selecionado.
Esse método muda o enabled de cada campo para false ou true.

Mas mesmo assim, o usuário poderia simplesmente fechar a tela… certo ?
Bom vou implementar essa opção e depois escolher entre ela e o uso JDialog…

Mesmo assim muito obrigado a todos pela ajuda !

[]s

R

Bem, em meus JInternalFrame eu desabilito o X de fechar da tela, eu deixo apenas o meu botão de sair.

De repente vc pode desabilitar o X enquanto a tela estiver toda “travada” pra que o usuário não possa sair dela.

Bem, boa sorte ae! :wink:

Criado 10 de outubro de 2007
Ultima resposta 16 de out. de 2007
Respostas 23
Participantes 4