[Duvidas]Swing - Java - Portugal-a-Programar
[Duvidas]Swing
Por javanoob, 11 de Julho de 2008 em Java
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
public class Menus extends JFrame implements ActionListener {
public Menus() {
menu = new JMenu("Menu");
menuItem = new JMenuItem("Form");
menuItem.setMnemonic(KeyEvent.VK_F);
menuItem.setActionCommand("Form");
menuItem.setMnemonic(KeyEvent.VK_X);
menuItem.setActionCommand("Exit");
if(event.getActionCommand().equals("Exit")) {
if(event.getActionCommand().equals("Form")) {
add(new Forms()); } //devia adicionar o JPanel Forms();
Menus menus = new Menus();
Código para o JPanel
public class Forms extends JPanel {
public Forms() {
Alguém que queira dar aqui umas dicas?
Desde já, OBRIGADO! :ipool:
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.
Errr, e como mandam as regras para indentar?
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.
Podes exemplificar? :-[
ps. O que sugeres para o ActionListener?
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
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.
JPanel meuPainel = new JPanel();
meuPainel.setBackground(Color.PINK);
Para as acções:
//accao a implementar
menuItem.addActionListener(new MinhaAccao());
private class MinhaAccao implements ActionListener {
public ActionListener() {
ou, pegando na tua classe que está a implementar o listener
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.
E usava isto na minha classe Menus?
Obrigado pelos teus posts!
Eu não penso, eu sei
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.
Porque como disse, esse método não faz o que estavas a pensar. Convém que leias a documentação dos métodos.
Sim, bastava usares isso no teu código.
Quanto ao L&F devo estar a explicar-me mal, era isto que queria fazer:
http://img157.imageshack.us/img157/2743/metallookandfeelzm6.jpg
e é isto que está a acontecer:
http://img375.imageshack.us/img375/8789/windowslookandfeelbx2.jpg
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
Como sugeres que faça com
é que não estou a consegui adicioná-lo á JFrame clicando num JMenuItem.
Knitter, obrigadão pelo trabalho que tens tido com os meus problemas!
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:
getContentPane().add(meuPainel);
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()