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

javanoob

[Duvidas]Swing

10 mensagens neste tópico

Boas pessoal!

Ando para aqui a tentar fazer umas coisinhas em Swing, mas isto não está facil!

Os conhecimentos não são muitos e o calor tira facilmente a paciência!  ;)

Basicamente, queria fazer uma JFrame com um JMenu e chamar um JPanel a partir de um JMenuItem.

Eis o que consegui ate agora:

Código para a JFrame e JMenu

	
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Menus extends JFrame implements ActionListener {

    public Menus() {
        JMenuBar menuBar;
        JMenu menu;
        JMenuItem menuItem;
    
        // bug
        JFrame.setDefaultLookAndFeelDecorated(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menuBar = new JMenuBar();
        menu = new JMenu("Menu");
        menu.setMnemonic(KeyEvent.VK_M);
        menuItem = new JMenuItem("Form");
        menuItem.setMnemonic(KeyEvent.VK_F);
        menuItem.setActionCommand("Form");
        menuItem.addActionListener(this);

        menu.add(menuItem);

        menuItem = new JMenuItem("Exit");
        menuItem.setMnemonic(KeyEvent.VK_X);
        menuItem.setActionCommand("Exit");
        menuItem.addActionListener(this);

        menu.add(menuItem);

        menuBar.add(menu);
        setJMenuBar(menuBar);

        pack();
        setSize(400, 300);
        setVisible(true);
        }

    public void actionPerformed(ActionEvent event) {
        if(event.getActionCommand().equals("Exit")) {
            System.exit(0);
        }

        if(event.getActionCommand().equals("Form")) {
            add(new Forms()); } //devia adicionar o JPanel Forms();		
        }

    public static void main(String[] args) {
        Menus menus = new Menus();
    }	
}

Código para o JPanel

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Forms extends JPanel {

    public Forms() {
        setBackground(Color.PINK);
    }
}

Alguém que queira dar aqui umas dicas?

Desde já, OBRIGADO!  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, indenta isso como mandam as regras.

Depois aplica a visibilidade correcta aos métodos, neste caso ao construtor.

De seguida, os menus é que deviam estar a fazer as acções e não a JFrame, porque é que tens a frame a receber eventos? Isso significa que a cada clique ou tecla "enter" pressionada, a JFrame estaria a tentar fazer uma acção. Digo estaria porque, embora tenhas colocado a frame como sendo um ActionListener, não dizes de quem está ela à escuta.

O pack() deveria ser a última coisa a ser feita antes de tornares a frame visivel, se fazes um pack e depois alteras o tamanho da frame, retiras toda a utilidade ao pack.

Para que server isto: JFrame.setDefaultLookAndFeelDecorated(true);?

Porque é que tens uma subclasse de JPanel? Não bastava uma instância?

Já agora, se o objectivo é aprender como funciona o Swing, acho que seria melhor reveres os teus conhecimentos de Java, e só depois passares para Swing, é uma API demasiado grande e que para ser bem usada precisa que saibas muito bem como funciona o Java. Se apenas pretendes fazer interfaces gráficas e não te interessam os pormenores mais específicos da API, que é a maior parte dos casos, então usa o Netbeans e o seu editor de interfaces gráficas, é o mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Errr, e como mandam as regras para indentar?

JFrame.setDefaultLookAndFeelDecorated(true);

Serve para meteres o L&F "Metal" default do Java, como o L&F por default do Swing em vez do L&F do Windows XP / Vista.

Porque é que tens uma subclasse de JPanel? Não bastava uma instância?

Podes exemplificar?  :-[

ps. O que sugeres para o ActionListener?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Errr, e como mandam as regras para indentar?

Como está o código agora, depois de o editar, e como mandam as regrinhas: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

JFrame.setDefaultLookAndFeelDecorated(true);

Serve para meteres o L&F "Metal" default do Java, como o L&F por default do Swing em vez do L&F do Windows XP / Vista.

Não, não serve, serve para dizer ao look-and-feel se as janelas possuem decoração ou não, aliás o método chama-se setDefaultLookAndFeelDecorated.

Por omissão, se não disseres qual o look-and-feel, é sempre o Metal que é usado, como no teu código não tens nada a indicar qual o look-and-feel que queres que a aplicação use o Metal estará sempre activo.

Podes exemplificar?  :-[

(...)
JPanel meuPainel = new JPanel();
meuPainel.setBackground(Color.PINK);
(...)

Para as acções:

(...)
menuItem = new JMenuItem("Form");
menuItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        //accao a implementar
    }
    });
(...)

ou

menuItem = new JMenuItem("Form");
menuItem.addActionListener(new MinhaAccao());
(...)

private class MinhaAccao implements ActionListener {

    public ActionListener() {
        //do nothing
    }
    
    public void actionPerformed(ActionEvent event) {
        //accao a implementar
    }
}

ou, pegando na tua classe que está a implementar o listener

(...)
menuItem = new JMenuItem("Form");
menuItem.addActionListener(this);
(...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Por omissão, se não disseres qual o look-and-feel, é sempre o Metal que é usado, como no teu código não tens nada a indicar qual o look-and-feel que queres que a aplicação use o Metal estará sempre activo.

Penso que não, por omissão o L&F usado é sempre o do SO.

Estava a querer mudar para o default do Java, um que é Azul, mas não o estava a conseguir por isso tinha como comentário "bug" por cima do método.

JPanel meuPainel = new JPanel();
meuPainel.setBackground(Color.PINK);

E usava isto na minha classe Menus?

Obrigado pelos teus posts!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que não, por omissão o L&F usado é sempre o do SO.

Eu não penso, eu sei ;):P

Se queres mudar o look-and-feel tens de usar os métodos da classe UIManager, e tens de o usar antes de mostrar qualquer elemento gráfico.

Estava a querer mudar para o default do Java, um que é Azul, mas não o estava a conseguir por isso tinha como comentário "bug" por cima do método.

Porque como disse, esse método não faz o que estavas a pensar. Convém que leias a documentação dos métodos.

E usava isto na minha classe Menus?

Sim, bastava usares isso no teu código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso que está a acontecer é um efeito secundário de alguma opção que tens no windows.

O método que estás a usar não faz a alteração do look-and-feel, basta leres a documentação desse método para veres que não é o que pretendes, http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html#setDefaultLookAndFeelDecorated(boolean)

Além disso, aqui tenho o comportamento que seria de esperar:

http://img78.imageshack.us/my.php?image=truekk0.png

http://img120.imageshack.us/my.php?image=falsevq9.png

Resultado, a diferença é nenhuma.

Fiz uma pequena aplicação, composta por duas classes, terás de separar o código por dois ficheiros, que coloquei no pastebin do P@P

http://paste.portugal-a-programar.org/pastebin.php?show=2691

Tem atenção ao package das classes.

Por conveniência, aqui está uma versão compilada e o código: http://www.sergio-lopes.org/files/ExemploDeMenu.zip

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como sugeres que faça com

JPanel meuPainel = new JPanel();
meuPainel.setBackground(Color.PINK);

é que não estou a consegui adicioná-lo á JFrame clicando num JMenuItem.

Knitter, obrigadão pelo trabalho que tens tido com os meus problemas!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para adicionares um painel a uma frame tens um exemplo no código que coloquei, getContentPane().add(background);, sendo que, neste caso, a variável background é um painel.

Tens de ter atenção que ao adicionares componentes a um painel, e o getContentPane() devolve um painel, neste caso o da frame, tens de validar esse painel para que as acções se tornem visíveis.

No código que dei está também um menu que altera a cor de um painel existente, que penso ser isso que estavas tentar fazer, porque adicionar painéis novos não é muito útil. No entanto para adicionar painéis usando um menu podias usar código parecido com:

JPanel meuPainel = new JPanel();
meuPainel.setBackground(Color.PINK);
getContentPane().add(meuPainel);
getContentPane().validate();

Podes colocar este código numa acção, tens é de atenção que precisas de uma referência para a frame, para poderes invocar o método getContentPane()

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