Extend Graphics OBJECT

Hi!
I need to add functionality to existing Graphics objects, like in:
interface ABC {
  public void drawString(String,int,int);
  public void m();
class ABCGr extends Graphics implements ABC {
  public void m() {}
class Sth extends JPanel {
  public void doSth(ABC d) {}
  public void paintComponent(Graphics g) {
    ABC d = (ABCGr)g;
    doSth(d);
}(This does not run, of course.)
The crucial point here is that doSth() is also called with something else than an extended Graphics object (i.e. another ABC).
Is the only way to achieve this to write a wrapper that contains a reference to the Graphics object and wraps all Graphics methods explicitely? This would be a bit clumsy!
Any hint to a more elegant (and probably better performing) way would be greatly appreciated!
Best regards,

As much as I hate to say it, you really can't extend the graphics object.
Here's why, basically the graphics object is supposed to be an interface to a canvas so it sit right on top of the thing that you are drawing to, be that the screen, an image in memory or the printer. SO you really can't extend it. You'd have to extend every seperate instance.
What it sounds like you want to do is provide a bunch of utility functions to the Graphics object. This is probably better done with a class of static functions like this.
class GraphicsUtil {
static void doGraphicsFun( Graphics g) {//do stuff
}I know that it's not the most elegant solution, but the graphics class is an abstract class and you can't really add functionality like that. Think about extending an interface, if you extend an interface, you can't make all the classes that implemented the old interface implment your new functions.
I wouldn't write a wrapper, this will only slow your code down, static functions are the way to go.

Similar Messages

  • How to change font/ font color etc in a graphic object using JCombobox?

    Hello
    My program im writing recently is a small tiny application which can change fonts, font sizes, font colors and background color of the graphics object containing some strings. Im planning to use Jcomboboxes for all those 4 ideas in implementing those functions. Somehow it doesnt work! Any help would be grateful.
    So currently what ive done so far is that: Im using two classes to implement the whole program. One class is the main class which contains the GUI with its components (Jcomboboxes etc..) and the other class is a class extending JPanel which does all the drawing. Therefore it contains a graphics object in that class which draws the string. However what i want it to do is using jcombobox which should contain alit of all fonts available/ font sizes/ colors etc. When i scroll through the lists and click the one item i want - the graphics object properties (font sizes/ color etc) should change as a result.
    What ive gt so far is implemented the jcomboboxes in place. Problem is i cant get the font to change once selecting an item form it.
    Another problem is that to set the color of font - i need to use it with a graphics object in the paintcomponent method. In this case i dnt want to create several diff paint.. method with different property settings (font/ size/ color)
    Below is my code; perhaps you'll understand more looking at code.
    public class main...
    Color[] Colors = {Color.BLUE, Color.RED, Color.GREEN};
            ColorList = new JComboBox(Colors);
    ColorList.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                     JComboBox cb = (JComboBox)ev.getSource();
                    Color colorType = (Color)cb.getSelectedItem();
                    drawingBoard.setBackground(colorType);
              });;1) providing the GUI is correctly implemented with components
    2) Combobox stores the colors in an array
    3) ActionListener should do following job: (but cant get it right - that is where my problem is)
    - once selected the item (color/ font size etc... as i would have similar methods for each) i want, it should pass the item into the drawingboard class (JPanel) and then this class should do the job.
    public class DrawingBoard extends JPanel {
           private String message;
           public DrawingBoard() {
                  setBackground(Color.white);
                  Font font = new Font("Serif", Font.PLAIN, fontSize);
                  setFont(font);
                  message = "";
           public void setMessage(String m) {
                message = m;
                repaint();
           public void paintComponent(Graphics g) {
                  super.paintComponent(g);
                  //setBackground(Color.RED);
                  Graphics2D g2 = (Graphics2D) g;
                  g2.setRenderingHint             
                  g2.drawString(message, 50, 50);
           public void settingFont(String font) {
                //not sure how to implement this?                          //Jcombobox should pass an item to this
                                   //it should match against all known fonts in system then set that font to the graphics
          private void settingFontSize(Graphics g, int f) {
                         //same probelm with above..              
          public void setBackgroundColor(Color c) {
               setBackground(c);
               repaint(); // still not sure if this done corretly.
          public void setFontColor(Color c) {
                    //not sure how to do this part aswell.
                   //i know a method " g.setColor(c)" exist but i need to use a graphics object - and to do that i need to pass it in (then it will cause some confusion in the main class (previous code)
           My problems have been highlighted in the comments of code above.
    Any help will be much appreciated thanks!!!

    It is the completely correct code
    I hope that's what you need
    Just put DrawingBoard into JFrame and run
    Good luck!
    public class DrawingBoard extends JPanel implements ActionListener{
         private String message = "message";
         private Font font = new Font("Serif", Font.PLAIN, 10);
         private Color color = Color.RED;
         private Color bg = Color.WHITE;
         private int size = 10;
         public DrawingBoard(){
              JComboBox cbFont = new JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
              cbFont.setActionCommand("font");
              JComboBox cbSize = new JComboBox(new Integer[]{new Integer(14), new Integer(13)});
              cbSize.setActionCommand("size");
              JComboBox cbColor = new JComboBox(new Color[]{Color.BLUE, Color.RED, Color.GREEN});
              cbColor.setActionCommand("color");
              JComboBox cbBG = new JComboBox(new Color[]{Color.BLUE, Color.RED, Color.GREEN});
              cbBG.setActionCommand("bg");
              add(cbFont);
              cbFont.addActionListener(this);
              add(cbSize);
              cbSize.addActionListener(this);
              add(cbColor);
              cbColor.addActionListener(this);
              add(cbBG);
              cbBG.addActionListener(this);
         public void setMessage(String m){
              message = m;
              repaint();
         protected void paintComponent(Graphics g){
              super.paintComponent(g);
              Graphics2D g2 = (Graphics2D)g;
              g2.setColor(bg);//set background color
              g2.fillRect(0,0, getWidth(), getHeight());          
              g2.setColor(color);//set text color
              FontRenderContext frc = g2.getFontRenderContext();
              TextLayout tl = new TextLayout(message,font,frc);//set font and message
              AffineTransform at = new AffineTransform();
              at.setToTranslation(getWidth()/2-tl.getBounds().getWidth()/2,
                        getWidth()/2 + tl.getBounds().getHeight()/2);//set text at center of panel
              g2.fill(tl.getOutline(at));
         public void actionPerformed(ActionEvent e){
              JComboBox cb = (JComboBox)e.getSource();
              if (e.getActionCommand().equals("font")){
                   font = new Font(cb.getSelectedItem().toString(), Font.PLAIN, size);
              }else if (e.getActionCommand().equals("size")){
                   size = ((Integer)cb.getSelectedItem()).intValue();
              }else if (e.getActionCommand().equals("color")){
                   color = (Color)cb.getSelectedItem();
              }else if (e.getActionCommand().equals("bg")){
                   bg = (Color)cb.getSelectedItem();
              repaint();
    }

  • Trying to move a graphics object using buttons.

    Hello, im fairly new to GUI's. Anyway I have 1 class which makes my main JFrame, then I have another 2 classes, one to draw a lil square graphics component (which iwanna move around) which is placed in the center of my main frame and then another class to draw a Buttonpanel with my buttons on which is placed at the bottom of my main frame.
    I have then made an event handling class which implements ActionListner, I am confused at how I can get the graphics object moving, and where I need to place the updateGUI() method which the actionPerformed method calls from inside the event handling class.
    I am aware you can repaint() graphics and assume this would be used, does anyone have a good example of something simular being done or could post any help or code to aid me, thanks!

    Yeah.. here's an example of custom painting on a JPanel with a box. I used a mouse as it was easier for me to setup than a nice button panel on the side.
    Anyways... it should make it pretty clear how to get everything setup, just add a button panel on the side. and use it to move the box instead of the mouse.
    -Js
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.event.MouseInputAdapter;
    public class MoveBoxAroundExample extends JFrame
         private final static int SQUARE_EDGE_LENGTH = 40;
         private JPanel panel;
         private int xPos;
         private int yPos;
         public MoveBoxAroundExample()
              this.setSize(500,500);
              this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
              this.setContentPane(getPanel());
              xPos = 250;
              yPos = 250;
              this.setVisible(true);     
         private JPanel getPanel()
              if(panel == null)
                   panel = new JPanel()
                        public void paintComponent(Graphics g)
                             super.paintComponent(g);
                             g.setColor(Color.RED);
                             g.fillRect(xPos-(SQUARE_EDGE_LENGTH/2), yPos-(SQUARE_EDGE_LENGTH/2), SQUARE_EDGE_LENGTH, SQUARE_EDGE_LENGTH);
                   MouseInputAdapter mia = new MouseInputAdapter()
                        public void mousePressed(MouseEvent e)
                            xPos = e.getX();
                            yPos = e.getY();
                            panel.repaint();
                        public void mouseDragged(MouseEvent e)
                            xPos = e.getX();
                            yPos = e.getY();
                            panel.repaint();
                   panel.addMouseListener(mia);
                   panel.addMouseMotionListener(mia);
              return panel;
         public static void main(String args[])
              new MoveBoxAroundExample();
    }

  • I cant get it to work! NullPointerExeption at first awt.Graphics Object

    I am writing a game with AWT having it as an applet. I intend NOT to use anything outside of Java 1.1
    For my Game i thought that i ATLEAST need the following classes:
    MainGame, Level, Unit.
    I Started writing Level. wrote a fewe methods for it such as
    drawGras(int grastype) And started to write MainGame to see if they would work together. it's is/is going to be my first Java application where i actually know what object orienting is... I have already wrote a game in Java but with out knowing what a class or what object orienting realy is(the game works rather good to) but this time i wanted to use object orienting but came up with problems =( if first posted in "New to Javaprogramming" but they couldn't help me and advice me here
    My previous post: http://forum.java.sun.com/thread.jsp?forum=54&thread=290558
    Here's my code:
    import java.awt.*;
    public class MainGame extends java.applet.Applet
         implements Runnable {
         Thread runner;
         Image ImgLevel, ImgUnit;
         public MainGame() {
              Level nr1 = new Level();
              nr1.init();
              nr1.setGround(300);
              nr1.drawGras(1);
              nr1.CalcGraphics();
              nr1.drawSky(1);
              Image ImgLevel = nr1.getLevelImage();
         public void paint(Graphics g) {
              g.drawImage(ImgLevel,0,0,this);
         public void update(Graphics g) {
              paint(g);
         public void init() {
              MainGame Game = new MainGame();
         public void stop() {
              runner = null;
              System.exit(1);
         public void start() {
              if(runner == null) {
                   runner = new Thread(this);
                   runner.start();
         void Pause(int time) {
             try {
                 Thread.sleep(time);
             } catch(InterruptedException e) {
               System.out.println(e.toString());
         public void run() {
              Thread thisThread = Thread.currentThread();
                   while(thisThread == runner) {
    class Level extends java.applet.Applet {
        Font BigText = new Font("Arial", Font.PLAIN, 36);
        Font Normal = new Font("Arial", Font.PLAIN, 14);
        Font Bold = new Font("Arial", Font.BOLD, 14);
        Graphics GrLevel;
        int pattern, sky, GroundtoWalk, Ground;
        Color BgColor = new Color(166,202,240);
        Color gras1 = new Color(0,255,0);
        Color gras2 = new Color(0,200,0);
        Color gras3 = new Color(0,100,0);
        Image ImgLevel;
        void setBgColor(int r, int g, int b) {
            BgColor = new Color(r,g,b);
        void CalcGraphics() {
            ImgLevel = createImage(800,600);
            GrLevel = ImgLevel.getGraphics();
        void setGround(int GrounD) {
            Ground = GrounD;
        void GroundToWalkADD(int addToGround) {
            GroundtoWalk = Ground + addToGround;
        void setGroundToWalk(int GrToWalk) {
            GroundtoWalk = GrToWalk;
        public void init() {
              System.out.println("Init 1"); // This was placed here when i was checking how far it got when debuging
              CalcGraphics();
              System.out.println("Init 2");
              drawGras(1);
              System.out.println("Init 3");
              repaint();
              System.out.println("Init 4");
        Image getLevelImage() {
            return ImgLevel;
        public void paint(Graphics g) {
              g.drawImage(ImgLevel,0,0,this);
        public void update(Graphics g) {
            paint(g);
        void drawGras(int pt) {
         GrLevel.setColor(BgColor);
         GrLevel.fillRect(0,0,800,600);
         switch(pt) {
              case 1:
                   GrLevel.setColor(gras1);
                   GrLevel.fillRect(0,GroundtoWalk,800,300);
                   GrLevel.setClip(0,GroundtoWalk,800,300);
                   for(int i = 0; 890>i;i=i+5) {
                        GrLevel.setColor(gras2);
                        GrLevel.drawLine(0+i,GroundtoWalk,-190+i,GroundtoWalk+300);
                   for(int i=950; 0<i; i=i-5) {
                        GrLevel.setColor(gras3);
                        GrLevel.drawLine(890-i,GroundtoWalk,1000-i,GroundtoWalk+300);
              break;
              case 2:
                   GrLevel.setColor(gras2);
                   GrLevel.fillRect(0,GroundtoWalk+5,800,300);
                   for(int i = 0; 890>i;i=i+5) {
                        GrLevel.setColor(gras3);
                        GrLevel.drawLine(0+i,GroundtoWalk,-190+i,GroundtoWalk+300);
                   for(int i=950; 0<i; i=i-5) {
                        GrLevel.setColor(gras1);
                        GrLevel.drawLine(890-i,GroundtoWalk,1000-i,GroundtoWalk+300);
              break;
              case 3:
                   GrLevel.setColor(gras3);
                   GrLevel.fillRect(0,GroundtoWalk+10,800,300);
                   for(int i = 0; 800>i; i=i+20) {
                        GrLevel.fillArc(0+i,GroundtoWalk,20,20,180,-180);
              break;
         pattern = pt;
        int getGrasPattern() {
             return pattern;
        void drawSky(int cl) {
                GrLevel.setColor(BgColor);
                GrLevel.fillRect(0,0,800,155);
                switch(cl) {
                    case 1:
                   for(int y = 0;y<7;y++) {
                   for(int x = 0;x<800;x=x+20) {
                                GrLevel.setColor(Color.white);
                                GrLevel.drawArc(x,y*20,20,20,180,180);
                                GrLevel.setColor(Color.red);
                                GrLevel.drawArc(x,y*20+4,20,20,180,180);
                                GrLevel.setColor(Color.yellow);
                                GrLevel.drawArc(x,y*20+2,20,20,180,180);
                                GrLevel.setColor(Color.green);
                                GrLevel.drawArc(x,y*20+8,20,20,180,180);
                                GrLevel.setColor(Color.blue);
                                GrLevel.drawArc(x,y*20+12,20,20,180,180);
                                GrLevel.setColor(Color.pink);
                                GrLevel.drawArc(x,y*20+16,20,20,180,180);
              break;
              case 2:
                        GrLevel.setColor(Color.gray);
              break;
         sky = cl;
         GrLevel.setFont(BigText);
         GrLevel.setColor(Color.black);
         GrLevel.fillRect(0,0,800,50);
         GrLevel.setColor(Color.white);
         GrLevel.drawString("Score Tabel - comming someday",((size().width)/2)-260, 40);
        int getSkyTyp() {
             return sky;
    }I tested running the code of class Level by puting it into Level.java and compiled it...ran it with appletviewer and it worked as it was intended to.
    But when i compiled it with MainGame... and in the HTML started MainGame.class,.....applet didn't intializeand i got the following error messege:
    Init 1
    java.lang.NullPointerException
            at Level.CalcGraphics(MainGame.java:84)
            at MainGame.<init>(MainGame.java:11)Line 82: void CalcGraphics() {
    Line 83: ImgLevel = createImage(800,600);
    Line 84: GrLevel = ImgLevel.getGraphics(); // The First awt.Graphics object
    Line 85: }
    Line 9:      public MainGame() {
    Line 10:     Level nr1 = new Level();
    Line 11:     nr1.CalcGraphics(); // calling the method above -> same error first awt.Graphics Object.
    If i change it os that "drawGras" comes first it's first awt.Graphics Line will show the same error
    Hope some one can and will help me

    As per the documentation of
    java.awt.Component.createImage(int,int):
    Creates an off-screen drawable image to be used for
    double buffering.
    Parameters:
    width - the specified width
    height - the specified height
    Returns:
    an off-screen drawable image, which can be used for
    double buffering. The return value may be null if the
    component is not displayable. This will always happen
    if GraphicsEnvironment.isHeadless() returns true.
    Since:
    JDK1.0 its not
    ImgLevel = createImage(800,600); that's making the problem but The first awt.Graphics Object in class Level, no mather which on it is =((
    >
    The key part is '...may be null if the component is
    not displayable.'
    You should put your graphics initialization code in
    start(), which will be called when your applet is
    ready to go. Before then, your applet is not
    displayable. (Also, remember to dispose() your
    graphics in your stop() method, if not sooner.)for the part writen above...I'll try to change it like you are saying.
    Thanx for your help!

  • Accessing graphics object?

    Hi,
    I was wondering, is the only place the graphics object relevent inside the paintComponent method?
    I'm asking because I have a method that draws a custom progress bar. I have another method that draws that progress bar filling up over a arbitrary period of time. I want to use Thread.sleep() to provide a delay between redraws.
    Now I have the first method inside the paintComponent() method of a JPanel. Thats fine, works great! Now I didn't want to put the redraw method inside the paintComponent because the Thread delay will manifest itself in the painting of the component. So I thought I could solve this by making the second method a public one and using the getGraphics() method of the JPanel call the method once the object is instantiated. However this gives me a NullPointerException as soon as the method calls on the graphics object. Any ideas where I'm going wrong? Thanks!
    Method inside extended JPanel object
    public void testRun(Graphics g)
            // Cast to Graphics2D
            Graphics2D g2 = (Graphics2D)g;
            while(percentComplete < 100)
                try {
                    Thread.sleep(30);
                } catch (java.lang.InterruptedException ie) {
                    System.err.println("We got a problem");
                drawProgressBar(g2,percentComplete);
                percentComplete += 1;+
    +        }+
    +        percentComplete+ = 1;
            drawProgressBar(g2,percentComplete); // contains a repaint() method call to object
        }This inside the method of another object
    private void setupContentPanel()
            cpb = new CustomProgressBar();
            mainWindow.add(pb, BorderLayout.CENTER);
            cpb.testRun( pb.getGraphics() );
        }

    No, don't use update(...), that's not at all what the method is for. Also, avoid getGraphics() like the plague.
    What you need to do is increment an instance field using a Swing Timer, and invoke repaint(). The paintComponent override should use the current value of the instance field for appropriate painting. Example:import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    public class PseudoProgressBar {
       int progress = 0;
       JPanel panel= new JPanel() {
             @Override
             protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                int w = getWidth();
                int h = getHeight();
                g.fillRect(0, h/2-10, (w * progress)/100, 20);
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
                new PseudoProgressBar().makeUI();
       public void makeUI() {
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setSize(400, 100);
          frame.setContentPane(panel);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
          new Timer(100, new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                progress %= 100;
                progress++;
                panel.repaint();
          }).start();
    }db

  • Getting the image of a graphics object?

    Hi,
    I have a graphics object that I want to update on a thread, but i don't want to redraw everything I had on each time I update (I only want to draw new items). in my paintComponent function, I have
    public void paintComponent(Graphics g)
              Graphics2D g2 = (Graphics2D)g;
              if (bufferedImage == null)
                   bufferedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
              g2.drawImage(bufferedImage, 0, 0, null);
              drawBackground(g2);
              addItem(g2);
                 g2_ = g2;
         }where drawBackground makes the constant background and addItem draws new points. The problem that I'm having is that it is only drawing new items on the graph and not adding on to the existing image. I think this is because I never set bufferedImage to the current image, but I'm not sure how to do this?
    Thanks

    demo:
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    @SuppressWarnings("serial") public class Example extends JComponent {
        private BufferedImage buffer;
            setOpaque(true);
        @Override protected void paintComponent(Graphics g) {
            int w = getWidth(), h = getHeight();
            if (buffer == null ||
                w > buffer.getWidth() || h > buffer.getHeight()) {
                buffer = getGraphicsConfiguration().createCompatibleImage(w, h);
                composeBuffer();
            g.drawImage(buffer, 0, 0, null);
        protected void composeBuffer() {
            Graphics2D g2 = buffer.createGraphics();
            g2.setColor(Color.RED);
            g2.drawLine(0, 0, buffer.getWidth(), buffer.getHeight());
            g2.dispose();
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable(){
                public void run() {
                    JComponent comp = new Example();
                    comp.setPreferredSize(new Dimension(400,300));
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.add(comp);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
    }

  • Creating an Edge that connects two Graphic objects

    Hi flex geeks
    I am trying to create a flowchart type of application in flex. I created shaped by extending Graphic class. Now i want to connect them by and edge.
    I tried to achieve this using the path. But my requirements are a bit more that this approch of drawing edges could handle.
    I want the edges to have the arrow heads and tail. I cant find a way how to implement it using the path object.
    A screen shot of exisiting design is shown below. Kindly help me with some inputs in this regards.
    Thank You

    Perhaps one of these links will help:
    http://osflash.org/pipermail/osflash_osflash.org/2008-February/014865.html

  • Draw to an image using graphics object

    ive been trying to this. create a starfield 800px wide and twice the height of the screen 2x600. this image would be scrolling down the screen giving the appearance of moving through space. what i did was create an image the called "starField", and created a graphics object "starFieldObj" to draw dots (stars) to this image.
    is this the correct way to do this? my program seems to work differently depending on where i call "generateStarField()" which draws to "starFieldObj"
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    public class Alpha1 extends Canvas implements Runnable, MouseMotionListener, MouseListener, KeyListener {
         private Image buffer; //bufer image
         private Graphics gfx;
         private Graphics starFieldObj;
         private Image playerShip;
         private int frames = 60; //frames per second
         private MediaTracker mediaTracker; //tracks loaded images
         private boolean ready; //ready to  start animation
         private int [] keys = new int[256];
         private int playerShipX = 100;
         private int playerShipY = 100;
         private static Random random = new Random();
         private Image starField;
         private int starFieldSpeed = 5;
         private int starFieldX = 0;
         private int starFieldY = -600;
         public static void main(String[] args)
              Alpha1 t = new Alpha1();
              Frame f = new Frame("blah");
              f.setSize(800, 600);
              f.add(t, BorderLayout.CENTER);
              f.show();
              t.start();
              t.requestFocus();
              f.addWindowListener(new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                        System.exit(0);}});
         public Alpha1()
              addKeyListener(this);
              addMouseListener(this);
              ready = false;
              mediaTracker = new MediaTracker(this);
              playerShip = getToolkit().getImage("testship1.png");
              //starField = getToolkit().getImage("testbg.png");
              //mediaTracker.addImage(playerShip, 0);
              mediaTracker.addImage(starField, 0);
              try {
                   mediaTracker.waitForID(0);
              catch (InterruptedException e) {
                   e.printStackTrace();
         public void start()
              buffer = createImage(getSize().width,getSize().height);
              //starField = createImage(getSize().width,getSize().height * 2);
              gfx = buffer.getGraphics();
              //starFieldObj = starField.getGraphics();
              generateStarfield();
              ready = true;
              new Thread(this).start();
         public void mouseDragged(MouseEvent e)     {}
         public void mouseMoved(MouseEvent e)     
              playerShipX = e.getX();
              playerShipY = e.getY();
         public void mouseReleased(MouseEvent e)     {}
         public void mousePressed(MouseEvent e)     {}
         public void mouseExited(MouseEvent e)     {}
         public void mouseEntered(MouseEvent e)  {}
         public void mouseClicked(MouseEvent e)     {}
         public void keyTyped(KeyEvent keyevent)     {}
         public void keyPressed(KeyEvent keyevent)
              keys[keyevent.getKeyCode()] = 1;
              System.out.println(keyevent.getKeyCode());
         public void keyReleased(KeyEvent keyevent)     
              keys[keyevent.getKeyCode()] = 0;
         public void run()
              while (true)
                   if (isVisible())
                        repaint();
                        updatePositions();
                   }//end if
                   try 
                   { Thread.sleep(1000/frames); }
                   catch (InterruptedException e)
                   { e.printStackTrace(); }
              }//end while
         public void paint(Graphics g) {     /*empty etc*/ }
         public void updatePositions()
              if (keys[38] == 1 & keys[40] == 0) //IF UP IS PRESSED
              { playerShipY -= 3; }
              if (keys[40] == 1 & keys[38] == 0) //IF DOWN IS PRESSED
              { playerShipY += 6; }
              if (keys[37] == 1 & keys[39] == 0) //IF LEFT IS PRESSED
              { playerShipX -= 5; }
              if (keys[39] == 1 & keys[37] == 0) //IF RIGHT IS PRESSED
              { playerShipX += 5; }
              //starFieldY = starFieldY + starFieldSpeed;
              //if (starFieldY == 0)
              //     starFieldY = -600;
              //     System.out.println("dadssa");
         public int getRandom(int from, int to)
              if (from > to)
                   int randTemp;
                   randTemp = from;
                   from = to;
                   to = randTemp;
              return random.nextInt(to-from+1)+from;
         public void generateStarfield()
              starFieldObj.setColor(Color.black);
              starFieldObj.fillRect (0, 0, 800, 600 * 2);
              for (int td=0; td < 900 ; td++) //draw 900x2 dots on 800x1200 image
                        starFieldObj.fillRect (getRandom(1,800), getRandom(1,600), 1, 1);
                        starFieldObj.fillRect (getRandom(1,800) + 800, getRandom(1,600) + 800, 1, 1);
         public void update(Graphics g)
              if (ready)
                   gfx.setColor(Color.black);
                   gfx.fillRect (0, 0, this.getSize().width, this.getSize().height);
                   //gfx.drawImage(starField,starFieldX,starFieldY,null);
                   gfx.drawImage(playerShip,playerShipX,playerShipY,null);
                   //gfx.drawString(Integer.toString(showFps),5,5);
                   g.drawImage(buffer,0,0,null);
    }

    updated code, i cant get starField to be 1200px in height
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    public class Alpha1 extends Canvas implements Runnable, MouseMotionListener, MouseListener, KeyListener {
         private Image buffer; //bufer image
         private Graphics gfx;
         private Graphics starFieldObj;
         private Image playerShip;
         private int frames = 60; //frames per second
         private MediaTracker mediaTracker; //tracks loaded images
         private boolean ready; //ready to  start animation
         private int [] keys = new int[256];
         private int playerShipX = 100;
         private int playerShipY = 100;
         private static Random random = new Random();
         private Image starField;
         private int starFieldSpeed = 5;
         private int starFieldX = 0;
         private int starFieldY = -600;
         public static void main(String[] args)
              Alpha1 t = new Alpha1();
              Frame f = new Frame("blah");
              f.setSize(800, 600);
              f.add(t, BorderLayout.CENTER);
              f.show();
              t.start();
              t.requestFocus();
              f.addWindowListener(new WindowAdapter(){
                   public void windowClosing(WindowEvent e){
                        System.exit(0);}});
         public Alpha1()
              addKeyListener(this);
              addMouseListener(this);
              ready = false;
              mediaTracker = new MediaTracker(this);
              playerShip = getToolkit().getImage("testship1.png");
              //starField = getToolkit().getImage("testbg.png");
              //mediaTracker.addImage(playerShip, 0);
              mediaTracker.addImage(starField, 0);
              try {
                   mediaTracker.waitForID(0);
              catch (InterruptedException e) {
                   e.printStackTrace();
         public void start()
              buffer = createImage(getSize().width,getSize().height);
              starField = createImage(getSize().width,1200);
              gfx = buffer.getGraphics();
              starFieldObj = starField.getGraphics();
              ready = true;
              new Thread(this).start();
         public void mouseDragged(MouseEvent e)     {}
         public void mouseMoved(MouseEvent e)     
              playerShipX = e.getX();
              playerShipY = e.getY();
         public void mouseReleased(MouseEvent e)     {}
         public void mousePressed(MouseEvent e)     {}
         public void mouseExited(MouseEvent e)     {}
         public void mouseEntered(MouseEvent e)  {}
         public void mouseClicked(MouseEvent e)     {}
         public void keyTyped(KeyEvent keyevent)     {}
         public void keyPressed(KeyEvent keyevent)
              keys[keyevent.getKeyCode()] = 1;
              System.out.println(keyevent.getKeyCode());
         public void keyReleased(KeyEvent keyevent)     
              keys[keyevent.getKeyCode()] = 0;
         public void run()
              generateStarfield();
              while (true)
                   if (isVisible())
                        repaint();
                        updatePositions();
                   }//end if
                   try 
                   { Thread.sleep(1000/frames); }
                   catch (InterruptedException e)
                   { e.printStackTrace(); }
              }//end while
         public void paint(Graphics g) {     /*empty etc*/ }
         public void updatePositions()
              if (keys[38] == 1 & keys[40] == 0) //IF UP IS PRESSED
              { playerShipY -= 3; }
              if (keys[40] == 1 & keys[38] == 0) //IF DOWN IS PRESSED
              { playerShipY += 6; }
              if (keys[37] == 1 & keys[39] == 0) //IF LEFT IS PRESSED
              { playerShipX -= 5; }
              if (keys[39] == 1 & keys[37] == 0) //IF RIGHT IS PRESSED
              { playerShipX += 5; }
              starFieldY = starFieldY + starFieldSpeed;
              if (starFieldY == 0)
                   starFieldY = -600;
                   System.out.println("dadssa");
         public int getRandom(int from, int to)
              if (from > to)
                   int randTemp;
                   randTemp = from;
                   from = to;
                   to = randTemp;
              return random.nextInt(to-from+1)+from;
         public void generateStarfield()
              starFieldObj.setColor(Color.black);
              starFieldObj.fillRect (0, 0, 800, 1200);
              for (int td=0; td < 900 ; td++) //draw 900x2 dots on 800x1200 image
                        starFieldObj.setColor(Color.white);
                        starFieldObj.fillRect (getRandom(1,800), getRandom(1,600), 1, 1);
                        starFieldObj.fillRect (getRandom(1,800) + 800, getRandom(1,600) + 800, 1, 1);
         public void update(Graphics g)
              if (ready)
                   gfx.setColor(Color.black);
                   //gfx.fillRect (0, 0, this.getSize().width, this.getSize().height);
                   gfx.drawImage(starField,starFieldX,starFieldY,null);
                   gfx.drawImage(playerShip,playerShipX,playerShipY,null);
                   //gfx.drawString(Integer.toString(showFps),5,5);
                   g.drawImage(buffer,0,0,null);
    }

  • Graphics object disappears

    Hi,
    My question is - why when I paint a graphics object (a java 2D object) onto a Frame , my graphics object appears on the screen for literally a split second and then disappears.
    How can I prevent this?
    Here's the code:
    public void paintSimple()
    Graphics h = null;
    show();
    h = this.getContentPane().getGraphics() ;
    Polygon p = new Polygon();
    p.addPoint(1,34);
    p.addPoint(23, 344);
    p.addPoint(234, 3);
    p.addPoint(12,42);
    h.setColor(Color.magenta);
    h.drawLine(1,222,333,44);
    this.getContentPane().update(h);
    Thanks,
    rpodolny

    Hi,
    Just a quick idea ...
    Your class possibly extends frame ...
    then overwrite the following:
    public void paint(Graphics g) {
    update(g);
    and ...
    public void update(Graphics g) {
    Graphics2D gd = (Graphics2D) g;
    Polygon p = new Polygon();
    p.addPoint(1,34);
    p.addPoint(23, 344);
    p.addPoint(234, 3);
    p.addPoint(12,42);
    gd.setColor(Color.magenta);
    gd.drawLine(1,222,333,44);
    //probably draw you Polygon somewhere ....
    I hope this is helping a bit. I think that the image is drawn and the over-drawn immediately after in the underlying methods. Now your drawing should be painted in every update so it should stay on the screen ...
    Hope this helps,
    Tim

  • Transparent Graphics Object

    Alright, I have one graphics object that draws all of the main elements of the screen, and I have a buffered image that is modified through a second graphics object. I want to know how to make the background for the second object transparent, so that if I drew something onto it, then drew the buffered image into the main graphics object, I'd be able to see all the drawing done in the original graphics object behind the uncovered areas, sort of like an overlay. Code examples are highly appreciated. Thanks in advance for any replies.
    (PS: Right now when I draw the image, it covers up the entire screen with the color grey, making it impossible to see the objects behind it.)

    I wrote example for AWT because in SWING it can be done very easy. Run this code, it runs fine. Use only your image files.
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.awt.*;
    import java.awt.event.*;
    public class ImageTest extends Canvas implements WindowListener {
    public static void main(String[] args) {
    Frame frame = new Frame("Image testing");
    ImageTest instance = new ImageTest();
    frame.add(instance);
    frame.addWindowListener(instance);
    frame.pack();
    frame.setVisible(true);
    public Dimension getPreferredSize() {
    return new Dimension(256, 256);
    BufferedImage backgroundImage;
    BufferedImage alphaImage;
    void initImage() {
    Image img = getToolkit().createImage("D:\\temp\\JavaTests\\viewcode.jpg");
    Image bkImage = getToolkit().createImage("D:\\temp\\JavaTests\\SolarEclipse.jpg");
    MediaTracker Mt = new MediaTracker(this);
    Mt.addImage(img, 0);
    Mt.addImage(bkImage, 1);
    try{
    Mt.waitForAll();
    }catch(Exception e){};
    BufferedImage bi = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_4BYTE_ABGR);
    alphaImage = new BufferedImage(bkImage.getWidth(this), bkImage.getHeight(this), BufferedImage.TYPE_4BYTE_ABGR);
    Graphics gr = bi.getGraphics();
    gr.drawImage(img, 0, 0, this);
    backgroundImage = (BufferedImage)bi;
    gr = alphaImage.getGraphics();
    gr.drawImage(bkImage, 0, 0, bkImage.getWidth(this)/2, bkImage.getHeight(this)/2, bkImage.getWidth(this)/2, bkImage.getHeight(this)/2, bkImage.getWidth(this), bkImage.getHeight(this), this);
    Color bl = new Color(0, 0, 0);
    for (int x=0; x<bkImage.getWidth(this); x++)
    for (int y=0; y<alphaImage.getHeight(this); y++) {
    Color c = new Color(alphaImage.getRGB(x,y));
    int r = c.getRed();//x*4;
    int g = c.getGreen();//y*4;
    int b = c.getBlue();//255 - (x+y)*2;//Math.abs(y*8-255);
    // Make transparent colors, which look like black
    int a = (r == b && g == b && r < 100 && g < 100 && b < 100)?0:255;
    int vv = (a<<24) | (r<<16) | (g<<8) | b;
    alphaImage.setRGB(x, y, vv);
    public void paint(Graphics gfx) {
    if (backgroundImage == null)
    initImage();
    gfx.drawImage(backgroundImage, 0, 0, this);
    int i = 0;
    int delta = 100;
    gfx.drawImage(alphaImage, i, i, this);
    gfx.drawImage(alphaImage, i + delta, i + delta, this);
    gfx.drawImage(alphaImage, i + delta*2, i + delta*2, this);
    gfx.drawImage(alphaImage, i + delta*3, i + delta*3, this);
    gfx.drawImage(alphaImage, i + delta*4, i + delta*4, this);
    gfx.drawImage(alphaImage, i + delta*5, i + delta*5, this);
    void exitForm(java.awt.event.WindowEvent evt) {
    System.exit(0);
    public void windowActivated(java.awt.event.WindowEvent windowEvent) {
    public void windowClosed(java.awt.event.WindowEvent windowEvent) {
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
    System.exit(0);
    public void windowDeactivated(java.awt.event.WindowEvent windowEvent) {
    public void windowDeiconified(java.awt.event.WindowEvent windowEvent) {
    public void windowIconified(java.awt.event.WindowEvent windowEvent) {
    public void windowOpened(java.awt.event.WindowEvent windowEvent) {

  • Graphics object nullpointerException

    I'm making a game and it's suddenly broken. It was working fine, and it suddenly stopped. I know that programs don't just stop but I haven't modified any code from the bit which seems to be failing.
    When running the program now, i receive the following error :
    Uncaught exception java/lang/NullPointerException.Now annoyingly it does not tell me where this is coming from so it makes life difficult to fix.
    Manually sifting through the code due to the debugger being useless I've found what seems to be an error when creating the graphics object in the run method (threaded class) but I'm still confused
    Graphics g = getGraphics();If i place a simple System.out.println(); message before this, I am given the message before the error, and if I place it after I am given the message after the error, so I can only assume that the error is being caused here. However, when I use
    System.out.println(g==null);I am receiving the mess false. So g is not null so must be getting set.
    The class extends the GameCanvas and implements Runnable. The Thread is being created in the constructor with
    Thread t = new Thread(this);
                t.start();Can anyone help.
    Thanks

    ok no worries. Turns out it wasn't actually in the graphics object assignment but further in the code in another class. Stupid lack of error detail :(
    thanks anyway

  • Painting a SVG file to a Graphics object

    I'd like to import a SVG file and paint it's contents on a Graphics object.
    Something like this:
    SVGImage img = new SVGImage( "example.svg" );
    And then, a method like this:
    img.render( Graphics g , int x , int y );
    That's pretty much all I need. Please keep it simple.
    Oh and, if you're going to redirect me to either Batik or SVGSalamander, would you mind telling me a simple way of creating this kind of code with those engines?
    By the way: If possible, I'd also like to rotate the image on the render method, as in:
    render ( Graphics g , int x , int y , int angle )
    But if that turns out to be too complicated, just rendering it is already really good.
    Thank you very much. =D
    Edited by: KaoroSorane on Aug 25, 2009 9:45 AM
    Edited by: KaoroSorane on Aug 25, 2009 11:05 AM

    Hi,
    Perhaps using ScalableGraphics could help you...
    No guarantees 'cause I'm just learning too but here's some pseudo code to play around with:
    final class SVGScreen extends MainScreen
    protected SVGImage _image;
    protected ScalableGraphics m_sg = ScalableGraphics.createInstance();
    int x_centerpoint;
    int y_centerpoint;
    //constructor
    SVGScreen()
        x_centerpoint = 100;
        y_centerpoint = 100;
        try {
                // Load our svg image.
                _image = loadSVGImage("/my_svg_file.svg");
        } catch (IOException e) {
                e.printStackTrace();
    }//end constructor
    public void paint(Graphics graphics) {
        m_sg.bindTarget(graphics);
        m_sg.render(x_centerpoint, y_centerpoint,_image);
        m_sg.releaseTarget();
    }//end paint
         * Loads an SVGImage from a given URL.
         * @param url The path to the svg image we want to load.
         * @return The loaded svg image.
        private SVGImage loadSVGImage(String url) throws IOException
            // Open our input stream of the svg file we want to load.
            InputStream inputStream = getClass().getResourceAsStream(url);   
            // Load our svg image from the input stream.
            return (SVGImage)SVGImage.createImage(inputStream, null);
        }HTH
    B
    Edited by: blueinc on Sep 11, 2009 2:08 PM

  • Java app Graphics object help

    Hey, how do I get a graphics object in a Java application? In an applet, the entire thing's a graphics object. I want to somehow draw stuff onto a JPanel or something of the like. How do I do this?!?!?

    you need to overload the paint() method inherited from java.awt.Component , for example:
    public void paint(Graphics g) {
      g.setColor(new java.awt.Color(0,0,255));
      g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
    }note that this will totally override the look of the component. I'm not sure whether you can call super.paint() in the event that you are extending a panel or other non-abstract AWT or Swing component.
    McF

  • Creating new graphics object from a existing one and sending it for print

    Hello,
    i have a graphics object which is big in size, I am creating a new graphics object from the existing one as given below
    //map is a graphic object
    Graphic g1 = (Graphic)map.create(x,y,width,height);
    Graphic g2 = (Graphic)map.create(x,y,width1,height1);
    Graphic g3 = (Graphic)map.create(x,y,width2,height2);
    arrayList.add(g1);
    arrayList.add(g2);
    arrayList.add(g3);
    Now I want to send the graphic object g1,g2,g3 for print in the method
    public int print (Graphics g, PageFormat pf, int idx) throws PrinterException {
    // Printable's method implementation
    if (curPageFormat != pf) {
    curPageFormat = pf;
    pages = repaginate (pf);
    if (idx >= 3)) {
    return Printable.NO_SUCH_PAGE;
    g = (Graphics) arrayList.get(idx);
    return Printable.PAGE_EXISTS;
    This is not working... what is wrong. can anybody suggest..
    I tried standardprint.java to print a object inside a scrollpane, it is not printing the entire diagram. so I am thinking of something like this.... Please let me know what to do....
    Thanks
    Serj

    The easy way to do this is create a copy using Windows Explorer.
    Open the project and go to File > Rename.
    Then you have your 2013 ready made project.
    See www.grainge.org for RoboHelp and Authoring tips
    @petergrainge

  • Problem with decimal data visualization in a circular graphic object type

    When we are design a report using Crystal Reports 2008 we found the following problem. When we insert an object of type circle graphic selecting the option in the graphics wizard for view in the legend data both in value and percentage (u2018bothu2019 design) we cant show them in a two decimals format at the same time.
    Using the option u2018number formatu2019 and indicating two decimals only affects the value but not the percentage.
    Show both the value and the percentage with two decimals at same time itu2019s a necessary requirement for our report design.
    Is there any way to show both the value and the percentage in a circle graphic object with two decimals at the same time?
    Thanks.

    hello Jose,
    i am not sure what you mean by "circular graphic object type".
    there's nothing in the standard cr 2008 build that has this that i've ever found that creates a circle other than inserting a box and changing the rounding on the corners. if you're using a 3rd party product or add-on you'll need to contact whoever built it.
    cheers,
    jamie

Maybe you are looking for