Search code examples
javaswingcolorsjpanelpaintcomponent

not able to set Background color of the panel


In my Assignment of Graphics, I am not able to set a Background color of the panel. If I put the ColorPanel into another panel, the color of the panel background changes, however circle doesn't move if I change the size of the panel. In my Assignment it is required that if I change the size of the frame, the circle should be at the center of the frame

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

    public class ColorMenuFrame extends JFrame {
      private JMenu colorMenu = new JMenu("Colors");
      private ColorPanel p = new ColorPanel();

      public ColorMenuFrame(){
        p.setPreferredSize( new Dimension( 100, 100 ) );
        this.add(p);
      }

      // Main Method
      public static void main(String[] args) {
        ColorMenuFrame frame = new ColorMenuFrame();
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }

      //ColoRpanel class

      public class ColorPanel extends JPanel {
        private int diameter;

        public ColorPanel() {

      // Creating Colors JMEnuBar
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu colorMenu = new JMenu("Colors");
        menuBar.add(colorMenu);

      // Creating Background and Foreground menus
       JMenu backGroundMenu = new JMenu("BackGround");
       JMenu foreGroundMenu = new JMenu("ForeGround");

      // Items inside the Background and Foreground menus
       JMenuItem redItem = new JMenuItem("Red");
       JMenuItem greenItem = new JMenuItem("Green");
       JMenuItem blueItem = new JMenuItem("Blue");

       JMenuItem redItem1 = new JMenuItem("Red");
       JMenuItem greenItem1 = new JMenuItem("Green");
       JMenuItem blueItem1 = new JMenuItem("Blue");

       // Adding Red, Green and Blue Items to backGround menu     
       backGroundMenu.add(redItem);
       backGroundMenu.add(greenItem);
       backGroundMenu.add(blueItem);

      // Adding Red, Green and Blue Items to ForeGround menu  
       foreGroundMenu.add(redItem1);
       foreGroundMenu.add(greenItem1);
       foreGroundMenu.add(blueItem1);

      // Adding backGround and foreground sub menus to main Menu Bar Colors  
       colorMenu.add(backGroundMenu);
       colorMenu.add(foreGroundMenu);

      //Calling ActionListeners

      // Calling ActionListner after clicking on Red button

        redItem.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setBackground(Color.RED);
            repaint();
        }
       });

      // Calling ActionListner after clicking on Green button
       greenItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           setBackground(Color.GREEN);
          repaint();
         }
       });

        // Calling ActionListner after clicking on blue button

       blueItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           setBackground(Color.BLUE);
           repaint();
         }
       });

        // Calling ActionListner after clicking on Red button
       redItem1.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           setForeground(Color.RED);
           repaint();
        }
      });

       // Calling ActionListner after clicking on Green button
      greenItem1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
         setForeground(Color.GREEN);
         repaint();
        }
      });

        // Calling ActionListner after clicking on Green button
      blueItem1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          setForeground(Color.BLUE);
         repaint();
       }
      });

     }
     //Paint Component Method, to create circle at the center of panel    
     protected void paintComponent(Graphics g){
       int width = getSize().width;
       int height =getSize().height;

       if (width <= height){
         diameter = width / 2;
       }
       else if (height <= width){
         diameter = height / 2;
       }
        int r = diameter / 2;
        int x = (width / 2) - r;
        int y = (height / 2)- r;

       //Drawing Circle
       g.fillOval(x, y, diameter, diameter);
       }
       }
      }

Solution

  • Don't forget to call super.paintComponent(g) within your paintComponent method override. Do it on the first line.

      @Override
      protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         // ....
    

    This will tell the JPanel to do its own housekeeping painting.

    Also, if you want to smooth out the border of your Circle, set the graphics rendering hints to do antialiasing:

         // do this:
         Graphics2D g2 = (Graphics2D) g;
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
         // before calling this:
         g.fillOval(x, y, diameter, diameter);
    

    Note that your circle seems to center itself just fine when I run your code.