Salim Azeri
Salim Azeri

Reputation: 31

Java JFrame rectangle in window

so i'm trying to put Rectangle2D.Float in window using JFrame but when i'm compiling code i'm getting just blank window without rectangle. Can you guys take look on it and tell me what i'm doing wrong?

package zestaw8;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Plansza85 extends JPanel
{
   Shape figura;
   Plansza85(Shape figura)            
   {                                
      this.figura=figura;
   }                                
}

public class Zestaw8_cw85 
{
    public static void main(String[] args)                
   {                                                     
      Shape obj1;                                        
      obj1=new Rectangle2D.Float(100,100,140,140);      

      zestaw8.Plansza85 p;                                         
      p=new zestaw8.Plansza85(obj1);

      JFrame jf=new JFrame();                            
      jf.setTitle("Plansza p");                       
      jf.setSize(400,400);                               
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      jf.setVisible(true);
      jf.add(p);
   }
}

Upvotes: 0

Views: 325

Answers (2)

Ele
Ele

Reputation: 33726

You need to override the paintComponent method of Plansza85

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

class Plansza85 extends JPanel {
    private Shape figura;

    Plansza85(Shape figura) {
        this.figura = figura;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(figura);
    }
}

public class Zestaw8_cw85 {
    public static void main(String[] args) {
        Shape obj1;
        obj1 = new Rectangle2D.Float(100, 100, 140, 140);

        Plansza85 p;
        p = new Plansza85(obj1);

        JFrame jf = new JFrame();
        jf.setTitle("Plansza p");
        jf.setSize(400, 400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(p);
        jf.setVisible(true);
    }
}

Hope it helps!

Upvotes: 0

MadProgrammer
MadProgrammer

Reputation: 347314

You seem to have a misunderstanding of how painting works in Swing.

Start by looking at Performing Custom Painting, Painting in Swing and 2D Graphics. Rectangle2D is a graphics primitive, which needs to be painted through the normal custom painting process

As per the common recommendations of Performing Custom Painting you should override the paintComponent method of the Plansza85 and paint the Shape through the Graphics2D API, something like...

Painted

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Shape obj1;
                obj1 = new Rectangle2D.Float(100, 100, 140, 140);

                Plansza85 p;
                p = new Plansza85(obj1);

                JFrame jf = new JFrame();
                jf.setTitle("Plansza p");
                jf.add(p);
                jf.pack();
                jf.setLocationRelativeTo(null);
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jf.setVisible(true);
            }
        });
    }

    class Plansza85 extends JPanel {

        Shape figura;

        Plansza85(Shape figura) {
            this.figura = figura;
        }

        @Override
        public Dimension getPreferredSize() {
            if (figura == null) {
                return super.getPreferredSize();
            }
            Rectangle2D bounds = figura.getBounds2D();
            double width = bounds.getMaxX();
            double height = bounds.getMaxY();

            return new Dimension((int)width + 1, (int)height + 1);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getForeground());
            g2d.draw(figura);
            g2d.dispose();
        }
    }
}

for example.

I've also overridden the getPreferredSize method to generate an appropriate sizing hint for the component based on the size of the shape, I've done this because I dislike guess work and the window also includes variable sized borders and title bars which will change the size the panel if you only rely on setSize

Upvotes: 3

Related Questions