Этот совет Java демонстрирует метод рисования основных форм с использованием линий и кривых на компоненты Java. Основными формами может быть сделан разработчиком перезаписи Paint () функцию компонента.


    // x, y, controlpointx, controlpointy,controlpointx1, controlpointy1, 

    // controlpointx2, controlpointy2 may be define by the developer

    GeneralPath shape = new GeneralPath();

    shape.moveTo(x, y);

    shape.lineTo(x, y);

    shape.quadTo(controlPointX, controlPointY, x, y);

    shape.curveTo(controlPointX1, controlPointY1, controlPointX2, 

      controlPointY2, x, y);

    shape.closePath();

Этот совет Java демонстрирует метод рисования различные формы на компоненту с помощью комбинации других формах. Различные формы может быть сделан разработчиком перезаписи Paint () функцию компонента.


    // Create a new shape

    Area shape = new Area(shape1);

    

    // Add shape to shape 2

    shape.add(new Area(shape2));

    

    // Subtract shape with shape 3

    shape.subtract(new Area(shape3));

    shape.intersect(new Area(shape4));

    shape.exclusiveOr(new Area(shape5));

Эта подсказка показывает различные аспекты создания буфера изображений в памяти. Разработчик может сохранять изображения в буфере памяти, а затем отображает его на экране. Буфер изображений не имеет ограничений по формату изображения, оно может храниться в любом формате. Как правило, разработчик может изменять пикселей Buffered в соответствии со своими потребностями.


    int width = 100;

    int height = 100;

    

    // No.1 How to create buffered image 

    // that does not support transparency    

    BufferedImage bufimage = new BufferedImage(width, height, 

      BufferedImage.TYPE_INT_RGB);



    // OR

    // No.2 How to create a buffered image 

    // that supports transparency    

    bufimage = new BufferedImage(width, height, 

      BufferedImage.TYPE_INT_ARGB);



    //No.3 How to create buffered images 

    // that are compatible with the screen

    GraphicsEnvironment environment = 

      GraphicsEnvironment.getLocalGraphicsEnvironment();

    

    GraphicsDevice device = 

      environment.getDefaultScreenDevice();

      

    GraphicsConfiguration config = device.getDefaultConfiguration();

    

    // Create an image that does not support transparency (Opaque)

    bufimage = config.createCompatibleImage(width, height, 

      Transparency.OPAQUE);



    //OR

    // Create an image that supports transparent pixels

    bufimage = config.createCompatibleImage(width, height, 

      Transparency.BITMASK);



    //OR

    // Create an image that supports arbitrary 

    // levels of transparency (Translucent)

    bufimage = config.createCompatibleImage(width, height, 

      Transparency.TRANSLUCENT);



    // No.4 How to create a buffered image from 

    // a graphics context which is screen compatible



    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D)g;

        int width = 100;

        int height = 100;

    

        // Create an image that does not support 

        // transparency (Opaque)

        BufferedImage bimage = 

          g2d.getDeviceConfiguration().createCompatibleImage(

            width, height, Transparency.OPAQUE);

    

        //OR

        // Create an image that supports transparent pixels

        bimage = g2d.getDeviceConfiguration().createCompatibleImage(

            width, height, Transparency.BITMASK);

    

        //OR

        // Create an image that supports 

        // arbitrary levels of transparency

        bimage = g2d.getDeviceConfiguration().createCompatibleImage(

            width, height, Transparency.TRANSLUCENT);

    }



    // No.5 How to create a buffered image using 

    // Component.createImage(). Further, this is useful 

    // for the developer only if the component is visible 

    // on the screen. Moreover, this method returns 

    // buffered images that do not support transparent pixels.



    BufferedImage bimage = 

  (BufferedImage)component.createImage(width, height);

    if (bimage == null) {

        // The component is not visible on the screen

    }

Этот совет Java демонстрирует метод применения различных преобразований Buffered изображения. Примерами преобразования могут включать масштабирование, стрижки, перевод и вращающиеся.


    AffineTransform transform = new AffineTransform();

    transform.scale(scalex, scaley);

    transform.shear(shiftx, shifty);

    transform.translate(x, y);

    transform.rotate(radians, bufferedImage.getWidth()/2

      bufferedImage.getHeight()/2);

    

    AffineTransformOp op = new AffineTransformOp(transform, 

      AffineTransformOp.TYPE_BILINEAR);

    bufferedImage = op.filter(bufferedImage, null);



java.awt.geom



import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Shape;

import java.awt.Stroke;

import java.awt.geom.AffineTransform;

import java.awt.geom.GeneralPath;

import java.awt.geom.Rectangle2D;



import javax.swing.JComponent;

import javax.swing.JFrame;



public class TransformersRotationTranslation extends JComponent {

  Shape axes, shape;



  int length = 54, arrowLength = 4, tickSize = 4;



  public TransformersRotationTranslation() {

    axes = createAxes();

    shape = createShape();

  }



  protected Shape createAxes() {

    GeneralPath path = new GeneralPath();



    // Axes.

    path.moveTo(-length, 0);

    path.lineTo(length, 0);

    path.moveTo(0, -length);

    path.lineTo(0, length);

    // Arrows.

    path.moveTo(length - arrowLength, -arrowLength);

    path.lineTo(length, 0);

    path.lineTo(length - arrowLength, arrowLength);

    path.moveTo(-arrowLength, length - arrowLength);

    path.lineTo(0, length);

    path.lineTo(arrowLength, length - arrowLength);

    // Half-centimeter tick marks

    float cm = 72 2.54f;

    float lengthCentimeter = length / cm;

    for (float i = 0.5f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize / 2);

      path.lineTo(tick, tickSize / 2);

      path.moveTo(-tick, -tickSize / 2);

      path.lineTo(-tick, tickSize / 2);

      path.moveTo(-tickSize / 2, tick);

      path.lineTo(tickSize / 2, tick);

      path.moveTo(-tickSize / 2, -tick);

      path.lineTo(tickSize / 2, -tick);

    }

    // Full-centimeter tick marks

    for (float i = 1.0f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize);

      path.lineTo(tick, tickSize);

      path.moveTo(-tick, -tickSize);

      path.lineTo(-tick, tickSize);

      path.moveTo(-tickSize, tick);

      path.lineTo(tickSize, tick);

      path.moveTo(-tickSize, -tick);

      path.lineTo(tickSize, -tick);

    }

    return path;

  }



  protected Shape createShape() {

    float cm = 72 2.54f;

    return new Rectangle2D.Float(cm, cm, * cm, cm);

  }



  public void paint(Graphics g) {

    Graphics2D g2 = (Graphics2Dg;



    // Use antialiasing.

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

        RenderingHints.VALUE_ANTIALIAS_ON);



    // Move the origin to 75, 75.

    AffineTransform at = AffineTransform.getTranslateInstance(7575);

    g2.transform(at);



    // Draw the shapes in their original locations.

    g2.setPaint(Color.black);

    g2.draw(axes);

    g2.draw(shape);



    // Transform the Graphics2D.

      AffineTransform rat = new AffineTransform();

      rat.setToRotation(Math.PI / 6);

      rat.translate(100100);

    g2.transform(rat);



    // Draw the "new" shapes in dashed.

    Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,

        BasicStroke.JOIN_BEVEL, 0new float[] { 3}0);

    g2.setStroke(stroke);

    g2.draw(axes);

    g2.draw(shape);

  }



  public static void main(String[] a) {

    JFrame f = new JFrame();

    f.getContentPane().add(new TransformersRotationTranslation());

    f.setSize(350450);

    f.show();

  }

}


import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Container;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridLayout;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.geom.AffineTransform;

import java.awt.image.AffineTransformOp;

import java.awt.image.BufferedImage;



import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;



public class AffineTransformApp extends JFrame {

  DisplayPanel displayPanel;



  JComboBox scaleXval, scaleYval, shearXval, shearYval;



  String[] scaleValues = "0.10""0.25""0.50""0.75""1.00""1.25",

      "1.50""1.75""2.00" };



  String[] shearValues = "0.00""0.25""0.50""0.75""1.00" };



  public AffineTransformApp() {

    super();

    Container container = getContentPane();



    displayPanel = new DisplayPanel();

    container.add(displayPanel);



    JPanel panel = new JPanel();

    panel.setLayout(new GridLayout(2455));

    scaleXval = new JComboBox(scaleValues);

    scaleXval.setSelectedItem("1.00");

    scaleXval.addActionListener(new ComboBoxListener());

    scaleYval = new JComboBox(scaleValues);

    scaleYval.setSelectedItem("1.00");

    scaleYval.addActionListener(new ComboBoxListener());



    shearXval = new JComboBox(shearValues);

    shearXval.setSelectedItem("0.00");

    shearXval.addActionListener(new ComboBoxListener());

    shearYval = new JComboBox(shearValues);

    shearYval.setSelectedItem("0.00");

    shearYval.addActionListener(new ComboBoxListener());



    panel.add(new JLabel("Scale X value:"));

    panel.add(scaleXval);

    panel.add(new JLabel("Scale Y value:"));

    panel.add(scaleYval);

    panel.add(new JLabel("Shear X value:"));

    panel.add(shearXval);

    panel.add(new JLabel("Shear Y value:"));

    panel.add(shearYval);



    container.add(BorderLayout.SOUTH, panel);



    addWindowListener(new WindowAdapter() {

      public void windowClosing(WindowEvent e) {

        System.exit(0);

      }

    });

    setSize(displayPanel.getWidth(), displayPanel.getHeight() 10);

    setVisible(true);

  }



  public static void main(String arg[]) {

    new AffineTransformApp();

  }



  class ComboBoxListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {

      JComboBox temp = (JComboBoxe.getSource();



      if (temp == scaleXval) {

        displayPanel.scalex = Double.parseDouble((Stringtemp

            .getSelectedItem());

        displayPanel.applyValue(true, false);

        displayPanel.applyFilter();

        displayPanel.repaint();

      else if (temp == scaleYval) {

        displayPanel.scaley = Double.parseDouble((Stringtemp

            .getSelectedItem());

        displayPanel.applyValue(true, false);

        displayPanel.applyFilter();

        displayPanel.repaint();

      else if (temp == shearXval) {

        displayPanel.shearx = Double.parseDouble((Stringtemp

            .getSelectedItem());

        displayPanel.applyValue(false, true);

        displayPanel.applyFilter();

        displayPanel.repaint();

      else if (temp == shearYval) {

        displayPanel.sheary = Double.parseDouble((Stringtemp

            .getSelectedItem());

        displayPanel.applyValue(false, true);

        displayPanel.applyFilter();

        displayPanel.repaint();

      }

    }

  }

}



class DisplayPanel extends JLabel {

  Image displayImage;



  BufferedImage biSrc, biDest;



  BufferedImage bi;



  Graphics2D big;



  AffineTransform transform;



  double scalex = 1.0;



  double scaley = 1.0;



  double shearx = 1.0;



  double sheary = 1.0;



  DisplayPanel() {

    setBackground(Color.black);

    loadImage();

    setSize(displayImage.getWidth(this), displayImage.getWidth(this))// panel

    createBufferedImages();



    transform = new AffineTransform();

  }



  public void loadImage() {

    displayImage = Toolkit.getDefaultToolkit().getImage(

        "largeJava2sLogo.jpg");

    MediaTracker mt = new MediaTracker(this);

    mt.addImage(displayImage, 1);

    try {

      mt.waitForAll();

    catch (Exception e) {

      System.out.println("Exception while loading.");

    }



    if (displayImage.getWidth(this== -1) {

      System.out.println(" Missing .jpg file");

      System.exit(0);

    }

  }



  public void createBufferedImages() {

    biSrc = new BufferedImage(displayImage.getWidth(this), displayImage

        .getHeight(this), BufferedImage.TYPE_INT_RGB);



    big = biSrc.createGraphics();

    big.drawImage(displayImage, 00this);



    bi = biSrc;



    biDest = new BufferedImage(displayImage.getWidth(this), displayImage

        .getHeight(this), BufferedImage.TYPE_INT_RGB);

  }



  public void applyValue(boolean scale, boolean shear) {

    if (scale) {

      transform.setToScale(scalex, scaley);

      scale = false;

    else if (shear) {

      transform.setToShear(shearx, sheary);

      shear = false;

    }

  }



  public void applyFilter() {

    AffineTransformOp op = new AffineTransformOp(transform, null);

    Graphics2D biDestG2D = biDest.createGraphics();

    biDestG2D

        .clearRect(00, biDest.getWidth(this), biDest.getHeight(this));

    op.filter(biSrc, biDest);

    bi = biDest;

  }



  public void reset() {

    big.setColor(Color.black);

    big.clearRect(00, bi.getWidth(this), bi.getHeight(this));

    big.drawImage(displayImage, 00this);

  }



  public void update(Graphics g) {

    g.clearRect(00, getWidth(), getHeight());

    paintComponent(g);

  }



  public void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2D = (Graphics2Dg;

    g2D.drawImage(bi, 00this);

  }

}



java.awt.geom



import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Shape;

import java.awt.Stroke;

import java.awt.geom.AffineTransform;

import java.awt.geom.GeneralPath;

import java.awt.geom.Rectangle2D;



import javax.swing.JComponent;

import javax.swing.JFrame;



public class TransformersRotation extends JComponent {

  Shape axes, shape;



  int length = 54, arrowLength = 4, tickSize = 4;



  public TransformersRotation() {

    axes = createAxes();

    shape = createShape();

  }



  protected Shape createAxes() {

    GeneralPath path = new GeneralPath();



    // Axes.

    path.moveTo(-length, 0);

    path.lineTo(length, 0);

    path.moveTo(0, -length);

    path.lineTo(0, length);

    // Arrows.

    path.moveTo(length - arrowLength, -arrowLength);

    path.lineTo(length, 0);

    path.lineTo(length - arrowLength, arrowLength);

    path.moveTo(-arrowLength, length - arrowLength);

    path.lineTo(0, length);

    path.lineTo(arrowLength, length - arrowLength);

    // Half-centimeter tick marks

    float cm = 72 2.54f;

    float lengthCentimeter = length / cm;

    for (float i = 0.5f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize / 2);

      path.lineTo(tick, tickSize / 2);

      path.moveTo(-tick, -tickSize / 2);

      path.lineTo(-tick, tickSize / 2);

      path.moveTo(-tickSize / 2, tick);

      path.lineTo(tickSize / 2, tick);

      path.moveTo(-tickSize / 2, -tick);

      path.lineTo(tickSize / 2, -tick);

    }

    // Full-centimeter tick marks

    for (float i = 1.0f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize);

      path.lineTo(tick, tickSize);

      path.moveTo(-tick, -tickSize);

      path.lineTo(-tick, tickSize);

      path.moveTo(-tickSize, tick);

      path.lineTo(tickSize, tick);

      path.moveTo(-tickSize, -tick);

      path.lineTo(tickSize, -tick);

    }

    return path;

  }



  protected Shape createShape() {

    float cm = 72 2.54f;

    return new Rectangle2D.Float(cm, cm, * cm, cm);

  }



  public void paint(Graphics g) {

    Graphics2D g2 = (Graphics2Dg;



    // Use antialiasing.

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

        RenderingHints.VALUE_ANTIALIAS_ON);



    // Move the origin to 75, 75.

    AffineTransform at = AffineTransform.getTranslateInstance(7575);

    g2.transform(at);



    // Draw the shapes in their original locations.

    g2.setPaint(Color.black);

    g2.draw(axes);

    g2.draw(shape);



    // Transform the Graphics2D.

    g2.transform(AffineTransform.getRotateInstance(-Math.PI / 6));



    // Draw the "new" shapes in dashed.

    Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,

        BasicStroke.JOIN_BEVEL, 0new float[] { 3}0);

    g2.setStroke(stroke);

    g2.draw(axes);

    g2.draw(shape);

  }



  public static void main(String[] a) {

    JFrame f = new JFrame();

    f.getContentPane().add(new TransformersRotation());

    f.setSize(350200);

    f.show();

  }

}

Этот совет Java демонстрирует метод рисования фигур на основных компонентов Java. Основные формы может быть сделан разработчиком перезаписи Paint () функцию компонента.

Этот пример рисует линию, дугу, овальные, прямоугольник, скругленный прямоугольник используемого компонента.


    Shape line = new Line2D.Float(x1, y1, x2, y2);

    Shape arc = new Arc2D.Float(x, y, w, h, start, extent, type);    

    Shape oval = new Ellipse2D.Float(x, y, w, h);    

    Shape rectangle = new Rectangle2D.Float(x, y, w, h);

    

    Shape roundRectangle = new RoundRectangle2D.Float(

      x, y, w, h, arcWidth, arcHeight);



java.awt.geom



import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Shape;

import java.awt.Stroke;

import java.awt.geom.AffineTransform;

import java.awt.geom.GeneralPath;

import java.awt.geom.Rectangle2D;



import javax.swing.JComponent;

import javax.swing.JFrame;



public class TransformShear extends JComponent {

  Shape axes, shape;



  int length = 54, arrowLength = 4, tickSize = 4;



  public TransformShear() {

    axes = createAxes();

    shape = createShape();

  }



  protected Shape createAxes() {

    GeneralPath path = new GeneralPath();



    // Axes.

    path.moveTo(-length, 0);

    path.lineTo(length, 0);

    path.moveTo(0, -length);

    path.lineTo(0, length);

    // Arrows.

    path.moveTo(length - arrowLength, -arrowLength);

    path.lineTo(length, 0);

    path.lineTo(length - arrowLength, arrowLength);

    path.moveTo(-arrowLength, length - arrowLength);

    path.lineTo(0, length);

    path.lineTo(arrowLength, length - arrowLength);

    // Half-centimeter tick marks

    float cm = 72 2.54f;

    float lengthCentimeter = length / cm;

    for (float i = 0.5f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize / 2);

      path.lineTo(tick, tickSize / 2);

      path.moveTo(-tick, -tickSize / 2);

      path.lineTo(-tick, tickSize / 2);

      path.moveTo(-tickSize / 2, tick);

      path.lineTo(tickSize / 2, tick);

      path.moveTo(-tickSize / 2, -tick);

      path.lineTo(tickSize / 2, -tick);

    }

    // Full-centimeter tick marks

    for (float i = 1.0f; i < lengthCentimeter; i += 1.0f) {

      float tick = i * cm;

      path.moveTo(tick, -tickSize);

      path.lineTo(tick, tickSize);

      path.moveTo(-tick, -tickSize);

      path.lineTo(-tick, tickSize);

      path.moveTo(-tickSize, tick);

      path.lineTo(tickSize, tick);

      path.moveTo(-tickSize, -tick);

      path.lineTo(tickSize, -tick);

    }

    return path;

  }



  protected Shape createShape() {

    float cm = 72 2.54f;

    return new Rectangle2D.Float(cm, cm, * cm, cm);

  }



  public void paint(Graphics g) {

    Graphics2D g2 = (Graphics2Dg;



    // Use antialiasing.

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

        RenderingHints.VALUE_ANTIALIAS_ON);



    // Move the origin to 75, 75.

    AffineTransform at = AffineTransform.getTranslateInstance(7575);

    g2.transform(at);



    // Draw the shapes in their original locations.

    g2.setPaint(Color.black);

    g2.draw(axes);

    g2.draw(shape);



    // Transform the Graphics2D.

      AffineTransform sat = AffineTransform.getTranslateInstance(1500);

      sat.shear(-.50);

      g2.transform(sat);



    // Draw the "new" shapes in dashed.

      g2.transform(AffineTransform.getTranslateInstance(7575));

    Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,

        BasicStroke.JOIN_BEVEL, 0new float[] { 3}0);

    g2.setStroke(stroke);

    g2.draw(axes);

    g2.draw(shape);

  }



  public static void main(String[] a) {

    JFrame f = new JFrame();

    f.getContentPane().add(new TransformShear());

    f.setSize(450350);

    f.show();

  }

}

Этот совет Java демонстрирует, как получить и установить пикселов в буферном изображения. Пикселов может быть восстановлена с помощью getRGB () функцию. Кроме того, для установления setRGB пикселей () функция может быть использована.


    // Firstly get a pixel (x.y may be defined by the developer)

    int rgb = bufferedImage.getRGB(x, y);

    

    // Developer may get all the pixels

    int w = bufferedImage.getWidth(null);

    int h = bufferedImage.getHeight(null);

    int[] rgbs = new int[w*h];

    bufferedImage.getRGB(00, w, h, rgbs, 0, w);

    

    // Secondly set a pixel

    rgb = 0xFF00FF00// green

    bufferedImage.setRGB(x, y, rgb);