Pessoal comecei a fazer um jogo de damas, só q estou com dificuldade pra desenhar os componentes na tela, a lógica ja esta toda feita só tenho duvida na parte de jogar no Frame. Ai vai meu codigo:
package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.nio.Buffer;
import javax.swing.JFrame;
/**
* Esse codigo cria o Frame e desenha os retangulos nele c/ o metodo criaretangulo()
*/
public class Frame extends JFrame {
private final int size = 30, size2 = 15, sizep = 12;
private final int largura = size*8, altura = size*8;
BufferedImage imagebuffer;
Color cor = new Color(255,250,250);
private int x=0, y=0;
public Frame(){
super("Damas");
this.setSize(largura, altura);
this.setLayout(null);
this.getContentPane().setBackground(cor);
this.setVisible(true);
Criaretangulo();
this.setVisible(true);
}
public void Criaretangulo(){
// tam e tipo de cada retangulo
imagebuffer = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
// variavel de Graphics recebe o valor de imegebuffer, para desenhar em um espaço reservado de memória
Graphics grafico = imagebuffer.createGraphics();
// cor com a qual vai desenhar
grafico.setColor(Color.GRAY);
// desanhando retangulo preenchido de acordo c/ as posicoes x e y = 0
grafico.fillRect(x, y, size, size);
// desenha outro quadrado em outra posicao: x = 30; y = 30 (tamanho de size)
grafico.setColor(Color.GRAY);
grafico.fillRect(size, size, size, size);
this.setVisible(true);
}
}
package game;
public class Principal {
/**
* @param args
* Classe Principal que chama o frame
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame frm = new Frame();
}
}
Só que quando eu rodo não aparece nenhum quadrado no Frame. Se alguem souber me ajude. Obrigado.
Dê uma lida sobre Java2D. É razoavelmente simples:
http://www.pontov.com.br/site/java/48-java2d/97-pintando-no-java-2d
http://docs.oracle.com/javase/tutorial/2d/geometry/primitives.html
Um exemplo:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class Tabuleiro extends JPanel {
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Rectangle2D.Double r;
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(Color.WHITE);
r = new Rectangle2D.Double(1,1,100,100);
g2.fill(r);
r = new Rectangle2D.Double(100,100,100,100);
g2.fill(r);
g2.setPaint(Color.BLACK);
r = new Rectangle2D.Double(1,100,100,100);
g2.fill(r);
r = new Rectangle2D.Double(100,1,100,100);
g2.fill(r);
g2.dispose();
}
}
import javax.swing.JFrame;
public class Tela1 extends JFrame {
public Tela1() {
setExtendedState(JFrame.MAXIMIZED_BOTH);
getContentPane().add(new Tabuleiro());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]){
new Tela1().setVisible(true);
}
}
Com um pouco de matemática, dá pra gerar o tabuleiro usando laços for.
Abraço.
Valeu ae cara vou ler sobre o assunto e implementar aqui. :)
Cara to com um problema aqui o eclipse Juno aqui que eu tenho não funciona o recurso de auto completação não sei porque. Você sabe o que pode ser ? Ele nem importa as classes da API do java Ex: JPanel, JTextfield... :)
Cara consegui resolver o problema do auto-completar. Agora gostaria de colocar uma borda em torno do tabuleiro, se é que vc me entende, pra diferenciar o tabuleiro do resto do Frame,q tb tem o fundo branco. Li um pouco sobre o Graphics2D e nele tem um método setStroke(), do Graphics2D para setar borda.
Tentei fazer aqui só que ele so seta a borda pra cada retângulo separadamente, queria colocar no tabuleiro inteiro. Vou postar me codigo aqui :
package game;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class Tabuleiro extends JPanel {
int i,j;
int size=45;
public Tabuleiro(){
this.setBackground(Color.WHITE);
this.setVisible(true);
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
Rectangle2D.Double r;
Graphics2D g2 = (Graphics2D) g.create();
final BasicStroke stroke = new BasicStroke(10.0f); // falta o formato aqui
// Usando for pra desenhar em toda a mesa os quad. Pretos
for(i=2;i<6;i++)
for(j=2;j<6;j++){
g2.setColor(Color.BLACK);
r = new Rectangle2D.Double(i*2*size, j*2*size, size, size);
g2.fill(r); // desenha a forma pintada
r = new Rectangle2D.Double(i*2*size+size, j*2*size+size, size, size);
g2.fill(r); // desenha a forma pintada
}
g2.setStroke(stroke); // coloca borda no tabuleiro inteiro(dando errado aqui)
g2.dispose();
}
}
Classe Principal(nao modifiquei nada):
package game;
import java.awt.Color;
import javax.swing.JFrame;
public class Principal extends JFrame {
public Principal(){
setExtendedState(JFrame.MAXIMIZED_BOTH);
this.getContentPane().add(new Tabuleiro());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* @param args
*/
public static void main(String[] args) {
new Principal().setVisible(true);
}
}
Ao invés de usar o setStroke(), coloque um retângulo (Rectangle2D) de fundo e desenhe o tabuleiro sobre ele. Note que esse retângulo tem que ser maior que todos os outros retângulos juntos, senão não vai aparecer. Algo do tipo:
[code]protected void paintComponent(Graphics g){
super.paintComponent(g);
Rectangle2D.Double r;
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(Color.BLUE);
// os valores são fictícios, só pra você ter uma ideia de
// que ele deve ser maior que todos os demais juntos
Rectangle2D fundo = new Rectangle2D.Float(0,0,1000,1000);
// aqui você desenha o tabuleiro, do jeito que já fez.
// talvez seja necessário colocá-lo um pouco mais para a direita e mais para baixo
}[/code]
Abraço.