Problema com canvas e JFrame no linux(ubuntu)

Fala galera,

estou com o seguinte problema, estou realizando testes em desenhar imagens através de canvas em um jframe, no windows a classe a seguir funciona certo, mas no me ubuntu a imagem naum aparece sempre, e o jframe fica travando direto, alguem sabe algo que pode ser.

[code]import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

class CanvasTeste extends Canvas {

public BufferedImage img;

public void paint(Graphics g) {
    super.paint(g);
    
    g.drawImage(img, 50, 50, null);
}

}

public class ImageTest {

public static void main(String[] args) {
    try {
        BufferedImage img = ImageIO.read(new File("\\bixo.jpg"));
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBackground(new Color(Color.TRANSLUCENT));
        f.setResizable(false);
        f.setSize(600, 480);
        
        CanvasTeste ct = new CanvasTeste();
        ct.img = img;
        f.getContentPane().add(ct);
        
        f.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}[/code]

Agradeço
[]s

Não misture AWT e Swing repetindo não misture AWT e Swing.

Ao invés de fazer um filho de JCanvas, faça um de JComponent.

AWT tem componentes HeavyWeight. Eles não são exatamente desenhados na tela, mas são herdados do SO. Já o Swing é lightweight. Os componentes da AWT sempre irão se sobrepor aos do Swing, o que gera um comportamento péssimo e instável.

Use só o Swing. Hoje não há mais motivos para inserir AWT em seu código.

[code]class CanvasTeste extends JComponent {
public BufferedImage img;

public void paintComponent(Graphics g) {
super.paintComponent(g);
if (img == null) return;

  Graphics2D g2d = (Graphics2D) g.create();
  g.drawImage(img, 50, 50, null);  
  g2d.dispose();

}
} [/code]

Substitui o seu código pelo meu, porém deu erro na linha super.paint(g);, comentei essa linha para testar e funcionou, não testei no linux ainda pois aqui no trampo eu uso o windows. Assim que eu testar eu posto aqui, mas fiquei na dúvida quanto essa linha que comentei, fiz algo errado?

Como meu código ficou:

[code]import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

class CanvasTeste extends JComponent {
public BufferedImage img;

public void paintComponent(Graphics g) {
//super.paint(g);
if (img == null) return;

  Graphics2D g2d = (Graphics2D) g.create();
  g.drawImage(img, 50, 50, null);  
  g2d.dispose();

}
}

public class ImageTest {

public static void main(String[] args) {
    try {
        BufferedImage img = ImageIO.read(new File("\\bixo.jpg"));
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setBackground(new Color(Color.TRANSLUCENT));
        f.setResizable(false);
        f.setSize(600, 480);
        
        CanvasTeste ct = new CanvasTeste();
        ct.img = img;
        f.getContentPane().add(ct);
        
        f.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}[/code]

Obrigado

[]s

Sim, é pq o método agora é paintComponent.

Então será
super.paintComponent(g);

No lugar de
super.paint(g);

Já corrigi no código lá em cima.

Já que você está começando com Java2D, não custa dar uma lida primeiro em:
http://java.sun.com/products/jfc/tsc/articles/painting/#swing
http://java.sun.com/docs/books/tutorial/2d/index.html

Agora vi lá :smiley:

Funcionou, vou ver no linux depois e posto se der certo.

Irei ver sim esses links, irei precisar mesmo de mais conhecimento em java2d para fazer o que estou planejando.

Muito obrigado pela ajuda :smiley:

Só de curiosidade… o que você está planejando fazer?

Então, eu vivia criando jogos em programas feitos para isso, um tal de RPG Maker, Game Maker e alguns outros.

Ai a algum tempo eu instalei o linux no meu computador e queria criar jogos nele também. Mas todos esses programas citados acima são da plataforma windows.

Resolvi então criar algo no java que é multiplataforma, então estou criando um framework para criar jogos de rpg.

E penso futaramente, digo futuramente mesmo, criar uma IDE que utilize esse frameworks :smiley:

Nesse caso, esses dois links também são pra você:
http://www.cokeandcode.com/spaceinvaderstutorial
http://fivedots.coe.psu.ac.th/~ad/jg/

E, se possível, é uma boa adquirir esse livro também:
http://www.brackeen.com/javagamebook/

E não custa olhar APIs como essa aqui:
http://www.jmonkeyengine.com
http://www.libsdl.org

Testei no ubuntu, não deu certo.

Suspeitei de o problema ser no JFrame e não na imagem, então criei um simples JFrame apenas, e este já travou, será que o JFrame não funciona no linux?

Caso não existe alguma alternativa ao JFrame.

obrigado

Existe o JDialog.

Ou, no caso de você programar em AWT direto, o Frame (e, nesse caso, você volta a usar o Canvas).

Mas que estranho, já procurou sobre esse bug no google?

Dei uma procurada sim, mas não encontrei nada, talvez algum problema no meu micro? Pois acho bem improvavel existir um bug desse e ninguem ter falado, vou tentar instalar o java 6 nele pois atualmente está o 5, se nada funcionar vou ter que continuar a programar no windows :?

Eu estou aqui com o mesmo problema com o JFrame no Linux. O código funciona até encontrar uma linha do tipo “new JFrame()”. A partir dai da uma exceção:

Exception in thread “main” java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173)
at java.awt.Window.(Window.java:437)
at java.awt.Frame.(Frame.java:419)
at javax.swing.JFrame.(JFrame.java:224)
at zell.Main.main(Main.java:18)

Vou ver de descubro os motivos do problema. Qualquer coisa eu posto a solução aqui. E se alguém descobrir anarquiza a coisa pra galera ai o/

Estou com o mesmo problema, não aparece nada no linux. Não achei a solução ainda.