Hello, I have a button which on clicks display a frame, where i have 2 radio buttons. When i choose one of the radio button it draws an image on the panel, however when i click on the button again, the image drawn is disappeared and i am not able to draw more than 1 image on the frame. The second image is overriding the first image drawn.
here is my code:

        // class1

        import java.awt.*;
        import java.awt.event.MouseAdapter;
        import java.awt.event.MouseEvent;
        import java.awt.image.BufferedImage;
        import java.io.File;
        import java.io.IOException;
        import javax.imageio.ImageIO;



        import java.awt.Dimension;




        /**
         *
         * @author User
         */
        public class Buildings {
            private Image img,img2;
            private String s;
            private int b_index;
            private BufferedImage image, offScreenImage;
            private int width,height;


            private String s_shopping="School";
            private String building="Building";




            public Buildings(){

                try{

                    img= ImageIO.read(new File("building.jpg"));
                    img2=ImageIO.read(new File("s1.jpg"));

                }
                catch(IOException e){
                System.out.println("Image not found");
            }


            }





            public void PaintBuilding(Graphics2D  offScreenG2D, int x, int y){

                offScreenG2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);

                offScreenG2D.drawImage(img, x,y,null);
                offScreenG2D.drawString(building, x+1, y+1);

            }

        public void PaintSchool(Graphics2D g2d, int x, int y){

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);

            g2d.drawImage(img2, x,y,null);
                g2d.drawString(s_shopping, x+1, y+1);

            }


            public String getString(){
                return s;
            }

            public void setString(String s){
                this.s=s;
            }

            public void setBIndex(int index){
                this.b_index=index;
            }

            public int getBIndex(){
                return b_index;
            }


        }

        //class2

        import javax.swing.*;
        import java.awt.*;
        import java.awt.event.ItemEvent;
        import java.awt.event.ItemListener;

        class BuildingOptions extends JFrame{
            JRadioButton rb1;
            JRadioButton rb2;
            ButtonGroup bgroup;
            private int build_index;
            JPanel panelRbutton;
            // modify the line below to the second line
            // Buildings build= new Buildings();
            static Buildings build;

            // modify the constructor as shown
            public BuildingOptions( Buildings build ){
                super("Choose a building");

                // add this line:
                this.build = build;

                build.setBIndex(build_index);
                rb1= new JRadioButton("Add a School");
                rb2=new JRadioButton("Add a Shopping Mall");
                //rb3=new JRadioButton()
                bgroup= new ButtonGroup();
                bgroup.add(rb1);
                bgroup.add(rb2);
                rb1.addItemListener(new ButtonListener());
                rb2.addItemListener(new ButtonListener());
                panelRbutton= new JPanel();
                panelRbutton.add(rb1);
                panelRbutton.add(rb2);
                this.add(panelRbutton);
                this.setSize(250, 300);
                this.setBackground(Color.LIGHT_GRAY);
                this.setVisible(true);
                repaint();
            }
            public class ButtonListener implements ItemListener{
                public void itemStateChanged(ItemEvent e){
                    if(e.getSource()==rb1){
                        System.out.println("School");
                        build_index=1;
                        build.setBIndex(build_index);
                        repaint();
                        System.out.println("Index here is:"+build.getBIndex());



                    }
                    if(e.getSource()==rb2){
                        System.out.println("Building");
                        build_index=2;
                        build.setBIndex(build_index);
                        repaint();
                        System.out.println("Index here is:"+build.getBIndex());



                }
            }
            // commented out main() method to avoid confusion:
            /*
            public static void Main(String [] args){
                BuildingOptions frame1= new BuildingOptions(build);
                frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame1.setVisible(true);
            }*/ 

            }
        }


        //class3

        import javax.swing.*;

        //import Buildings.MouseDrag;



        import java.awt.*;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.awt.event.MouseAdapter;
        import java.awt.event.MouseEvent;



        public class MainDrawing extends JPanel
        {
            int id=2;
            int index;
            int height, width, x,y;
            // this creates Object1-A, 'b'
            Buildings b= new Buildings();
            boolean buildingS=false;
            JButton b1;
            BuildingOptions bOpt;
            MouseDrag mouseDrag;
            public MainDrawing()
            {
                index=index;
                this.setBackground(Color.white);
                this.setSize(300,150);
                //mouseDrag = new MouseDrag();
               // addMouseListener(mouseDrag);
                //addMouseMotionListener(mouseDrag);
                // b.setBIndex(index);
                b1=new JButton("Add Buildings");
                b1.setSize(25, 50);
                b1.addActionListener(new ButtonListener());
                add(b1);
                  mouseDrag = new MouseDrag();
                  addMouseListener(mouseDrag);
                  addMouseMotionListener(mouseDrag);    

                }


                private final class MouseDrag extends MouseAdapter {
                    private boolean dragging = false;
                    private Point last;

                    @Override
                    public void mousePressed(MouseEvent m) {
                        last = m.getPoint();
                       // dragging = isInsideEllipse(last);
                        if (!dragging) {
                            x = last.x;
                            y = last.y;
                            width = 0;
                            height = 0;
                        }
                     //   repaint();
                    }

                    @Override
                    public void mouseReleased(MouseEvent m) {
                        //last = null;
                        dragging = true;
                       repaint();
                    }

                    @Override
                    public void mouseDragged(MouseEvent m) {
                        int dx = m.getX() - last.x;
                        int dy = m.getY() - last.y;
                        if (dragging) {
                            x += dx;
                            y += dy;
                        } else {
                            width += dx;
                            height += dy;
                        }
                        last = m.getPoint();
                        repaint();
                    }
                }


            public void paint(Graphics g){
                super.paint(g);
                Graphics2D g2d=(Graphics2D)g;
                System.out.println("Index is:"+b.getBIndex());
                if(b.getBIndex()==1)

                    b.PaintSchool(g2d, x, y);
                if(b.getBIndex()==2)

                    b.PaintBuilding(g2d, x, y);
            }

            public class ButtonListener implements ActionListener{
                public void actionPerformed(ActionEvent e) {
                    if(e.getSource()==b1)
                        // this creates Object2, passing a reference to Object1-A
                        bOpt= new BuildingOptions( b );
                    bOpt.setVisible(true);
                    bOpt.setSize(250, 250);
                    System.out.println("Index in button listener in class buttonListener:"+b.getBIndex());
                    repaint();
                    /*index=1;
        // buildingS=true;
        b.setBIndex(index);
        repaint();
        System.out.println("Index:"+b.getBIndex());*/
                }
            }


            public static void main(String args[]){
                MainDrawing md= new MainDrawing();
                JFrame f=new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //f.setBackground(Color.yellow);
                f.setContentPane(md);
                f.setVisible(true);
                f.setSize(350,350);
                f.setVisible(true);
            }
        }

i am not able to draw more than 1 image on the frame.

Are you really trying to draw more than one image? Look at lines 264-269: if b.getBIndex() return 1 you draw one of the images, and if it returns 2 you draw the other image. In order to draw both images you would need b.getBIndex() to return both 1 and 2, but you must know that's not going to happen.

I notice in BuildingOptions.ButtonListener on lines 143 and 153, after you call setBIndex to change the drawing you call repaint, but this is the repaint of the BuildingOptions which is an entirely different frame from from the frame that has the drawing. Surely you mean to repaint the drawing.

In fact i used setBindex to 1 to call the first function PaintSchool, and i setBindex to 2 to call the second Function. So when i click on 'add school' it should draw an image in PaintSchool and afterwards when i click on the radio button 'Add a building', it should draw image in PaintBuilding.

But what is happening is that the two images dont appear simulatenously on the screen, they are overriding each other. How can i use a buffered image here?

Edited 3 Years Ago by Shania_01

This article has been dead for over six months. Start a new discussion instead.