jDialog tendo JTabbedPane como pai (tipo MDI)

19 respostas
G

ola a todos

fiz um JTabbedPane, pra add abas assim q for executar opcoes do menu, pra q nao precisa fechar, por exemplo, o cadastro de cliente, qdo precisa ir pra outro opcao, cliente, por exemplo, assim, tambem pra outras opcoes q vao sendo acessada, ate aki tudo bem… acontece porem q pode ter opcao (botao) q vai chamar um JDialog, mas esse, que quero q fique “preso” a aba q foi chamado… esse jDialog eh modal, mas tem q deixar acessar outras opcoes do sistema (menus, outros abas do JTabbedPane, etc), soh tem q ficar “preso” as opcoes da aba q chamou esse, e liberar ao fechar esse jDialog.

aaaaaaaa…

e se eu clicar numa outra aba, esse jDialog tem q sair da frente (e aparecer o q for da aba selecionada), e soh voltar a aparecer na frente, qdo clicar de volta nela…

alguem pra ajudar… por favor…

desde ja agradeco: MUITO OBRIGADO !!!

19 Respostas

G

talvez o q estou procurando eh o jInternalFrame… vou fazer uns testes…

att

fantomas

Fala giba_f,

Não sei se entendi direito o que vc está querendo fazer.

Primeiro, se a janela de dialogo for modal o usuário não conseguirá atingir os outro objetos. Existe um método que faz com que a janela fique no topo (das no outras janelas) vamos dizer assim, não lembro o nome no momento acho que é setAlwaysOnTop(boolean) talvez isso ajude.

flws

G

creio q o JInternalFrame vai me atender… mas ele tem q ficar por cima de todos os objetos e esta ficando por baixo !

serah q tem como fazer ele ficar por cima (rsss-achei engracado isso…rssss)

obrigado !!!

G

o JInternalFrame sempre fica por baixo ?

q eu tenho o JTabbedPane add duas abas com o JPanel, e nesse JPanel eu ja tenho um browse com os registros e botoes. e uns botoes abrem uma tela, ae q pensei q o JInternalFrame me atenderia… ate atende, mas se ficar a frente dos outros objetos, e esta ficando por traz…

se alguem puder ajudar, fico agradecido…

obrigado !!!

fantomas

Você tentou utilizar este método setAlwaysOnTop(boolean)?

flws

R

O JInternalFrame foi feito para ser inserido num JDesktopPane. Se você quer ter um JTabbedPane centralizando os formulários da sua aplicação, uma saída é implementar esses formulários em JPanel’s e inseri-los no JTabbedPane.

G

fantomas:
Você tentou utilizar este método setAlwaysOnTop(boolean)?

flws

sim… tentei o setAlwaysOnTop… mas esse nao encontra no JInternalFrame…

serah q to lascado ? rsss

G

estava pensando: o JDialog tambem poderia dar certo, se tivesse como eu dizer q eh filho, do JPanel (aba do JTabbedPane) e q se clicasse na outra aba, ele nao ficava na frete, e sim, qdo voltasse a clicar a aba q construiu ele.

sera q tem geito ?

obrigado !!!

G

sim…sim…sim… estou fazendo exatamente isso, mas nesse jPanel do JTabblePane. tem um botao q executa uma nova janela… esse q eh o meu problema… estava tentando fazer essa nova janela pelo JInternalFrame, mas ele fica abaixo dos objetos inseridos no jPanel do JTabblePane… dai, pensei q o JDialog pudesse, mas teria q ter uma forma q vinculasse o possivel jDialog (filha) ao jPanel (pai) do JTabblePane, conforme postei na mensagem anterior…

obrigado !!!

fantomas

Desta vez eu testei heim!?! :smiley:

E baseado no que eu entedi funciona, só não sei se é o que vc quer; fiz o seguinte.

  1. Crie um panel com algumas tabs (A, B e C)
  2. Em uma delas eu coloquei um botão (dentro de um painel) com um evento para abrir uma janela (JDialog).
  3. Crie uma janela e utilizei o método setAlwaysOnTop(true).

Executei e pronto… quando apertei o botão que havia criado apareceu a janela e quando tentei selecionar as tabs eu consegui sem retirar a janela da frente.

É isso que vc quer fazer?

flws

fantomas

Olha o código aqui.

public class Application extends JFrame {

      public Application() {
          this.initialize();
      }

      private void initialize() {
          super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JTabbedPane tbb = new JTabbedPane();

          JPanel pnlA = new JPanel();
          JPanel pnlB = new JPanel();
          JPanel pnlC = new JPanel();

          tbb.add(pnlA, "O");
          tbb.add(pnlB, "GUJ");
          tbb.add(pnlC, "É LEGAL");

          JButton b = new JButton("Abrir");

          b.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                showDialog();
            }

          });

          pnlB.add(b, BorderLayout.CENTER);

          super.getContentPane().add(tbb, BorderLayout.CENTER);

          super.setSize(600, 500);
          super.setLocationRelativeTo(null);;
      }

      private void showDialog() {
          new MyDialog();
      }

      public void startUp() {
          super.setVisible(true);
      }

      public static void main(String[] args) {
          Application app = new Application();
          app.startUp();
      }
}
public class MyDialog extends JDialog {

    public MyDialog() {
        this.initialize();
    }

    private void initialize() {

        super.getContentPane().add(new JLabel("Filma eu!", JLabel.CENTER), BorderLayout.CENTER);

        super.setSize( 200, 400);
        super.setAlwaysOnTop(true);
        super.setLocationRelativeTo(null);
        super.setVisible(true);
    }
}

P.S O botão está na aba do meio.

flws

G

rssss

eu executei o seu codigo. acho q nao estamos nos entendendo…rssss

eu estava falando q precisava usar o JInternalFrame ( e nesse diz q nao foi encontrado o setAlwaysOnTop)…rsss

mas tudo bem…rss… foi importante vc ter postado o codigo, q talvez eu consiga me fazer entender melhor a minha necessidade:

eu vejo q conseguirei fazer de duas formas:

  1. com jDialog, como vc postou, mas do geito q vc fez atende, digamos 80%. explico pq: o JDialog “filma eu”, eh filha do aba do meio. precisarah ser modal, mas soh qdo for selecionada a aba pai dela; qdo for clicado nas outras abas, tem q sumir, e soh ficar na frente, qdo selecionado a aba pai, q criou ela.

  2. como o JInternalFrame, mas se vc fazer o teste substituindo o jDialog “filma eu”, vc vai ver q ele fica dentro da aba do meio, e qdo clicado na outras abas ele some (pq esta dentro da aba do meio), eh assim mesmo q eu preciso. porem, nesse, tem um problema: ele fica por baixo dos objetos, no caso, do botao (e todos os outros objetos q existirem)

tendeu melhor ?

grande abraco, e obrigado

mas, ainda nao tenho resolvido…

rss

fantomas

Acho que estou entendendo mas tem alguns detalhes que está me entrigando…

Se a janela tem que ser modal (recurso que deixa operar apenas na janela em evidencia) como é que vc vai querer clicar nas outras abas? Tem certeza que ela tem que ser modal? E, mais importante ainda, por que modal?

Estou começando a achar que vc quer o seguinte:

O usuário clica na aba e depois no botão e a janela aparece e fica “voando” acima dos objetos enquanto a aba (pai) estiver selecionada, mas sem ser modal porque o usuário pode querer acionar algum outro controle qualquer (como vc disse antes). MAS…se o usuário clicar em uma outra aba que não seja dona da janela flutuante ela deverá “sumir”, vamos dizer assim, caso o usuário volte a clicar na aba dona da janela novamente ela deverá “surgir” novamente sem nenhuma alteração em seu conteúdo.

Acertei?

flws

G

acho q sim…

rss

mas, tem como se fazer isso ?

obrigado !!!

fantomas

Nunca fiz, mas acho que dá.

Plano B é o seguinte:

  1. Dá para colocar eventos nas abas, significa que quando alguma for selecionada um evento será acionado.
  2. A gente precisa colocar algumas referencias da janela (aquela voadora) no grupo (todas as abas precisam ter acesso a estas referencias) de abas.
  3. Quando uma aba for acionada o evento deverá verificar nas referencias (ver item 2) se há alguma janela (aberta) para a aba anterior, se tiver deverá ser fechada.
  4. Quando uma aba for acionada o evento deverá verificar nas referencias (ver item 2) se tem alguma janela dela se tiver ela apresenta.

O que vcs acham?

flws

G

a) juro por Deus q dormi essa noite pensando exatamente assim…

mas, faria assim, se nao tiver outra forma…
b) q na linguagem q programo, antes de vir pro java, todos os Dialog eu identifico quem eh o pai dela. e sendo assim, soh vai aparecer na frente qdo o pai estiver selecionado, isso funcionada tambem pras abas, e qdo digo ser “modal”, eh somente pra hora q o pai for selecionado…

c) aki no java nao tem isso ? tipo ligar um dialog em outro ? isso tambem resolver (na linguagem q eu programa antes do java) a evitar q ficam abrindo varias janelas na linha do relogio (ligando as filhas no pai - fica apenas um aplicativo aberto)… agora aki no java, os fudidoes (hehehehe) vao saber… mesmo q eu ainda chego lah…

o ideal mesmo seria, se no java fosse possivel fazer o disse no c)… dai, ficaria show a app.

obrigado !!!

fantomas

Então...

JDialog tem uma propriedade chamada owner (seria o pai) mas é apenas para window (JDialog, JFrame, Window) que pode ser informada no construtor da classe, ou seja, não dá (ao menos que eu saiba) para colocar um painel como owner. Mas acho que dá pra simular.

Faça um teste do código abaixo.

public final class PanelGroupListener implements ChangeListener {

    private Map<Integer, JDialog> stackWindow = new HashMap<Integer, JDialog>(0);
    private int prevIndex = -1;

    public void addWindow(final int index, final JDialog window) {
        this.stackWindow.put(index, window);
    }

    public void removeWindow() {
        if (this.hasWindow(prevIndex)) {
            this.stackWindow.remove(prevIndex);
        }
    }

    private void showWindow(int index) {

        this.hidePrevWindow();

        if (index != -1) {

            this.prevIndex = index;

            if (this.hasWindow(index)) {
                JDialog window = this.getWindow(index);
                window.setVisible(true);
            }
        }
    }

    private void hidePrevWindow() {
        if (this.hasWindow(prevIndex)) {
            JDialog window = this.getWindow(prevIndex);
            window.setVisible(false);
        }
    }

    private JDialog getWindow(int index) {
        return this.stackWindow.get(index);
    }

    private boolean hasWindow(int index) {
        return (this.stackWindow.get(index) != null);
    }

    public void stateChanged(ChangeEvent e) {
        JTabbedPane tbb = (JTabbedPane) e.getSource();
        this.showWindow(tbb.getSelectedIndex());
    }
}
public class MyDialog extends JDialog {

    private String message = null;
    private PanelGroupListener pnlGroupListener = null;

    public MyDialog(final PanelGroupListener windowMediator, final String message) {
        this.pnlGroupListener = windowMediator;
        this.message = message;
        this.initialize();
    }

    private void initialize() {

        super.setTitle("Hello World");
        super.getContentPane().add(new JLabel(message, JLabel.CENTER), BorderLayout.CENTER);

        super.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                MyDialog.this.pnlGroupListener.removeWindow();
            }
        });

        super.setSize(200, 400);
        super.setAlwaysOnTop(true);
        super.setLocationRelativeTo(null);
    }
}
public class Application extends JFrame {
    private JTabbedPane pnlGroup = new JTabbedPane();

    private PanelGroupListener pnlGroupListener = new PanelGroupListener();

    private MyDialog windowShootMe = new MyDialog(pnlGroupListener,"Shoot me!");
    private MyDialog windowWhatTheHell = new MyDialog(pnlGroupListener,"What the hell!");
    private MyDialog windowWowShit = new MyDialog(pnlGroupListener, "Woww shit!");

    public Application() {
        this.initialize();
    }

    private void initialize() {
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        pnlGroup.addChangeListener(this.pnlGroupListener);

        JPanel pnlA = new JPanel();
        JPanel pnlB = new JPanel();
        JPanel pnlC = new JPanel();

        pnlGroup.add(pnlA, "O");
        pnlGroup.add(pnlB, "GUJ");
        pnlGroup.add(pnlC, "É LEGAL");

        JButton a = new JButton("Click me!");
        a.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showWindowShootMe();
            }
        });

        pnlA.add(a, BorderLayout.CENTER);

        JButton b = new JButton("Click me!");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                windowWhatTheHell();
            }
        });

        pnlB.add(b, BorderLayout.CENTER);

        JButton c = new JButton("Click me!");
        c.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                windowWowShit();
            }
        });

        pnlC.add(c, BorderLayout.CENTER);

        super.getContentPane().add(pnlGroup, BorderLayout.CENTER);

        super.setSize(600, 500);
        super.setLocationRelativeTo(null);
    }

    private void showWindowShootMe() {
        this.pnlGroupListener.addWindow(this.pnlGroup.getSelectedIndex(), this.windowShootMe);
        this.windowShootMe.setVisible(true);
    }

    private void windowWhatTheHell() {
        this.pnlGroupListener.addWindow(this.pnlGroup.getSelectedIndex(), this.windowWhatTheHell);
        this.windowWhatTheHell.setVisible(true);
    }

    private void windowWowShit() {
        this.pnlGroupListener.addWindow(this.pnlGroup.getSelectedIndex(), this.windowWowShit);
        this.windowWowShit.setVisible(true);
    }

    public void startUp() {
        super.setVisible(true);
    }

    public static void main(String[] args) {
        Application app = new Application();
        app.startUp();
    }
}

flws

G

ola…tudo bem : (to sem o ponto de interrogacao…rs)

executei o seu fonte.

acho q estamos quase chegando ao 100%, pois, nao sei se observou a tela na frente, fica na frente de “todo mundo”, inclusive do explorer do windows, word, etc…rsss

mas, compartilho com a sua ideia… acho q falta pouco (vou tentar aki tambem), por mais q nao gostou muito de fazer “gambes”, mas as vezes sem elas as coisas nao ficam satisfatorias…rs

soh uma coisa, sobre aquilo q falow antes, sobre o “owner”. com ele nao tem geito : q pelo q li, e se desse pra usar, acredito q ficaria bom…

graaaannde abraco… e muitisssimo obrigado pela dedicacao e ajuda !!!

G

up !!!

ainda nao tenho isso resolvido !!!

se uma bola alma quizer ajudar, fico muito agradecido !!!

obrigado !!!

Criado 18 de agosto de 2009
Ultima resposta 27 de ago. de 2009
Respostas 19
Participantes 3