• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

dos.santos

Como dizer a uma classe para fazer dois "extends" ?

3 mensagens neste tópico

Boas,

Durante as minhas explorações do Java Swing, resolvi tentar simplicar o ficheiro principal de um programa que estava a fazer, distribuindo o código por outros ficheiros, de forma a que aquilo tudo fosse mais fácil de manter, mas durante o processo deparei-me com um problema que não estou a conseguir resolver pelo menos como eu queria.

Basicamente, tenho 4 ficheiros: Componentes.java, Menu.java, Programa.java e Sair.java.

No primeiro ( Componentes.java ) tenho o código que vou buscar para gerar os componentes a usar no meu programa.

No segundo ( Menu.java ) tenho uma JFrame, um JPanel e um JButton, usando o código do primeiro ( Componentes.java ) através de um "extends".

No quarto ( Programa.java ) tenho a minha classe main() que faz um "extends" ao segundo ( Menu.java ).

E no terceiro ( Sair.java ) queria ter o código para qualquer coisa, neste caso para sair do programa, desencadeado por um Botão do Menu. E é aqui que está o meu problema, pois não posso usar um "extends" para o primeiro ( Componentes.java ) por causa da hierarquia de classes. Somando a isso a minha pouca experiência em Java/Swing, tive que vir mais uma vez ver se o pessoal do P@P me desenrascava! ;)

Espero que tenham percebido e que me possam ajudar!

Em baixo fica o código dos meus ficheiros:


//Componentes.java

import java.awt.*;
        import java.awt.event.*;

import javax.swing.*;

        public class Componentes
        {
                
                int resposta;

                        public static JFrame Janelas(String texto)                		                        
                        {

                                JFrame janela = new JFrame();
                                
                                        janela.setTitle(texto);
                                        
                                        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                                                                      
                                return janela;
                                
                        }

                        public static JPanel Fundos(    int comprimento,
                                                        int largura,
                                                        Color cor)
                        			                
                        {

                                JPanel fundo = new JPanel();            
                                
                                        fundo.setPreferredSize(new Dimension(comprimento, largura));

                                        fundo.setBackground(cor);
                                
                                return fundo;
                        
                        }

                
                        public static JButton Botoes (String texto)
                        {

                                JButton botao = new JButton();                        
                                                
                                        botao.setText(texto);
                                
                                return botao;
                        }



                        public JOptionPane Caixas (     String texto,                                                
                                                        Component componente,
                                                        String mensagem,
                                                        int tipoBotao,
                                                        int tipoCaixa)
                                                        
                        {

                                JOptionPane caixa = new JOptionPane();
                                
                                        resposta = caixa.showOptionDialog (     componente, 
                                                                                mensagem,                                                
                                                                                texto,                                                
                                                                                tipoBotao,
                                                                                tipoCaixa,
                                                                                null,
                                                                                null,
                                                                                null);
                                
                                return caixa;
                                
                        }

        }


//Menu.java

import java.awt.*;
        import java.awt.event.*;

import javax.swing.*;

        public class Menu extends Componentes implements ActionListener
        {

                JFrame novaJanela;
                JPanel fundoMenu;
                JButton botaoSair;
                
                JOptionPane caixaSair;
                
                        public void Menu()
                        {
                        
                                novaJanela = Janelas("O Meu Programa!");
                                        
                                        fundoMenu = Fundos(400, 600, Color.ORANGE);
                                                                
                                                        botaoSair = Botoes("Sair");
                                                                
                                                                botaoSair.setActionCommand("botaoSair");
                                                                
                                                                botaoSair.addActionListener(this);

                                                        fundoMenu.add(botaoSair);

                                novaJanela.add(fundoMenu);
                        
                                novaJanela.pack();
                                novaJanela.setVisible(true);
                                                
                        }

                        public void actionPerformed(ActionEvent e) 
                        {

                                if ("botaoSair".equals(e.getActionCommand()))
                                { 
                                        
//                                         Sair(); // vai buscar o Sair.java

                                        caixaSair = Caixas(     "Adeus!",
                                                                novaJanela,
                                                                "Sair?",
                                                                JOptionPane.DEFAULT_OPTION,
                                                                JOptionPane.ERROR_MESSAGE);
                                                                
                                                if (resposta == 0) System.exit(0);

                                }
                                
                        }

        }



//Progama.java

import java.awt.*;
        import java.awt.event.*;

import javax.swing.*;

        public class Programa extends Menu
        {
                
                public Programa()
                {
                
                        Menu();
                
                }
                
                public static void main(String[] args)
                {
                
                        Programa p = new Programa();
                
                }
                
        }



//Sair.java

import java.awt.*;
        import java.awt.event.*;

import javax.swing.*;
        
        JOptionPane caixaSair;

                public class Sair extends Menu
                {

                        public void Sair()
                        {
                        
                                caixaSair = Caixas(     "Adeus!",
                                                        novaJanela,
                                                        "Sair?",
                                                        JOptionPane.DEFAULT_OPTION,
                                                        JOptionPane.ERROR_MESSAGE);
                                                        
                                        if (resposta == 0) System.exit(0);

                        }

                }       

Agradeço as vossas opiniões,

Miguel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em primeiro Java só suporta hierarquias simples ou seja uma subclass apenas pode ter uma superclass ou seja apenas podes ter um extends por classe.

Agora referente ao teu problema e embora não tenha visto todo o código mas penso ter percebido a tua ideia porque não crias uma Class Principal em que vai criar objectos das outras ?

Eu pessoalmente  não gosto de Swing é uma bocado confuso no que toca a estas coisas, não quero influenciar mas acho que não perdias nada em ver SWT eu pessoalmente desde que programei em SWT nunca mais mexi em Swing.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é a primeira vez que encontro este tipo de código :(

Tu está a subverter completamente a programação orientada a objectos! Que raio, porque é que os teus métodos devolvem esses objectos dessa forma? Nada disso é preciso e não está a pensar de forma Orientada a Objectos.

Uma classe sair? Mas que objecto é esse? Consegues definir o objecto, os seus atributos, os seus métodos? Não me parece, essa classe sair, não é mais que um método.

Já agora, existe uma classe Menu no Java, estás a reinventar a roda...

Não faz sentido o teu programa extender de Menu, ele é um menu? que relação existe entre os dois objectos?

Não te posso responder à pergunta porque ela está baseada num erro. A forma como estás a tentar fazer isso não está correcta.

A forma correcta seria apenas um objecto que extendesse de JFrame e que fosse definido por composição.

Ok, posso dizer-te que se te deparares com um problema de herança multipla tens duas soluções, o uso de interfaces ou a composição, qual das duas deves aplicar depende do problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora