JFrame e JPanel: como criar uma aplicação gráfica em Java

No artigo passado, de Introdução ao estudo de GUI, demos uma explicação teórica e bem simples de entender sobre JFrame e JPanel. Agora vamos, de fato, usar JFrame e JPanel.

A partir deste ponto de nossa apostila de Java, iremos criar nossa própria 'janela', ou seja, não vamos usar as janelas já feitas, como nas caixas de diálogo.

JFrame: Como criar Janelas em Java

JFrame nada mais é que uma classe, como outra qualquer que estudamos e criamos ao longo de nosso curso.
Porém, essa classe é que será responsável por criar a tela em que iremos desenhar, colocar botões, menus, caixas de texto e tudo mais que existem nas janelas de aplicativos.

Para fazer uso do JFrame, temos que importar essa classe do pacote swing, que contém diversas funcionalidades para programação gráfica:
import javax.swing.JFrame;

Cada objeto que criamos é um frame, ou janela, diferente. Uma aplicação normal tem dezenas ou centenas de frames.

Nessa seção vamos criar alguns objetos da classe JFrame passando uma String argumento para o construtor padrão, essa string será o título de nossa aplicação.

Esses JFrames, porém, possuem dezenas de funcionalidades e opções, usaremos as funcionalidades: o que ocorre quando clicamos no 'x' de close, adicionar panels, definir o tamanho do frame e se ele será visível ou não.

Como dissemos, o JFrame é uma Classe. E para criar uma classe, criamos um objeto.
Assim, nossa janela será um objeto chamado "janela".
Vamos passar uma string para o construtor dessa classe, que servirá como título de nosso frame/janela.

Porém, para vermos nosso frame, precisamos definir uma funcionalidade: que ele seja visível!
Pode parecer óbvio, mas um programa pode ter muitos, mas muitos frames, e obviamente não podemos exibir todos, senão nossa tela ficaria uma bagunça.

Assim, para exibir esse frame, usamos o método setVisible, que recebe true ou false.
Portanto, um simples programa em Java que cria e exibe um frame será:

import javax.swing.JFrame;

public class framesPanels {
    public static void main(String[] args) {
	JFrame janela = new JFrame("Meu primeiro frame em Java");
	janela.setVisible(true);
    }
}

Note que vai ser criado uma janela, mas provavelmente você nem vai notar. Isso porque não fornecemos o tamanho da janela, então ela foi criado com 0 pixel de largura e 0 de altura.
Vamos usar o método setVisible, que recebe um tipo booleanComo queremos a janela visível, colocamos true.

Caso queira definir um tamanho pré-definido, use o método setSize(), que recebe dois parâmetros com os pixels da janela (horizontal e vertical):


import javax.swing.JFrame;

public class framesPanels {
    public static void main(String[] args) {
	JFrame janela = new JFrame("Meu primeiro frame em Java");
        janela.setSize(300,200);
	janela.setVisible(true);
    }
}

Para saber mais funcionalidades da classe JFrame, veja a documentação em:
http://docs.oracle.com/javase/6/docs/api/javax/swing/JFrame.html




JPanel: Inserido elementos em um JFrame

Como vimos, nosso frame está vazio. Só definimos o tamanho da 'moldura' e o título.
Vamos adicionar alguns elementos ao nosso frame, e faremos isso inserindo um JPanel, onde nele podemos colocar uma infinidade de elementos, chamados JComponents:
Como criar JFrame e JPanel
http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JPanel.html

Para usar o JPanel, importamos essa classe da package swing:
import javax.swing.JPanel;

Vamos criar uma classe que será nosso painel, vamos chamar de "Painel".
Para isso, basta fazer com que ela extends a JPanel, como aprendemos em Herança, para que herdemos todas as propriedades do JPanel.

import javax.swing.JPanel;

public class Painel extends JPanel{

}

Na nossa classe principal, vamos criar um objeto do tipo "Painel" e chamar de "meuPainel".
Para adicionar esse JPanel em nosso JFrame, usamos o método add que recebe como argumento um JPanel:

Painel meuPainel = new Painel();
janela.add(meuPainel);

Embora tenha adicionado um Panel ao seu Frame, você não vai ver nada quando rodar, pois não adicionou nenhum elemento ao seu Panel.
Nos próximos tutoriais desta seção de GUI, vamos aprender como adicionar elementos no Panel.

Mas para não deixar você 'na mão', vamos mostrar um código da Panel que vai fazer um desenho bem bacana no seu JPanel/JFrame, o código completo é:

framesPanels.java
import javax.swing.JFrame;

public class framesPanels {

	public static void main(String[] args) {
		JFrame janela = new JFrame("Meu primeiro frame em Java");
		Painel meuPainel = new Painel();
		
		janela.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		janela.add(meuPainel);
		janela.setSize(600,400);
		janela.setVisible(true);
	}

}

Painel.java
import java.awt.Graphics;
import javax.swing.JPanel;

public class Painel extends JPanel{
	public void paintComponent( Graphics g ){
	    super.paintComponent( g );
	    int pixel=0;
	    
	    for(pixel=0 ; pixel <= getHeight() ; pixel += 10){
	        g.drawLine(0, pixel, pixel, getHeight());
	        }

	    for(pixel=getHeight() ; pixel >=0 ; pixel -= 10){
	        g.drawLine(0, pixel, getHeight() - pixel, 0);
	    }
	    
	    for(pixel=0 ; pixel <= getHeight() ; pixel +=10){
	        g.drawLine(getWidth(), pixel, getWidth() - pixel, getHeight());
	    }
	    
	    for(pixel=getHeight() ; pixel >=0 ; pixel -= 10){
	        g.drawLine(getWidth(), pixel, getWidth() - (getHeight() - pixel), 0);
	    }
	    
	}
}


Para mais detalhes sobre métodos e outras funcionalidades do JPanel, segue a documentação:
http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JPanel.html

13 comentários:

Anônimo disse...

...estou tentando usar:
import javax.swing.*;
...em uma aplicacao, mas fica aparecendo um quadrado vermelho com uma cruz branca (no eclipse)...

Cerri disse...

Tentei fazer mas da varios erros, na classe Painel ele não reconhece .paintComponnet e também o comando getHeight. Na classe framePanels ele não reconhece esse .add(meuPainel) o erro esta no add, alguem pode me ajudar?

Apostila Java Progressivo disse...

Cerri, pouse o mouse em cima do símbolo vermelho ao lado, na linha do erro, que ele vai te dizer o motivo do erro.

Por exemplo, não é "Componnet" é "Component" que se escreve.
Você escreveu o código ou copiou e colou?

Apostila Java Progressivo disse...

Criamos o projeto, criamos a clase framesPanels, colocamos seus códigos dentro...criamos a classe Painel e também inserimos seus códigos.

Rodamos a framesPanels e deu tudo ok, assim como devemos ter feito quando criamos este tutorial de Java.

Cerri disse...

Na postagem eu digitei errado, mas no código ta certo super.paintComponent(g); e quando passo o mouse pede pra renomear, mas o que esta errado?

Cerri disse...

Nesse caso do janela.add(meuPainel) quando passo o mouse da essa sugestão:
Component meuPainel = new Painel()

mas se faço isso o erro muda de lugar, começa da erro apos o sinal de = no new

Apostila Java Progressivo disse...

Tem certeza mesmo que está exatamente igual ao de nosso código né?

Mande um print das telas, de cada classe e pouse o mouse em cima dos erros para aparecer a mensagem.

Envie pra: java.progressivo@gmail.com

Paulo O Franco disse...

Copiei e colei,funcionou OK.

Gaby disse...

Estou precisando de muuuita ajuda para popular um vector com dados inseridos num formulario JFrame... como faco isso?

pedro passos disse...

Digitei e funcionou bem. Estou usando o NetBeans

Anônimo disse...

Crie um programa que mostre um diálogo, informando que não existem
parâmetros, caso não seja passado nenhum parâmetro através da linha de
comando.

Rodrigo Appendino disse...

É mais fácil entender os erros do Code::Blocks.

Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1086)
at java.awt.Container.add(Container.java:998)
at javax.swing.JFrame.addImpl(JFrame.java:562)
at java.awt.Container.add(Container.java:410)
at teste.Teste.main(Teste.java:20)
Java Result: 1

Stenio disse...

Primeiramente parabéns pelo curso, i melhor que encontrei, é olha que vi vários.
Gostaria de saber com posicionar um JPanel dentro de um JFrame? Tentei usar setAlignmentX e Y é i setLocation mas não deu certo, sempre adiciona no alto e centralizado, quando coloco mais de um eles aparecem em sequencia no alto e centralizados.
Para dimensionar também não estou conseguindo, já tentei vá tentei várias coisas mas sempre aparece do tamanho do conteúdo.

Dicas e Novidades de Java por e-mail

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.