Saudações…
Estou tentando controlar a abertura de um jInternalFrame para q seje aberto somente uma vez.
Caso já esteje aberto traga-o pra frente.
Estou tentando usar o código abaixo, mas está com um erro na inicialização da variável.
É assim mesmo que controlo se o jInternalFrame já está aberto ?
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == jMenuItem1) {
if (fi == null){
CadClientes fi = new CadClientes();
}
else {
DesktopPane.moveToFront(fi);
}
}
}
Para melhor controle dos JInternalFrame abertos utilize o método do JDesktopPane.getAllFrames(), esse método te retorna todos os JInternal abertos no JDesktopPane dentro de um vetor de JInternalFrame, dessa forma basta você verificar se o JInternal que será criado já existe no vetor.
Isso, quando ele for fechado sete a variavel fi como null, e se ele já estiver aberto, no caso se for diferente de null, utilize o setSelected(true). Isso fara com que ele seja selecionado e não apenas seja movido para frente. Lembrado que o setSelected() da classe JInternalFrame gera uma exception e deve ser tratada.
Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:
Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:
//ADICIONA TELAS (JInternalFrame) AO JDesktopPane
// usado assim: this.addTelaDesk(new TelaFuncionarios(null));
public void addTelaDesk(JInternalFrame tela){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se uma janela semelhante estiver aberta
if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
"Janela duplicada",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
opções,
opções[0]
);
// se utilizar a aberta retorna e não abre outra,
// caso contrário sai do for e abre outra igual
if(qst == 0){
return;
}else if(qst == 1){
break;
}
}
}
this.telaDesktop.add(tela); //adiciona na tela
tela.setVisible(true); // seta visivel
this.cascade(); //coloca em cascata para deixar "pratico"
}
A função para colocar em cascata:
private void cascade() {
JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
int separation = 25; // distancia entre as janelas
// Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
int i = desk.getAllFrames().length; // quantidade de frames
for (JInternalFrame f : desk.getAllFrames()) {
f.setLocation(i*separation, i*separation);
i--; //mutiplicador
}
}
Exemplos de como chamar depois:
this.addTelaDesk(new TelaFuncionarios(null));
String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));
Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!
Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:
Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:
//ADICIONA TELAS (JInternalFrame) AO JDesktopPane
// usado assim: this.addTelaDesk(new TelaFuncionarios(null));
public void addTelaDesk(JInternalFrame tela){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se uma janela semelhante estiver aberta
if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
"Janela duplicada",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
opções,
opções[0]
);
// se utilizar a aberta retorna e não abre outra,
// caso contrário sai do for e abre outra igual
if(qst == 0){
return;
}else if(qst == 1){
break;
}
}
}
this.telaDesktop.add(tela); //adiciona na tela
tela.setVisible(true); // seta visivel
this.cascade(); //coloca em cascata para deixar "pratico"
}
A função para colocar em cascata:
private void cascade() {
JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
int separation = 25; // distancia entre as janelas
// Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
int i = desk.getAllFrames().length; // quantidade de frames
for (JInternalFrame f : desk.getAllFrames()) {
f.setLocation(i*separation, i*separation);
i--; //mutiplicador
}
}
Exemplos de como chamar depois:
this.addTelaDesk(new TelaFuncionarios(null));
String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));
Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!
[quote=rcipriani]Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:
Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:
//ADICIONA TELAS (JInternalFrame) AO JDesktopPane
// usado assim: this.addTelaDesk(new TelaFuncionarios(null));
public void addTelaDesk(JInternalFrame tela){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se uma janela semelhante estiver aberta
if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
"Janela duplicada",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
opções,
opções[0]
);
// se utilizar a aberta retorna e não abre outra,
// caso contrário sai do for e abre outra igual
if(qst == 0){
return;
}else if(qst == 1){
break;
}
}
}
this.telaDesktop.add(tela); //adiciona na tela
tela.setVisible(true); // seta visivel
this.cascade(); //coloca em cascata para deixar "pratico"
}
A função para colocar em cascata:
private void cascade() {
JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
int separation = 25; // distancia entre as janelas
// Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
int i = desk.getAllFrames().length; // quantidade de frames
for (JInternalFrame f : desk.getAllFrames()) {
f.setLocation(i*separation, i*separation);
i--; //mutiplicador
}
}
Exemplos de como chamar depois:
this.addTelaDesk(new TelaFuncionarios(null));
String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));
Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!
Abraços
[/quote]
Este método ficou muito bom fiz alguma modificação para se adequar a minha necessidade, ajudou muito …
Agora, por acaso você tem alguma ideia de como fazer para que enquanto o usuário estiver usando uma tela ele não posso abrir outra?
Pessoal Consegui aqui… muito fácil segue abaixo a função com o msm procedimento do nosso colega acima…
public void addTelaDesk(JInternalFrame nova){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se algum JInternalFrame estiver aberto, feche o
jInternalFrame.setClosed(true);
}
this.telaDesktop.add(nova); //adiciona na tela
tela.setVisible(true); // seta visivel
Para quem tem um desktopPanel este metodo fecha todos internalFrames ao abrir um.
É o mesmo do amigo ai de cima só alterei uma linha pois não estava fechando todas.
public void addTelaDesk(JInternalFrame nova) throws PropertyVetoException {
for (JInternalFrame jInternalFrame : this.painelPrincipal.getAllFrames()) {
// Aqui fecho tudo que tem no meu DesktopPainel
painelPrincipal.removeAll();
}
painelPrincipal.add(nova); //adiciona na tela
nova.setVisible(true); // seta visivel
}