2015-04-01 8 views
1

В моем назначении графики я не могу установить цвет фона панели. Если я поместил 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); 
     } 
     } 
     } 

ответ

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, и это сработало – Minal

0

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

Смежные вопросы