无法设置面板的背景颜色

时间:2015-04-01 15:20:19

标签: java swing colors jpanel paintcomponent

在我的图形分配中,我无法设置面板的背景颜色。如果我将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);
       }
       }
      }

2 个答案:

答案 0 :(得分: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);

请注意,当我运行您的代码时,您的圈子似乎很适合自己。

答案 1 :(得分:0)

您想将面板设置在框架的中央吗?你可以用panel.setLocationRelativeTo(frame)做到这一点; (当然你应该在你的小组类中有一个框架的实例)