2013-04-03 3 views
2

Я показываю изображение в JLabel. Я хочу показать это изображение в круговой форме, то есть я хочу, чтобы форма JLabel была кругом, который по умолчанию является Rectangle. Как установить форму JPanel или JLabel? setUndecorated() и setShape() определяется только для Frame ?? Есть ли возможность изменить форму других компонентов, таких как JPanel и JLabel?Как настроить форму JPanel или JLabel?

ответ

3

компонент всегда прямоугольная, однако, вы можете использовать пользовательские покраску и прозрачность, чтобы сделать компонент появится непрямоугольная

Взгляните на Perfoming Custom Painting и 2D Graphics

Изменено с примером

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.geom.Path2D; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FunkyShapedComponent { 

    public static void main(String[] args) { 
     new FunkyShapedComponent(); 
    } 

    public FunkyShapedComponent() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JPanel testPane = new JPanel(); 
       testPane.setBackground(Color.RED); 
       testPane.setLayout(new GridBagLayout()); 
       testPane.add(new FunkyPane()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(testPane); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class FunkyPane extends JPanel { 

     public FunkyPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("This is a simple test")); 
      setOpaque(false); 
     } 

     @Override 
     public Insets getInsets() { 
      return new Insets(10, 10, 10, 10); 
     } 

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

      int width = getWidth() - 1; 
      int height = getHeight() - 1; 

      int radius = Math.min(width, height)/10; 

      Path2D p = new Path2D.Float(); 
      p.moveTo(0, radius/2); 
      p.curveTo(0, 0, 0, 0, radius/2, 0); 
      p.curveTo(width/4, radius, width/4, radius, (width/2) - radius, radius/2); 
      p.curveTo(width/2, 0, width/2, 0, (width/2) + radius, radius/2); 
      p.curveTo(width - (width/4), radius, width - (width/4), radius, width - (radius/2), 0); 
      p.curveTo(width, 0, width, 0, width, radius/2); 

      p.curveTo(width - radius, height/4, width - radius, height/4, width - (radius/2), (height/2) - radius); 
      p.curveTo(width, height/2, width, height/2, width - (radius/2), (height/2) + radius); 
      p.curveTo(width - radius, height - (height/4), width - radius, height - (height/4), width, height - (radius/2)); 
      p.curveTo(width, height, width, height, width - (radius/2), height); 

      p.curveTo(width - (width/4), height - radius, width - (width/4), height - radius, (width/2) + radius, height - (radius/2)); 
      p.curveTo(width/2, height, width/2, height, (width/2) - radius, height - (radius/2)); 
      p.curveTo((width/4), height - radius, (width/4), height - radius, (radius/2), height); 
      p.curveTo(0, height, 0, height, 0, height - (radius/2)); 

      p.curveTo(radius, height - (height/4), radius, height - (height/4), (radius/2), (height/2) + radius); 
      p.curveTo(0, height/2, 0, height/2, (radius/2), (height/2) - radius); 
      p.curveTo(radius, (height/4), radius, (height/4), 0, (radius/2)); 

      p.closePath(); 

      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
      g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
      g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
      g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
      g2d.setColor(getBackground()); 
      g2d.fill(p); 
      g2d.dispose(); 

     } 
    } 
} 
+0

Может ли указать, как отображать прямоугольную JPanel в круговой форме? –

+0

['Graphics # drawOval'] (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawOval%28int,%20int,%20int,%20int%29) – MadProgrammer

+0

Как бы вы построили это для JLabel, потому что в настоящее время ваши классы расширяют JPanel, а затем меняют метку. Что делать, если вы хотите, чтобы это было только для сокета JLabel, который вы могли бы создать, и экземпляр его в любой форме, которую вы создаете, и затем соответствующим образом установите его свойства. – 2014-05-05 18:29:01

0

Я думаю, что вы хотите показать прозрачные области. Вам не нужно устанавливать форму, например, вы можете использовать:

setOpaque(false); 

Для компонентов имеет границу, вы можете скрыть его:

setBorder(null); 

Для кнопки можно использовать

setBorderPainted(false); 
setContentAreaFilled(false); 
+0

могли бы рассказать мне, как отображать прямоугольный JPanel в круговой форме? –

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