не удается установить цвет фона панели

1

В моем назначении Graphics я не могу установить фоновый цвет панели. Если я поместил ColorPanel в другую панель, цвет фона панели изменится, однако круг не перемещается, если я изменю размер панели. В моем задании требуется, чтобы, если я изменяю размер рамки, круг должен быть в центре кадра

    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);
       }
       }
      }
Теги:
colors
swing
jpanel
paintcomponent

2 ответа

1
Лучший ответ

Не забудьте вызвать super.paintComponent(g) в вашем переопределении метода paintComponent. Сделайте это на первой линии.

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

Это скажет JPanel сделать свою собственную живопись.

Кроме того, если вы хотите сгладить границу своего круга, установите подсказки для рендеринга графики для сглаживания:

     // do this:
     Graphics2D g2 = (Graphics2D) g;
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

     // before calling this:
     g.fillOval(x, y, diameter, diameter);

Обратите внимание, что ваш круг, кажется, очень хорошо центрируется, когда я запускаю ваш код.

  • 0
    Большое спасибо. Я добавил super.paintComponent (g); в рамках метода paintComponent, и это сработало
0

Вы хотите установить панель в центре кадра? Вы можете сделать это с помощью panel.setLocationRelativeTo(frame); (конечно, у вас должен быть экземпляр фрейма на вашем классе панели)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню