Boas, é a primeira vez que posto e posso dizer que me registei para ver se conseguia tirar esta dúvida, Espero que tenha valido a pena.
O que se passa é o seguinte, criei um programa que inicialmente abre uma janela com um menu, depois dependendo do JButton que carregar ele executa as acçoes. Quando corro o programa pelo NetBeans tudo dá tudo certo…
O problema é que quando crio o jar e o abro, quando carrego na opção para a nova JFrame abrir(o JButton) ele simplesmente não abre. Precisava mesmo de resolver este problema, alguém tem uma idéia do que poderá ser?
Primeiramente, bem-vindo ao fórum. Da próxima vez que abrir tópicos, procure ler a lista de fóruns disponíveis, você verá que existe um fórum chamado “Interface Gráfica”, exclusivamente para dúvidas de Swing.
Para resolvermos sua dúvida, poste a exceção, o trecho de código onde você abre o JFrame e, se não for muito longo, o código do Frame também.
Caso contrário, fica muito difícil podermos te ajudar. E, sempre que for postar códigos, use a tag code, como explicado aqui:
http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor
Esta é a parte do meu código que trabalha com o problema que descrevi. No main abre a “jan” o menu e quando seleciono carregar ou jogar abre a “jan1” que é o jogo…
[code]class TrataEv implements ActionListener {
public void actionPerformed(ActionEvent evt) {
JButton aux=(JButton) evt.getSource();
// jogar ou carregar
if (aux==arrayBotoes[0] || aux==arrayBotoes[1]){
Mesa jan1=null;
if (aux==arrayBotoes[0]){
jan1 = new Mesa("Jogo das Sequências",jan,0);
}else{
jan1 = new Mesa("Jogo das Sequências",jan,1);
}
jan1.setResizable(false);
jan1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jan1.setSize(640, 640);
jan1.setVisible(true);
jan.setVisible(false);
}
//Sair
if (aux==arrayBotoes[2]){
System.exit(0);
}
}}
public static void main(String [] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
jan = new Menu("Jogo das Sequências");
jan.setResizable(false);
jan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jan.setSize(640, 640);
jan.setVisible(true);
jan.setIconImage(new ImageIcon("costas.png").getImage());
}[/code]
Ninguém me pode ajudar, é que neste momento sinto-me um bocado desesperado…
Rapaz… é domingo e são 8h da manhã no Brasil. Tenha calma.
Ah bom, em Portugal já é de tarde. :roll:
O problema é que tenho de entregar o trabalho hoje, fiz o projecto todo e estava tudo a funcionar perfeitamente, hoje ia criar o jar para entregar, testei e deu este erro…
Espero que seja facil de resolver o problema…
Eu diria que a maior probabilidade de erro está na linha:
Essa imagem está na pasta onde você executa o jar? Se quiser que a imagem esteja dentro do Jar, o correto seria usar:
Certifique-se de ter uma pasta chamada imagens junto dos seus fontes, fora de todos os pacotes, e de que seu conteúdo seja inserido dentro do .jar.
Caso não seja isso, coloque aqui a exceção lançada pelo java.
Você poderá ve-la executando seu .jar pelo prompt de comando.
Ja removi essa linha porque não é importante ao projecto, até porque não funciona com
Já tentei fazer isso na consola mas diz que o comando não é reconhecido…
E sem a linha funcionou?
Não, o problema continuou…
Siga esse tutorial:
http://www.guj.com.br/content/articles/installation/j2sdkinstall.pdf
Na parte que ensina sobre variáveis de ambiente. Depois, tente executar seu .jar pela consola e nos diga que erro dá.
Sem a mensagem de erro é impossível dizer qual é o problema.
Esta bom, obrigado.
Tirei um print à consola…
Esta aqui o link: http://imageshack.us/photo/my-images/713/semttuloysn.png/
Agradecia se me pudessem ajudar.
poste o código da classe Mesa o erro no prompt diz que o erro esta na linha 99 daquela classe.
Você tirou mesmo aquela linha que contem o setIconImage()?
É um pouco grandinho mas aqui vai…
Linha 99
Classe mesa completa:
package javaapplication1;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class Mesa extends JFrame implements Serializable{
private final int widthCarta=82;
private final int heightCarta=105;
private final int widthbotaomenu=100;
private final int heightbotaomenu=30;
private final int nSequencias=3;
private final int nBaralhosAux=3;
private final int maxcartasbaralhoaux=6;
private final int numerobotoesmenu=2;
private final int ncartasbaralho=21;
private int posbaralho=0;
private boolean selecionado=false;
private boolean auxselecionado=false;
private JLayeredPane layeredpane;
private Sequencia arraySeq[]=new Sequencia[nSequencias];
private JButton arrayJButtonSeq[]=new JButton [nSequencias];
private JLabel arraySetaspos[]=new JLabel[nSequencias];
private BaralhoAux arrayBaralhoAux[]=new BaralhoAux[nBaralhosAux];
private JButton arrayJButtonBaralhoAux[][]=new JButton [maxcartasbaralhoaux][nBaralhosAux];
private JButton arrayJButtonMenu[]=new JButton[numerobotoesmenu];
private JLabel labelposicao[];
private Jogo jogo=new Jogo();
private Timer timer;
private int current = 0;
private JLabel segundos;
private JLabel njogadas;
private int totalcartassequencias;
private Menu jan;
private Baralho baralho=new Baralho(ncartasbaralho);
//Criar botoes relacionados com baralho e botao menu
private JButton bproximacarta=new JButton("");
private JButton b7 = new JButton("");//carta a jogar
public Mesa(String titulo,Menu janela,int carregar) {
//Escrever titulo
super(titulo);
jan=janela;
layeredpane=new JLayeredPane();
//definir border nulo carta de costas
bproximacarta.setBorder(null);
//Baralhar o baralho
baralho.baralhar();
//Criar Sequencias
for(int i=0;i<nSequencias;i++){arraySeq[i]=new Sequencia(i+1);}
//Preencher array botoes sequencia e adicionar tratamento de eventos
for(int i=0;i<nSequencias;i++){arrayJButtonSeq[i]=new JButton("");arrayJButtonSeq[i].addActionListener( new TrataEv());}
//Preencher o array Baralhos auxiliares
for(int i=0;i<nBaralhosAux;i++){arrayBaralhoAux[i]=new BaralhoAux();}
//Preencher array botoes baralhos aux
for(int i=0;i<maxcartasbaralhoaux;i++){for(int j=0;j<nBaralhosAux;j++){arrayJButtonBaralhoAux[i][j]=new JButton("");arrayJButtonBaralhoAux[i][j].setBackground(null);arrayJButtonBaralhoAux[i][j].addActionListener( new TrataEv());}}
//Criar arrays e preencher sequencias
for (int i=0;i<nSequencias;i++){
boolean flag=false;
for(int j=0;flag==false;j++){
if(baralho.getCarta(j).getNumero()==arraySeq[i].getSaltoSeq()){
arraySeq[i].add(baralho.getCarta(j));
baralho.remove(j);
arrayJButtonSeq[i].setIcon(arraySeq[i].get(arraySeq[i].size()-1).getImageIcon());
b7.setIcon(baralho.getCarta(0).getImageIcon());
flag=true;
}
}
}
//Desenhar Mesa
getContentPane().setBackground(Color.white);
//criar jlabel proxima posicao
labelposicao=new JLabel[nSequencias];
for(int i=0;i<nSequencias;i++){labelposicao[i]=new JLabel("1 2 3 4 5 6 7");layeredpane.add(labelposicao[i]);labelposicao[i].setBounds(305+100*i,40,200,200);}
//criar e desenhar label de tempo e jogadas
segundos=new JLabel("Segundos decorridos: 0");
layeredpane.add(segundos);
segundos.setBounds(30,200,200,100);
this.go();
njogadas=new JLabel();
njogadas.setText("Número de Jogadas: "+jogo.getnJogadas());
layeredpane.add(njogadas);
njogadas.setBounds(30,220,200,100);
//desenha imagem da primeira carta baralho
b7.setIcon(baralho.getCarta(0).getImageIcon());
//Desenha Carta de costas
ClassLoader classLoader = this.getClass().getClassLoader();
java.net.URL urlImagem = classLoader.getResource("img/costas.png");
bproximacarta.setIcon(new ImageIcon(urlImagem ));
//Criar Evento clique carta baralho
b7.addActionListener( new TrataEv());
//Criar jlabel das setas posicao da proxima carta
urlImagem = classLoader.getResource("img/seta.jpg");
for(int i=0;i<nSequencias;i++){arraySetaspos[i]=new JLabel(new ImageIcon(urlImagem));layeredpane.add(arraySetaspos[i]);arraySetaspos[i].setBounds(303+100*i+10*(arraySeq[i].getProximoNum()-1), 150, 16, 16);
}
//Criar Evento clique no baralho costas
bproximacarta.addActionListener(new TrataEv());
//criar botoes menu
for(int i=0;i<numerobotoesmenu;i++){
String menu="";
if (i==0){menu="Guardar";}else{if(i==1){menu="Sair";}}
arrayJButtonMenu[i]=new JButton(menu);
layeredpane.add(arrayJButtonMenu[i],new Integer(0));
arrayJButtonMenu[i].setBounds(180+(i*100+20),550,widthbotaomenu,heightbotaomenu);
arrayJButtonMenu[i].addActionListener(new TrataEv());
}
//adicionar baralho e proxima carta ao layeredpane
layeredpane.add(bproximacarta,new Integer(1));
layeredpane.add(b7,new Integer(1));
for(int i=0;i<nSequencias;i++){layeredpane.add(arrayJButtonSeq[i],new Integer(1));}
for(int i=0;i<maxcartasbaralhoaux;i++){for(int j=0;j<nBaralhosAux;j++){layeredpane.add(arrayJButtonBaralhoAux[i][j],new Integer(1));}}
//adicionar layeredpane ao container
getContentPane().add(layeredpane, BorderLayout.CENTER);
//Definir posiçoes das cartas e definiçoes de layered pane
layeredpane.setOpaque(true);
//Posicionar cartas das sequencias
for(int i=0;i<nSequencias;i++){arrayJButtonSeq[i].setBounds(300+100*i,10,widthCarta,heightCarta);}
//Posicionar cartas baralhos auxiliar
for(int i=0;i<nBaralhosAux;i++){arrayJButtonBaralhoAux[0][i].setBounds(300+100*i,200,widthCarta,heightCarta);}
//Posicionar baralho, carta virada e botao menu
b7.setBounds(110,100,widthCarta,heightCarta);
bproximacarta.setBounds(10,100,widthCarta,heightCarta);
//Carregar Jogo
if (carregar==1){
Guardar abrir;
try {
String fich = "Save.jds";
ObjectInputStream in = new ObjectInputStream( new FileInputStream(fich) );
abrir = (Guardar) in.readObject();
baralho=abrir.getBaralho();
arrayBaralhoAux=abrir.getArrayBaralhoAux();
arraySeq=abrir.getArraySequencia();
posbaralho=abrir.getPosBaralho();
selecionado=abrir.getSelecionado();
auxselecionado=abrir.getAuxSelecionado();
jogo=abrir.getJogo();
current=abrir.getCurrent();
totalcartassequencias=abrir.getTotalCartasSequencia();
//mostrar carta baralho correcta
if (baralho.size()>0)
b7.setIcon(baralho.getCarta(0).getImageIcon());
else
b7.setIcon(null);
//actualizar carta de sequencia correcta
for(int i=0;i<nSequencias;i++){
arrayJButtonSeq[i].setIcon(arraySeq[i].get(arraySeq[i].size()-1).getImageIcon());
}
//actualizar labels tempo e jogadas
njogadas.setText("Número de Jogadas: "+jogo.getnJogadas());
segundos.setText("Segundos decorridos: "+ current++);
//actualizar setas proxima posicao
for(int i=0;i<nSequencias;i++){
if(arraySeq[i].size()<7){
arraySetaspos[i].setLocation(303+100*i+10*(arraySeq[i].getProximoNum()-1), 150);
}
}
//Actualizar botoes baralho aux
for(int i=0;i<nBaralhosAux;i++){
for(int j=0;j<arrayBaralhoAux[i].size();j++){
arrayJButtonBaralhoAux[j][i].setIcon(arrayBaralhoAux[i].get(j).getImageIcon());
arrayJButtonBaralhoAux[j][i].setBounds(300+100*i,200+15*j, widthCarta,heightCarta);
if (j>0){arrayJButtonBaralhoAux[j-1][i].setBorder(null);
}
layeredpane.moveToFront(arrayJButtonBaralhoAux[j][i]);
}
}
in.close();
}
catch (ClassNotFoundException cnfe) {}
catch (FileNotFoundException fnfe) {}
catch (IOException ioe) {}
}
}
//Classe tratar eventos
class TrataEv implements ActionListener {
public void actionPerformed(ActionEvent evt) {
//criar botao aux para definir em que botao carregou
JButton aux=(JButton) evt.getSource();
//Carregar nos botoes do menu
for(int i=0;i<numerobotoesmenu;i++){
if(aux==arrayJButtonMenu[0]){
Guardar guardar=new Guardar(posbaralho,selecionado,auxselecionado,arraySeq,baralho,arrayBaralhoAux,jogo,current,totalcartassequencias);
String fich = "Save.jds";
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fich));
out.writeObject(guardar);
out.close();
}
catch (IOException ioe) {}
}
if(aux==arrayJButtonMenu[1]){dispose();jan.setVisible(true);}
}
//Carregar na carta
if(aux==b7){
if (selecionado==false && b7.getIcon()!=null){b7.setBackground(Color.red);selecionado=true;
for(int k=0;k<nBaralhosAux;k++){
int auxajuda;
if(arrayBaralhoAux[k].size()<=1){auxajuda=0;}
else{auxajuda=arrayBaralhoAux[k].size()-1;}
arrayJButtonBaralhoAux[auxajuda][k].setBackground(null);
}
auxselecionado=false;
}
else{b7.setBackground(null);selecionado=false; }
}
//carregar nas sequencias
for(int i=0;i<nSequencias;i++){
if(aux==arrayJButtonSeq[i]){
if (selecionado==true){
if (arraySeq[i].verificaCarta(baralho.get(posbaralho))==true){
arraySeq[i].add(baralho.get(posbaralho));
arrayJButtonSeq[i].setIcon(baralho.get(posbaralho).getImageIcon());
b7.setIcon(null);
baralho.remove(posbaralho);b7.setBackground(null);
selecionado=false;
jogo.incrementaJogada();
njogadas.setText("Número de Jogadas: "+jogo.getnJogadas());
if(arraySeq[i].size()<7){
arraySetaspos[i].setLocation(303+100*i+10*(arraySeq[i].getProximoNum()-1), 150);
}
else{
ClassLoader classLoader = this.getClass().getClassLoader();
java.net.URL urlImagem = classLoader.getResource("img/check.gif");
arraySetaspos[i].setIcon(new ImageIcon(urlImagem));
arraySetaspos[i].setLocation(303+100*i+30,150);
}
}
}else{
if (auxselecionado==true){
//procurar fundo vermelho
for(int a=0;a<arrayJButtonBaralhoAux.length;a++){
for(int b=0;b<arrayJButtonBaralhoAux[0].length;b++){
if(arrayJButtonBaralhoAux[a][b].getBackground()==Color.RED){
if(arraySeq[i].verificaCarta(arrayBaralhoAux[b].get(a))==true){
if(arrayBaralhoAux[b].size()>1){
arrayJButtonBaralhoAux[a][b].setBounds(-100,-100,widthCarta,heightCarta);
}
else{
arrayJButtonBaralhoAux[0][b].setBorder(new LineBorder(Color.gray,1));
}
arrayJButtonBaralhoAux[a][b].setIcon(null);
arraySeq[i].add(arrayBaralhoAux[b].get(a));
arrayJButtonSeq[i].setIcon(arrayBaralhoAux[b].get(a).getImageIcon());
arrayBaralhoAux[b].remove(arrayBaralhoAux[b].size()-1);
arrayJButtonBaralhoAux[a][b].setBackground(null);
auxselecionado=false;
jogo.incrementaJogada();
if(arraySeq[i].size()<7){
arraySetaspos[i].setLocation(303+100*i+10*(arraySeq[i].getProximoNum()-1), 150);
}
else{
ClassLoader classLoader = this.getClass().getClassLoader();
java.net.URL urlImagem = classLoader.getResource("img/check.gif");
arraySetaspos[i].setIcon(new ImageIcon(urlImagem));
arraySetaspos[i].setLocation(303+100*i+30,150);
}
njogadas.setText("Número de Jogadas: "+jogo.getnJogadas());
}
}
}
}
}
}
totalcartassequencias=0;
for(int j=0;j<nSequencias;j++){totalcartassequencias+=arraySeq[j].size();}
if(totalcartassequencias==ncartasbaralho){
timer.stop();segundos.setText("Segundos decorridos: "+ current);JOptionPane.showMessageDialog(null,"Fim do Jogo!\n\nConclui o jogo com sucesso em "+current+" segundos e "+jogo.getnJogadas()+" jogadas!");dispose();jan.setVisible(true);
}
}
}
//virar carta
if(aux==bproximacarta && baralho.size()>0){
if(b7.getIcon()==null){
b7.setIcon(baralho.getCarta(0).getImageIcon());
}
}
//clicar no baralho auxiliar
for(int i=0;i<maxcartasbaralhoaux;i++){
for(int j=0;j<nBaralhosAux;j++){
if(aux==arrayJButtonBaralhoAux[i][j]){
int ajuda;
if (arrayBaralhoAux[j].size()==0){ajuda=0;}else{ajuda=arrayBaralhoAux[j].size()-1;}
if(selecionado==true) {
if( arrayBaralhoAux[j].size()<maxcartasbaralhoaux && arrayJButtonBaralhoAux[ajuda][j]==aux){
arrayBaralhoAux[j].add(baralho.get(posbaralho));
b7.setIcon(null);
selecionado=false;
if (arrayBaralhoAux[j].size()>1 ){
arrayJButtonBaralhoAux[i][j].setBorder(null);
arrayJButtonBaralhoAux[i+1][j].setIcon(baralho.get(posbaralho).getImageIcon());
arrayJButtonBaralhoAux[i+1][j].setBounds(arrayJButtonBaralhoAux[i][j].getX(),arrayJButtonBaralhoAux[i][j].getY()+15, widthCarta,heightCarta);
layeredpane.moveToFront(arrayJButtonBaralhoAux[i+1][j]);
}else{arrayJButtonBaralhoAux[0][j].setIcon(baralho.get(posbaralho).getImageIcon());}
baralho.remove(posbaralho);b7.setBackground(null);
jogo.incrementaJogada();
njogadas.setText("Número de Jogadas: "+jogo.getnJogadas());
}
}
else{
if(aux.getBackground()!=null){
aux.setBackground(null);auxselecionado=false;
}
if (arrayBaralhoAux[j].size()>0 && arrayJButtonBaralhoAux[arrayBaralhoAux[j].size()-1][j]==aux){
for(int k=0;k<nBaralhosAux;k++){
int auxajuda;
if(arrayBaralhoAux[k].size()<=1){
auxajuda=0;
}else{
auxajuda=arrayBaralhoAux[k].size()-1;
}
arrayJButtonBaralhoAux[auxajuda][k].setBackground(null);
}
aux.setBackground(Color.red);auxselecionado=true;
}
}
}
}
}//fim clique baralho auxiliar
}
}
//Contador
public void go() {
ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
segundos.setText("Segundos decorridos: "+ current++);
}
};
timer = new Timer(1000, action);
timer.start();
}
}
Peço desculpa em postar duas vezes seguidas mas acho que sei qual é o erro mas nao sei como corrigir.
O erro é este:
ClassLoader classLoader = this.getClass().getClassLoader();
java.net.URL urlImagem = classLoader.getResource("img/costas.png");
bproximacarta.setIcon(new ImageIcon(urlImagem ));
Quando corro pelo netbeans dá tudo muito bem, mas quando corro pelo jar ele da erro.
Alterei o caminho da urlImagem(“img/costas.png”) no netbeans para testar, ou seja inventei caminho de package que nao existe e na consola do netbeans retornou o mesmo erro que o jar na consola do windows.
Alguem me pode dizer se tenho que dar ordens para incluir aquele package no jar, eu suponho que ele faz isso automaticamente…
troque a linha 99 por isso não vai mais travar mas tamben exibe o icone
verefique se o arquivo do icone realmente existe nesse caminho
try{
bproximacarta.setIcon(new ImageIcon(urlImagem ));
}catch(Exception ex){
System.out.println("urlImagemPath = " + urlImagem.getPath());
System.out.println("erro:" + ex.getMessage());
}
[quote=maniche]Peço desculpa em postar duas vezes seguidas mas acho que sei qual é o erro mas nao sei como corrigir.
Alguem me pode dizer se tenho que dar ordens para incluir aquele package no jar, eu suponho que ele faz isso automaticamente…[/quote]
para ver se as imagens realmente estão no *.jar, renomeie ele para *.zip e abra com qualquer descompactador de arquivo, um jar é apenas um arquivo compactado
tente setar o icone assim
bproximacarta.setIcon(new ImageIcon(getClass().getResource("img/costas.png")));
[color=orange]Está corrigido![/color]
O erro era o nome da imagem, no netbeans estava em minuscula e no Package começava por maiuscula…
Depois no jar dava erro, coisa que não acontecia no netbeans, porquê nao sei…
De qualquer das formas muito obrigado!
Pensava que era um erro complicado mas afinal era só uma letra…