Omnimaga

General Discussion => Technology and Development => Computer Programming => Topic started by: Munchor on August 18, 2011, 12:25:15 pm

Title: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 12:25:15 pm
I was just trying to add Graphics2D to a Frame this way:

Game.java
Code: [Select]
import java.awt.Component;

public class Game
{
public static void main(String[] args)
{
MainFrame mainFrame = new MainFrame();
MainGraphics mainGraphics = new MainGraphics();
mainFrame.getContentPane().add(mainGraphics);
}
}

That file contains the main function, where I create a new frame and a new graphics (both classes made in separate files), and then I try to add the graphics to the frame.

The problem is, though, I get:

Quote
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
   Cannot instantiate the type MainGraphics
   The method add(Component) in the type Container is not applicable for the arguments (MainGraphics)

I can only add components to frames and content panes.

So I tried to make mainGraphics a component, like this:

Code: [Select]
Component mainGraphics = new MainGraphics();
However, I get (in this line):

Quote
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
   Type mismatch: cannot convert from MainGraphics to Component
   Cannot instantiate the type MainGraphics

Does anybody know how to solve this? Thanks! Also, MainGraphics is an abstract class, here's its code:

Code: [Select]
import java.awt.Graphics2D;


public abstract class MainGraphics extends Graphics2D {
public MainGraphics()
{
this.create();
this.drawLine(5, 5, 10, 10);
}
}
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 18, 2011, 12:42:23 pm
for one, as you said, MainGraphics is an abstract class so you can't make an object from it. secondly, you can't add graphics to a frame because the class Graphics2D is not a type of Component. here's a quick graphics example to get what you want to do:

Code: [Select]
public class Test extends JPanel{

    public Test(){
        JFrame frame = new JFrame("test");
        frame.getContentPane().add(this);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(5, 5, 10, 10);
    }

    public static void main(String[] args){
        new Test();
    }
}
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 12:45:32 pm
Nemo, what if I use Graphics instead of Graphics2D? The example you gave me is good, but the problem is I need my code organized in separate files, I am expecting this to be a rather large project.

Thanks for the quick response too!
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 18, 2011, 12:54:38 pm
Graphics is also an abstract class, so that wouldn't work either. you can still split it into multiple files:

Code: ("Runner.java") [Select]
public class Runner{
    public static void main(String[] args){
        new Game().run();
    }
}
Code: ("Game.java") [Select]
public class Game extends JPanel{
    public Game(){
        //set up JFrame
    }
    public void run(){
        //show JFrame
    }
    public void paintComponent(Graphics g){
        //paint things here
    }
}

what are you making, by the way? if you're worried the paintComponent method will get too large because you have too many objects to draw e.g. you have an array of 100 enemies, your character, the background, the tilemap etc. just make an Enemy, Character, Tilemap class and have them each have a draw(Graphics) method.
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 01:03:36 pm
Thanks nemo! I have this now:

Runner.java
Code: [Select]
public class Runner
{
    public static void main(String[] args)
    {
        new Game().run();
    }
}

Game.java
Code: [Select]
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel
{
    JFrame mainFrame = new JFrame("Game");

public Game()
{
        mainFrame.setSize(800, 600);
    }
    public void run()
    {
        mainFrame.setVisible(true);
    }
    public void paintComponent(Graphics2D g)
    {
        super.paintComponent(g);
        g.drawLine(5, 5, 10, 10);
    }
}

Right now, my only question is adding the Graphics to the Game Panel. Thanks!
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 18, 2011, 02:17:46 pm
the Game class has a Graphics instance variable inherited from JPanel. you don't need to add it. you can access the graphics variable using paintComponent.
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 02:21:39 pm
Game.java
Code: [Select]
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel
{
    JFrame mainFrame = new JFrame("Game");

public Game()
{
        mainFrame.setSize(800, 600);
    }
    public void run()
    {
        mainFrame.setVisible(true);
    }
    public void paintComponent(Graphics2D g)
    {
        super.paintComponent(g);
        g.drawLine(5, 5, 10, 10);
    }
}

Runner.java
Code: [Select]
public class Runner
{
    public static void main(String[] args)
    {
        new Game().run();
    }
}

Well, the line I'm drawing is not appearing, do you know what's wrong? Thanks!
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 18, 2011, 02:23:55 pm
yes, you aren't adding the game panel to the JFrame.
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 02:27:07 pm
Hm, I tried adding this in public Game():

Code: [Select]
mainFrame.getContentPane().add(this);
So that I had the panel to the frame, but I still don't see the line.

Thanks a lot!
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 18, 2011, 02:37:34 pm
the exact some code is working on my computer. are you sure you saved/recompiled before you ran the code? also, what's the project you're working on?
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 18, 2011, 02:39:50 pm
the exact some code is working on my computer. are you sure you saved/recompiled before you ran the code? also, what's the project you're working on?

I just created those two files and then used "javac" to compile Game.java and then Runner.java, then used "java Runner" to run the program.

@Nemo: It's no project yet, it's more like testing.
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 19, 2011, 10:07:36 am
Game.java
Code: [Select]
import java.awt.Graphics2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel
{
    JFrame mainFrame = new JFrame("Game");

public Game()
{
        mainFrame.setSize(800, 600);
       
        JButton myButton = new JButton("hello");
       
        mainFrame.getContentPane().add(this);
        this.add(myButton);
    }
    public void run()
    {
        mainFrame.setVisible(true);
    }
    public void paintComponent(Graphics2D g)
    {
        super.paintComponent(g);
        g.fillArc(5, 5, 100, 100, 45, 45);
        g.drawLine(5, 5, 10, 10);
    }
}

I managed to add a button to the panel and it appears, so perhaps I'm not adding the Graphics to the panel. How would I do that? Thanks, once again.
Title: Re: [Java] Adding graphics to frame
Post by: nemo on August 19, 2011, 03:54:06 pm
Again, you cannot add Graphics to the panel. JPanels have a Graphics instance variable already. i just noticed your method header for paintComponent is incorrect. it's parameter should be of type Graphics, not Graphics2D.
Title: Re: [Java] Adding graphics to frame
Post by: Munchor on August 19, 2011, 03:57:14 pm
Again, you cannot add Graphics to the panel. JPanels have a Graphics instance variable already. i just noticed your method header for paintComponent is incorrect. it's parameter should be of type Graphics, not Graphics2D.

I understand nemo, it works now, thanks a lot!

I know, though, that I can turn Graphics to Graphics2D and I know how ;)