Sie sind auf Seite 1von 14

import java.awt.

*;
import java.applet.*;
public class anim1 extends Applet{
public void paint (Graphics g)
{
g.drawString("",400,300);
}
public static void main(String ad[])
{
anim1 a=new anim1();
Graphics g1;
a.paint(g1);
}
}

Cmo inicializar una variable de grficos?


Trat Graphics g = new Grficos () y Graphics g; pero dice que no se pueden crear
instancias.Necesito pasar Graphics g de un mtodo a otro, as que no puedo llamarlo desde el
argumento.Cualquier ayuda se agradece.
Este es mi cdigo:
import
import
import
import
import
import

java
java
java
java
java
java

.
.
.
.
.
.

awt . Graphics ;
awt . Color ;
awt . Image ;
applet . Applet ;
lang . Math ;
util . Random ;

pblica clase testApp extiende JApplet


{pblico
void init ()
{esto.
add (nueva RandomCardsPanel ());}
public RandomCardsPanel extends JPanel
{
public Image card1 , card2 , card3 , card4 , card5 , card6 , card7 , card8 , card9 ,
card10 , card11 , card12 , card13 ;
public Image card14 , card15 , card16 , card17 , card18 , card19 , card20 , card21 ,
card22 , card23 , card24 , card25 , card26 ;
public Image card27 , card28 , card29 , card30 , card31 , card32 , card33 , card34 ,
card35 , card36 , card37 , card38 , card39 ;
public Image card40 , card41 , card42 , card43 , card44 , card45 , card46 , card47 ,
card48 , card49 , card50 , card51 , card52 ;
pblica RandomCardsPanel ()
{Imagen

[] tarjeta = nueva imagen [52];


card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card
card

[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[

0 ] = getImage ( getDocumentBase (), "c1.gif" );


1 ] = getImage ( getDocumentBase (), "c2.gif" );
2 ] = getImage ( getDocumentBase (), "c3.gif" );
3 ] = getImage ( getDocumentBase (), "c4.gif" );
4 ] = getImage ( getDocumentBase (), "c5.gif" );
5 ] = getImage ( getDocumentBase (), "c6.gif" );
6 ] = getImage ( getDocumentBase (), "c7.gif" );
7 ] = getImage ( getDocumentBase (), "c8.gif" );
8 ] = getImage ( getDocumentBase (), "c9.gif" );
9 ] = getImage ( getDocumentBase (), "c10.gif" );
10 ] = getImage ( getDocumentBase (), "cj.gif" );
11 ] = getImage ( getDocumentBase (), "cq.gif" );
12 ] = getImage ( getDocumentBase (), "ck.gif" );
13 ] = getImage ( getDocumentBase (), "d1.gif" );
14 ] = getImage ( getDocumentBase (), "d2.gif" );
15 ] = getImage ( getDocumentBase (), "d3.gif" );
16 ] = getImage ( getDocumentBase (), "d4.gif" );
17 ] = getImage ( getDocumentBase (), "d5.gif" );
18 ] = getImage ( getDocumentBase (), "d6.gif" );
19 ] = getImage ( getDocumentBase (), "d7.gif" );
20 ] = getImage ( getDocumentBase (), "d8.gif" );
21 ] = getImage ( getDocumentBase (), "d9.gif" );
22 ] = getImage ( getDocumentBase (), "d10.gif" );
23 ] = getImage ( getDocumentBase (), "dj.gif" );
24 ] = getImage ( getDocumentBase (), "dq.gif" );
25 ] = getImage ( getDocumentBase (), "dk.gif" );
26 ] = getImage ( getDocumentBase (), "h1.gif" );
27 ] = getImage ( getDocumentBase (), "h2.gif" );
28 ] = getImage ( getDocumentBase (), "h3.gif" );
29 ] = getImage ( getDocumentBase (), "h4.gif" );
30 ] = getImage ( getDocumentBase (), "h5.gif" );
31 ] = getImage ( getDocumentBase (), "h6.gif" );
32 ] = getImage ( getDocumentBase (), "h7.gif" );
33 ] = getImage ( getDocumentBase (), "h8.gif" );
34 ] = getImage ( getDocumentBase (), "h9.gif" );
35 ] = getImage ( getDocumentBase (), "h10.gif" );
36 ] = getImage ( getDocumentBase (), "hj.gif" );
37 ] = getImage ( getDocumentBase (), "hq.gif" );
38 ] = getImage ( getDocumentBase (), "hk.gif" );
39 ] = getImage ( getDocumentBase (), "s1.gif" );
40 ] = getImage ( getDocumentBase (), "s2.gif" );
41 ] = getImage ( getDocumentBase (), "s3.gif" );
42 ] = getImage ( getDocumentBase (), "s4.gif" );
43 ] = getImage ( getDocumentBase (), "s5.gif" );
44 ] = getImage ( getDocumentBase (), "s6.gif" );
45 ] = getImage ( getDocumentBase (), "s7.gif" );
46 ] = getImage ( getDocumentBase (), "s8.gif" );
47 ] = getImage ( getDocumentBase (), "s9.gif" );
48 ] = getImage ( getDocumentBase (), "s10.gif" );
49 ] = getImage ( getDocumentBase (), "sj.gif" );
50 ] = getImage ( getDocumentBase (), "sq.gif" );
51 ] = getImage ( getDocumentBase (), "sk.gif" );

String cardNumber ;
double cardRandom ;
int cardRandomNumber ;
public int [] ranNum = new int [ 10 ];
Random ran = new Random ();
for ( int number = 0 ; number <= 9 ; )
{
cardRandom = ran . nextInt ( 52 ) + 1 ;
cardRandomNumber = ( int ) Math . round ( cardRandom );
si (cardRandomNumber> 0 && cardRandomNumber <= 52)
{ranNum [nmero] = cardRandomNumber;
nmero ++;}}}

public void paintComponent ( Graphics g )


{
setBackground ( Color . green );
g . drawImage ( cards [ ranNum [ 0 ]], 10 , 10 , this );
}

}
java grficos inicializacin

cuota de mejorar esta pregunta

editado 17 de septiembre '12 a pregunt 08 de septiembre '12


las 19:39
en 22:54

Cdigo-Aprendiz

Albert Dong

20.6k23891

4928

Aparecen todos los componentes en la parte superior de lo que usted est


sencillo utilizar un BufferedImage. - Andrew Thompson
aadir un comentario

3 Respuestas
activosms antiguosvotos
up

vote

vote downaceptada

Normalmente no es necesario para inicializar un Grficos variables ya que la mayora


pintura debe hacerse de componentes paintComponent () mtodo. (Y no se puede
hacer Graphics g = new Grficos (); porque Grficos es una clase abstracta.) Por lo
general, voy a crear una clase que extiende JPanel y anular el paintComponent () mtodo
para hacer mi pintura personalizada. A partir de ah, puedo pasar el Grficos referencia a
cualquier otro mtodo que ms lo necesitan.
Trate de hacer esto. Por supuesto, estoy hablando a un nivel abstracto bonita. Hganos
saber lo que averiguar de estos consejos y vamos a trabajar desde all.
Editar:

JComponent declara un mtodo abstracto paintComponent (Graphics g). Si desea

proporcionar su propia aplicacin, que debe coincidir con esta firma de mtodo
exactamente. Eso significa que slo se permite un solo parmetro, es decir,
un Grficos objeto.
Usted es libre de crear un paintComponent () mtodo con ms argumentos, pero desde la
firma del mtodo no coincide, no ser llamado automticamente en el Tema Evento
Despacho cuando el sistema operativo decide el applet necesita ser repintado.
Con eso dicho, usted no tiene que extender JPanel con el fin de conseguir que esto
funcione. Puede ampliar cualquier clase que a su vez tiene JComponent como un
antepasado. En su caso particular, JPanel parece la mejor opcin. Le sugiero que
refactorizar el cdigo de la siguiente manera:
En RandomCards.java
pblicas RandomCards extiende JApplet {pblico
void init () {esto.
add (nuevos RandomCardsPanel ();}}

En RandomCardsPanel.java
pblica RandomCardsPanel extiende JPanel {// variables miembro privadas poner
aqu
pblica RandomCardsPanel () {// Dicho cdigo de su mtodo init actual ()
aqu}
pblica vaco paintComponent (Grficos g) {// Ponga su cdigo de pintura
personalizados aqu, incluyendo el establecimiento de el color de fondo y dibujar
las imgenes de la
tarjeta}}

Tengo algunas sugerencias adicionales, si no te importa:


1.
Tenga en cuenta que me estoy extendiendo JApplet lugar de Applet. Esta es la
clase preferida. Applet es todava alrededor de compatibilidad hacia atrs con
AWT. Modernos applets Java utilizan JApplet y Swing en su lugar.
2.
Al cdigo de guin, utilizar espacios en lugar de tabuladores. Aqu se muestran de
una manera dependiente del sistema. Esto significa que si usted ve su cdigo en otro
editor o en otro equipo, cdigo de ficha con formato no puede aparecer la manera que
quera. En particular, se puede ver que este sitio web no formatea el cdigo
correctamente. La mayora de los editores de texto tienen un ajuste para reemplazar
pestaas con espacios. Te sugiero que averige cmo hacer esto con la tuya.
3.
Cuando usted se encuentra el uso de nombres de variables que slo se diferencian
con un sufijo de nmero (por ejemplo card1 Imagen, card2, card3, Card4,
card5, etc.), se debe utilizar una matriz en su lugar.
4.
Usted est utilizando un conjunto dentro del init () mtodo. Sin embargo, usted ha
declarado como una variable local. Esto significa que ninguno de sus otros mtodos
puede ver la tarjeta de gama usted declar aqu. Usted debe declarar esto como una
variable miembro en lugar de lacard1, card2, card3, etc. variables. Lo mismo ocurre
con cualquier otra variable que hay que utilizar en su paintComponent () mtodo, ya
que slo puede tener un nico Graphics gparmetro.
5.
Usted no necesita llamar paintComponent () de forma explcita. De hecho,

usted no deberallamarlo expicitly. El sistema se llama este mtodo siempre que sea
apropiado.
Espero que esto ayude a aclarar algunos puntos. Buena suerte con su experiencia en
Java. Hganos saber si usted tiene ms preguntas.
cuota de mejorar esta respuesta

editado 16 de septiembre '12 a contestado 8 '12 septiembre a


las 17:05
las 22:58

Cdigo-Aprendiz
20.6k23891

Buen enfoque, muy bien explicado. Otra forma de obtener el control directo de un grfico ejemplo es pintar en
un BufferedImage (y mostrarlo en una etiqueta). - Andrew Thompson 09 de septiembre '12 en 01:09
Le importara que muestra un ejemplo por favor? Creo que entiendo lo que usted dice, pero quiero confirmar.
Dong 11 de septiembre '12 a doce y veintitrs
1 AlbertDong Yo preferira que usted publique cdigo que muestra lo que usted entiende. Estar ms que feliz y
dispuesto a ayudarle a partir de ah. Usted puede editar su pregunta original aqu o publicar una nueva pregunta
completa, lo que usted piensa que es ms apropiado. - Cdigo-Aprendiz 11 de septiembre '12 a las 3:00
Lo siento por la respuesta tarda. Tuvo problemas con su ordenador y no era capaz de hacerlo funcionar hasta ayer.
editado mi cdigo original y sustituye pintura w / paintComponent (). Estoy seguro de lo que quieres decir con pintura
personalizada sin embargo. Necesito extender mi clase con JPanel con el fin de utilizar paintComponent ()?
Dong 16 de septiembre '12 a las 14:21
AlbertDong No s si es as le notifica de mi edicin de forma automtica. Este comentario seguramente llamar su
atencin, sin embargo. ;-) - Cdigo-Aprendiz 16 de septiembre '12 a las 17:07
mostrar 3 comentarios ms

up

Bueno, hay dos cuestiones aqu:

vote

por

voto

Grficos g1;
una. Pintura (G1);

Y que est recibiendo el error que G1 no se ha inicializado. Eso es porque el g1 variables


no se ajusta a cualquier cosa, y que provoca un error de compilacin. Para obtener el
cdigo para compilar, usted tendra que, por lo menos hacer esto:
Grficos g1 = nula;
una. Pintura (G1);

Sin embargo, que, obviamente, no le ayudar demasiado. Usted obtendr una


NullPointerException cuando intenta ejecutar el cdigo. Con el fin de hacer realidad sus
grficos para dibujar lo que necesitas lo siguiente:
So1 una = nueva So1 ();
Grficos g1 = SO1. GetGraphics ();
una. Pintura (G1);

Por ejemplo:

import java. AWT. *;


import javax. oscilacin. *;
import java. subprograma. *;
pblica clase So1 extiende Applet {
pblica nula pintura (Grficos g)
{g. drawString ("hola", 40, 30);}
pblica esttica void principal (Cadena ad [])
{
JFrame jp1 = new JFrame ();
So1 a = new So1 ();
jp1 . getContentPane (). add ( a , BorderLayout . CENTER );
jp1 . setSize ( new Dimension ( 500 , 500 ));
jp1 . setVisible ( true );
}}

Ahora notamos, en realidad no llamamos la pintura () funcionar a nosotros mismos. Eso es


manejado por el AWT, que en realidad recoge el contexto grfico, y llama a nuestra
funcin de pintura para nosotros. Si lo desea, sin embargo, puede pasar en cualquier objeto
grfico que desee y pedirle que recurrir a eso. (as que si quieres llamar su componente en
una imagen, usted puede hacerlo)

// Bresenham.java
import
import
import
import
import

java.awt.*;
java.awt.event.*;
java.util.*;
javax.swing.JFrame;
java.lang.Math;

public class Bresenham extends JFrame {


// Main function, called when the program starts
public static void main(String[] args) {

// check for arguments:


// Argument l for line algorithm
// Argumetn c for circle algorithm
/*
if (args.length < 1) {
System.err.println("Usage: Bresenham [ l | c ]");

System.exit(-1);
}
if (args[0].equalsIgnoreCase("l")) {
}
if (args[0].equalsIgnoreCase("c")) {
}
*/
// Create an instance of this class that does the painting
new Bresenham();
}

// Constructor
Bresenham() {
// Call the constructor of the superclass
// i.e. open a JFrame named "Bresenham"
super("Bresenham");
// add a window listener that exits the program when the
JFrame is closed
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0);}});
setSize(900, 720);
// Add a canvas to the JFrame's ContentPane.
// The class CanvasBresenham inherits from Canvas!
getContentPane().add("Center", new CanvasBresenham());
// finally show it. This triggers the Canvas' paint
method.
show();
// this should be used, if the object to be painted has
changed.
// repaint();
}
}
class CanvasBresenham extends Canvas {
int centerX, centerY, dGrid = 1, maxX, maxY;
// initialize the graphics
void initgr() {
Dimension d;
// get the window size and compute minimum, maximum and
center

d = getSize();
maxX = d.width - 1;
maxY = d.height - 1;
centerX = maxX/2; centerY = maxY/2;

// draw one pixel of size dGrid


void putPixel(Graphics g, int x, int y)
{
g.drawRect(x, y, dGrid, dGrid);
}
void drawLine(Graphics g, int x1, int y1, int x2, int y2) {
// Insert your algorithm here
// just to show something...
// show start and end points
putPixel(g, x1, y1);
}

putPixel(g, x2, y2);

void drawCircle(Graphics g, int xC, int yC, int radius) {


// Insert your algorithm here
// Just to show something...
// show center and one point on the circle
putPixel(g, xC, yC);
putPixel(g, xC+radius, yC+radius);
}

// do the painting within this canvas


// this method overrides the method "paint" in the class "Canvas"
public void paint(Graphics g) {
initgr();
drawLine(g, centerX, centerY, centerX+200, centerY+20);
drawCircle(g, 230, 100, 40);
}
}

Algoritmo basado en la ecuacin de la recta

Algoritmo bsico
El algoritmo bsico utiliza la ecuacin de la recta expresada como
y = mx + b
Si la recta se dibuja desde el punto (x0, y0) hasta el punto (x1, y1), el algoritmo
varia x desde x0 hasta x1 en incrementos de una unidad. El siguiente es el cdigo
en Java.

public void rectaSimple(int x0, int y0, int x1, int y1,
Graphics g){
int dx = x1 - x0;
int dy = y1 - y0;
g.drawLine( x0, y0, x0, y0);//funciona!!
if (dx != 0){
float m = (float) dy / (float) dx;
float b = y0 - m*x0;
if(x1 > x0)
dx = 1;
else
dx = -1;
while (x0 != x1) {
x0 += dx;
y0 = Math.round(m*x0 + b);
g.drawLine( x0, y0, x0, y0);
}
}
}
El siguiente applet permite ver el proceso paso a paso. Seleccione dos puntos
sobre la cuadrcula y presione el botn "Siguiente" para ejecutar cada paso. Para
borrar presione el botn "Borrar". Note que para pendientes mayores de 45 o
menores de -45 el algoritmo dibuja rectas discontinuas.

Algoritmo bsico para cualquier pendiente


El siguiente algoritmo es una mejora sobre el anterior. el algoritmo dibuja rectas
con cualquier pendiente.
public void rectaSimple2(int x0, int y0, int x1, int y1,
Grtaphics g)
{
int dx = x1 - x0;
int dy = y1 - y0;
g.drawLine( x0, y0, x0, y0);
if (Math.abs(dx) > Math.abs(dy)) {
pendiente < 1
float m = (float) dy / (float) dx;
float b = y0 - m*x0;
if(dx<0)
dx = -1;
else
dx = 1;
while (x0 != x1) {
x0 += dx;
y0 = Math.round(m*x0 + b);
g.drawLine( x0, y0, x0, y0);
}
} else
if (dy != 0) {
>= 1
float m = (float) dx / (float) dy;
compute slope
float b = x0 - m*y0;
if(dy<0)
dy = -1;
else
dy = 1;
while (y0 != y1) {
y0 += dy;
x0 = Math.round(m*y0 + b);
g.drawLine( x0, y0, x0, y0);
}
}
}

//

// slope
//

Algoritmo de Bresenham

El algoritmo busca cual de dos pxeles es el que esta mas cerca segn la
trayectoria de la lnea. Consideremos el proceso de conversin para
lneas con pendiente positiva 0 < m < 1. Las posiciones de pxel a lo
largo de la trayectoria de una lnea se determinan al efectuar un
muestreo de x en intervalos unitarios.

1. Se capturan los dos extremos de la lnea y se almacena el extremo


izquierdo en (x0,y0).
2. Se traza el primer punto (x0, y0).
3. Se calculan las constantes y, x, 2y, 2y-2x, y se obtiene el valor
inicial para el parmetro de decisin como p0 = 2 y - x.
4. En cada xk a lo largo de la lnea, que inicia en k = 0, se efecta la
prueba siguiente:
si pk < 0, el siguiente punto que se debe trazar es (xk+1, yk) y pk +1 = pk +
2 y. De otro modo, el siguiente punto en trazarse es (xk+1, yk+1)
y pk +1 = pk + 2 y - 2x.
5. Se repite el paso 4 otras x veces.

voidLineBres(Graphicsg,intx0,inty0,intx1,int
y1){
intx,y,dx,dy,xend,p,incE,incNE;
dx=abs(x1x0);
dy=abs(y1y0);
p=2*dydx;
incE=2*dy;
incNE=2*(dydx);
/*determinarquepuntousarparaempezar,cualpara
terminar*/
if(x0>x1){

x=x1;
y=y1;
xend=x0;
}
else{
x=x0;
y=y0;
xend=x1;
}
g.drawLine( x0, y0, x0, y0);

/*seciclahastallegaralextremodelalnea*/
while(x<=xend){
g.drawLine(x,y,x,y);
x=x+1;
if(p<0)
p=p+incE
else{
y=y+1;
p=p+incNE;
}
g.drawLine( x0, y0, x0, y0);

}
}
El algoritmo de Bresenham se generaliza para lneas con una pendiente
arbitraria al considerar la simetra entre los diversos octantes y
cuadrantes del plano de xy. Para una lnea con una pendiente m > 1,
intercambiamos las funciones de las direcciones de x y y, o sea, pasamos
a lo largo de y en pasos unitarios y calculamos los valores sucesivos de x

que se aproximan mas a la trayectoria de la lnea. Asimismo, podemos


revisar el programa para trazar pxeles iniciando desde cualquier
extremo.

El programa resultante es el siguiente:


public void Bresenham(Graphics g,int x0, int y0, int
x1, int y1)
int x, y, dx, dy, p, incE, incNE, stepx, stepy;
dx = (x1 - x0);
dy = (y1 - y0);
/* determinar que punto usar para empezar, cual para
terminar */
if (dy < 0) {
dy = -dy; stepy = -1;
}
else
stepy = 1;
if (dx < 0) {
dx = -dx; stepx = -1;
}
else
stepx = 1;
x = x0;
y = y0;
g.drawLine( x0, y0, x0, y0);

/* se cicla hasta llegar al extremo de la lnea */


if(dx>dy){
p = 2*dy - dx;
incE = 2*dy;
incNE = 2*(dy-dx);
while (x != x1){
x = x + stepx;
if (p < 0){
p = p + incE;
}
else {

y = y + stepy;
p = p + incNE;
}
g.drawLine( x0, y0, x0, y0);

}
}
else{
p = 2*dx - dy;
incE = 2*dx;
incNE = 2*(dx-dy);
while (y != y1){
y = y + stepy;
if (p < 0){
p = p + incE;
}
else {
x = x + stepx;
p = p + incNE;
}
g.drawLine( x0, y0, x0, y0);

}
}
}

Das könnte Ihnen auch gefallen