Estou construindo uma aplicação Java e não consigo achar tópicos de como direcionar menus para JFrames.
O que ocorre é o seguinte:
Na aplicação, eu criei um JFrame em que coloquei um JMenuBar e, dentro deste, acrescentei vários JMenu.
Em cada JMenu, adicionei alguns JMenuItens, nos quais desejo chamar outros JFrame.
Por exemplo, ao clicar-se no JMenuItem Exposicoes, a aplicação deve abrir a página (no caso JFrame) Exposicoes.java .
Coloquei este código, porém o programa está dizendo que falta um identificador antes da variável mItem, na segunda e na terceira linha.
Poderia esclarecer?
Tu entendeste que que a primeira linha de código é o atributo de uma classe e que o restante d código tem de ficar em algum método, tipo o construtor, não é? Se sim, poste o código, se não, modifique e tente de novo, postanto o resultado aqui.
Ok, coloquei as linhas de instanciação do componente JMenuItem e de adição do método addMouseListener dentro do escopo do método construtor.
O problema foi resolvido, mas o erro agora consiste na execução do método mousePressed, devido ao fato da classe PrimeiraPagina não ser abstrata.
Segue abaixo o código:
public PrimeiraPagina(){
mItem = new JMenuItem("Exposições");
mItem.addMouseListener(new MouseListener (){
public void mousePressed(MouseEvent evt){
new Exposicoes().setVisible(true);
}
});
}
Em primeiro lugar, com MenuItem, voce pode trabalhar um listener de Eventos ActionListener, que funciona como click do mouse.
Em segundo lugar, ao se criar um MenuItem voce deve acrescentá-lo ao JMenu, que porventura esteja acrescentado ao um JMenuBar.
Em terceiro lugar, um MenuItem que invoca um JFrame, tem que verificar sua sua instância não está nula, por que senão voce terá erro de “NullPointer”. Vamos ao possível código:
public class PrimeiraPagina {
// Declarando uma instância do Frame Exposições
private Exposicoes expo = null;
public PrimeiraPagina() {
......
JMenuBar menubar = new JMenuBar();
JMenu mnuframes = new JMenu("Abrir frames");
JMenuItem mItem = new JMenuItem("Exposiçoes");
mItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
if (expo == null) {
expo = new Exposicoes();
expo.setVisible(true);
} else if (expo.isVisible()) {
expo.setVisible(false);
} else {
expo.setVisible(true);
}
}
});
mnuframes.add(mItem);
menubar.add(mnuframes);
....
setJMenuBar(menubar);
....
}
.....
}
Quando voce instancia um classe como se fosse classe anônima desta forma:
...
new Exposicoes().setVisible(true);
...
Ao executar vários clicks no item de menu, voce corre o risco de criar várias instâncias de um mesmo formulário, e o que é pior, com instâncias anônimas, e isto não é uma boa prática de pool.
[quote=rafaezandinha]eu faço da seguinte maneira: adiciono um actionperformed ao jmenuitem depois crio um objeto do jframe que quero abrir e crio um metodo tipo assim:
Objeto:
Metodo:
private void mostraExposicoes(){
if (exposicoes == null){
exposicoes = new Exposicoes();
exposicoes.setVisible(true);
} else{
exposicoes.setVisible(true);
exposicoes.setState(JFrame.NORMAL);
}
}
Obrigado pela dica! usei em meu projeto e funcionou!, só uma coisa… Quando abria o jFrame via menu, realizava por exemplo um cadastro, voltava ao menu e abria o listar, os dados não estavam atualizados. Foi então que percebi que na parte do do código que vc forneceu era preciso remover o exposicoes.setVisible(true); que está abaixo de else{, pois o mesmo impedia que o frame fechasse e os dados não se atualizavam, ou seja, o código deveia ficar assim: