Bevezetés a Java 2D grafikájába

A Java támogatja a 2D alkalmazásprogramozási felületet, amely lehetővé teszi 2D grafika kiváló minőségű készítését. A Java 2D API olyan osztályokból áll, amelyek előre definiált Java funkciókat vagy módszereket tartalmaznak, és amelyek lehetővé teszik a programozó számára a geometriai átalakítás, a képfeldolgozás, az alfa-összeállítás és sok más fejlett grafikai tervezés végrehajtását.

A Java 2D API a Java 2 platform része. Az alábbiakban felsoroljuk azokat a csomagokat, amelyekből a 2D API áll:

  • awt
  • awt.image
  • awt.color
  • awt.font
  • awt.geom
  • awt.print
  • awt.image.renderable

A Java 2D API kiterjeszti az Abstract Windowing Toolkit (AWT) abszolút grafikus és képalkotó képességeit. A csomag egy teljes funkcionalitású keretet tartalmaz a gazdag felhasználói felület, rajzprogramok és képek szerkesztõinek fejlesztésére.

A Java 2D API-val támogatást kap az alábbi szolgáltatásokhoz:

  • Ez lehetővé teszi az összetett dokumentumok kinyomtatását.
  • Színkezelést biztosít továbbfejlesztett színkészlettel.
  • A csomag geometriai minták széles választékát kínálja, például görbék, négyzetek, háromszögek és téglalapok
  • A csomag lehetővé teszi bármilyen forma megjelenítését nagyon intuitív módon.
  • Az azonos minőség fenntartása érdekében a tervezési folyamat során, ha szükséges, megjelennek a megjelenítési tippek

Mostanáig nagyon magas szinten vitatkoztunk arról, hogy mi a 2D API, és mit lehet elérni ezzel az API-val. Most, hogy megvan valamilyen lényege, menjünk mélyen ebbe a szakaszba. Az egyik legfontosabb rész, hogy a Java 2D Renderelés során mindig nem kell primitív geometriai mintázatokkal foglalkoznia, hanem geometriai alakját kell megterveznie. Tehát lássuk, hogyan működik a megjelenítés a 2D API-ban.

Java 2D renderelés

A Java 2D API támogatja az egységes megjelenítési modellt az összes különféle eszköz esetében, legyen az monitor vagy nyomtató. A program fejlesztése során a renderelés ugyanúgy működik, függetlenül a végösszetevőtől, legyen az nyomtató vagy monitor. A csomag automatikusan felismeri és megváltoztatja a grafikus kontextust a végösszetevő alapján. A Java 2D API a java.awt.Graphics2D-ből áll, amely kiterjeszti a Grafika osztályt a továbbfejlesztett grafika és megjelenítési szolgáltatások támogatására.

Az alábbiakban bemutatjuk azokat a szolgáltatásokat, amelyeket a csomag biztosít:

  • Támogatja a primitív geometriai alakzatok és alakzatok megjelenítését.
  • Lehetőség van bármilyen forma belsejének kitöltésére bármilyen színtel vagy mintával, amelyet a festék tulajdonságai tartalmaznak, vonásokkal.
  • Ez lehetővé teszi a megadott kép megjelenítését.
  • Ez lehetővé teszi a szöveges karakterláncok átalakítását karakterjelekké, amelyek kitölthetők a festék attribútumaiban megadott színekkel.

1. példa

Vessünk egy pillantást ugyanazon Java programra, és nézzük meg, hogyan működik.

Kód:

import javax.swing.JFrame;
import java.awt.*; // AWT package is responsible for creating GUI
import javax.swing.*; // Java swing package is responsible to provide UI components
// AWT class extents Jframe which is part of Swing package
public class AWTGraphicsSampleProgram extends JFrame (
/**
*
*/
// Defining all the static variables
private static final long serialVersionUID = 1L;
public static final int SAMPLE_CANVAS_WIDTH = 500;
public static final int SAMPLE_CANVAS_HEIGHT = 500;
// The program enters from the main method
public static void main(String() args) (
SwingUtilities.invokeLater(new Runnable() (
@Override
public void run() (
new AWTGraphicsSampleProgram(); // this run method will create a new object and thus invoke the constructor method.
)
));
)
//Here we are creating an instance of the drawing canvas inner class called DrawCanwas
private DrawCanvas sampleCanvas;
public AWTGraphicsSampleProgram() (
sampleCanvas = new DrawCanvas();
sampleCanvas.setPreferredSize(new Dimension(SAMPLE_CANVAS_WIDTH, SAMPLE_CANVAS_HEIGHT));
Container containerPane = getContentPane();
containerPane.add(sampleCanvas);
setDefaultCloseOperation(EXIT_ON_CLOSE); // setting up the default close mechanism
pack();
setTitle("……"); // set the desired title of the JFrame
setVisible(true); // setVisible method will be set the visibility of the Jframe to true
)
/**
* here drawCanvas is the inner class of the Jpanel which is used for custom drawing
*/
private class DrawCanvas extends JPanel (
/**
*
*/
private static final long serialVersionUID = 1L;
// Overriding paintComponent will let you to design your own painting
@Override
public void paintComponent(Graphics graphics) (
super.paintComponent(graphics);
setBackground(Color.BLACK); // setting the background color to black
graphics.setColor(Color.GREEN); // setting up the color to green
graphics.drawLine(30, 40, 100, 200);
graphics.drawOval(150, 180, 10, 10);
graphics.drawRect(200, 210, 20, 30);
graphics.setColor(Color.magenta);
graphics.fillOval(300, 310, 30, 50);
graphics.fillRect(400, 350, 60, 50);
graphics.setColor(Color.WHITE);
graphics.setFont(new Font("Monospaced", Font.PLAIN, 12)); // setting up the font style and font size
graphics.drawString("Java Graphics in 2D …", 10, 20);
)
)
)

Kimenet:

A grafika osztály különféle módszereket kínál különféle grafikai objektumok rajzolására. A leggyakoribb módszerek a drawString (), drawImage () és fillXxx (). Ezek a módszerek nagyjából két kategóriába sorolhatók. Az első típusú grafikus módszer: rajzol és kitölti olyan funkciókat, amelyek lehetővé teszik a felhasználók számára, hogy az alapvető alakzatokat, szöveget és képeket megjelenítsék. A másik módszer az attribútumbeállításokra vonatkozik, amelyek lehetővé teszik, hogy megváltoztassa a rajz megjelenésének hatását a konzolon. Az olyan módszerek, mint a setColor és a setFont lehetővé teszik, hogy döntsön a rajzolás és a kitöltés módjáról. A grafikus környezet felelős az állapot vagy attribútumok, például a jelenlegi festési szín, az aktuális betűkészlet fenntartásáért.

2. példa

Lásd még egy példát arra, hogy mit lehet még elérni a Java 2D osztályokkal.

Kód:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
public class GeometricShapes extends JFrame
(
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings("deprecation")
public GeometricShapes()
(
super( "Geometric shapes" );
setSize( 425, 160 );
show();
)
public static void main( String args() )
(
GeometricShapes figure = new GeometricShapes();
figure.addWindowListener( new WindowAdapter()
(
public void windowclosing( WindowEvent e )
(
System.exit( 0 );
)
));
)
public void paint( Graphics graphics )
(
// Instantiating Graphics 2D class
Graphics2D graphics2D = ( Graphics2D ) graphics;
graphics2D.setPaint( new GradientPaint( 16, 30,
Color.red,
45, 105,
Color.green,
true ) );
graphics2D.fill( new Ellipse2D.Double( 6, 31, 61, 105 ) );
graphics2D.setPaint( Color.black );
graphics2D.setStroke(new BasicStroke( 9.0f ) );
graphics2D.draw( new Rectangle2D.Double( 82, 32, 67, 102 ) );
// This will create a black colored rounded rectangle
BufferedImage bufferedImage = new BufferedImage( 10, 10, BufferedImage.TYPE_INT_RGB );
Graphics2D design = bufferedImage.createGraphics();
design.setColor( Color.blue );
design.fillRect( 0, 0, 9, 9 );
design.setColor( Color.orange );
design.drawRect( 2, 2, 7, 7 );
design.setColor( Color.black );
design.fillRect( 2, 2, 4, 4 );
design.setColor( Color.pink );
design.fillRect( 5, 5, 2, 2 );
graphics2D.setPaint( new TexturePaint( bufferedImage, new Rectangle( 9, 9 ) ) );
graphics2D.fill( new RoundRectangle2D.Double( 156, 31, 76, 101, 51, 51 ) );
graphics2D.setPaint( Color.CYAN );
graphics2D.setStroke(new BasicStroke( 7.0f ) );
graphics2D.draw( new Arc2D.Double( 240, 30, 75, 100, 0, 270, Arc2D.PIE ) );
// this will create line in red and black color
graphics2D.setPaint( Color.red );
graphics2D.draw( new Line2D.Double( 400, 40, 350, 180 ) );
float dashesArray() = ( 20 );
graphics2D.setPaint( Color.black );
graphics2D.setStroke( new BasicStroke( 4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 10, dashesArray, 0 ) );
graphics2D.draw( new Line2D.Double( 320, 30, 395, 150 ) );
)
)

Kimenet:

3. példa

Alkalmazzuk a 2D java-t a következő programban.

Kód:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
public class GeometricShapes2 extends JFrame
(
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main( String args() )
(
GeometricShapes2 design = new GeometricShapes2();
design.addWindowListener(new WindowAdapter()
(
));
)
@SuppressWarnings("deprecation")
public GeometricShapes2()
(
super( "A circle made up of stars by joining them at certain position filled with random colors" );
setBackground( Color. green );
setSize( 450, 450 );
show();
)
public void paint( Graphics graphics )
(
int xCoordinates() = ( 57, 69, 111, 75, 85, 57, 29, 39, 3, 45 );
int yCoordinates() = ( 2, 38, 38, 56, 98, 74, 98, 56, 38, 38 );
Graphics2D graphics2D = ( Graphics2D ) graphics;
GeneralPath starFigure = new GeneralPath();
starFigure.moveTo( xCoordinates( 0 ), yCoordinates( 0 ) );
for ( int j = 1; j < xCoordinates.length; j++ )
starFigure.lineTo( xCoordinates( j ), yCoordinates( j ) );
starFigure.closePath();
graphics2D.translate( 200, 200 );
for ( int i = 1; i <= 10; i++ )
(
graphics2D.rotate( Math. PI / 9.0 );
graphics2D.setColor(new Color( ( int ) ( Math. random () * 128 ), ( int ) ( Math. random () * 128 ),
( int ) ( Math. random () * 128 ) ) );
graphics2D.fill( starFigure );
)
)
)

Kimenet:

4. példa

Színkódolás alkalmazása a következő programban.

Kód:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class GeometricShapes3 extends Canvas (
/**
*
*/
private static final long serialVersionUID = 1L;
Frame windowFrame;
TextField sampleText;
Font sampleFont;
Color colorOfText;
Color colorOfCircle;
public static void main(String args()) (
GeometricShapes3 start;
start = new GeometricShapes3();
)
public GeometricShapes3() (
this("Arial", Font.BOLD, 18, Color.gray, Color.red);
)
public GeometricShapes3(String ff, int fs, int fz, Color bg, Color fg) (
setBackground(bg);
colorOfCircle = Color.green.brighter();
colorOfText = fg;
sampleFont = new Font(ff, fs, fz);
sampleText = new TextField("eduCBA (Corporate Bridge Consultancy Pvt Ltd) ");
windowFrame = new Frame("Demo");
windowFrame.add(sampleText, BorderLayout.NORTH);
windowFrame.add(this, BorderLayout.CENTER);
windowFrame.setSize(new Dimension(300, 340));
windowFrame.setLocation(150, 140);
windowFrame.addWindowListener(new WindowAdapter() (
public void windowClosing(WindowEvent we) (
System.exit(0);
)
));
sampleText.addActionListener(new ActionListener() (
public void actionPerformed(ActionEvent ae) (
repaint();
)
));
windowFrame.setVisible(true);
)
public void paint(Graphics graphics) (
String sampleTxt = sampleText.getText();
if (sampleTxt.length() == 0) return;
if (graphics instanceof Graphics2D) (
Dimension dimension = getSize();
Point point = new Point(dimension.width / 2, dimension.height / 2);
int radius = (int)(point.x * 0.84);
graphics.setColor(colorOfCircle);
graphics.drawArc(point.x - radius, point.y - radius,
radius*2-1, radius*2-1,
0, 360);
graphics.setColor(colorOfText);
graphics.setFont(sampleFont);
CircularText((Graphics2D)graphics, sampleTxt, point, radius, -Math.PI/2, 1.0);
)
else (
System.out.println("Some Error Occurred");
)
)
static void CircularText(Graphics2D graphics, String sampleTxt, Point center,
double radius, double length, double height)
(
double circleAngle = length;
Point2D circle = new Point2D.Double(center.x, center.y);
char chArray() = sampleTxt.toCharArray();
FontMetrics fm = graphics.getFontMetrics();
AffineTransform formx, formy;
formx = AffineTransform.getTranslateInstance(circle.getX(), circle.getY());
for(int i = 0; i < chArray.length; i++) (
double cwid = (double)(getWidth(chArray(i), fm));
if (!(chArray(i) == ' ' || Character.isSpaceChar(chArray(i)))) (
cwid = (double)(fm.charWidth(chArray(i)));
formy = new AffineTransform(formx);
formy.rotate(circleAngle, 0.0, 0.0);
String chstr = new String(chArray, i, 1);
graphics.setTransform(formy);
graphics.drawString(chstr, (float)(-cwid/2), (float)(-radius));
)
if (i < (chArray.length - 1)) (
double adv = cwid/2.0 + fm.getLeading() + getWidth(chArray(i + 1), fm)/2.0;
circleAngle += Math.sin(adv / radius);
)
)
)
static int getWidth(char charText, FontMetrics fontMetrics) (
if (charText == ' ' || Character.isSpaceChar(charText)) (
return fontMetrics.charWidth('n');
)
else (
return fontMetrics.charWidth(charText);
)
)
)

Kimenet:

5. példa

2D java szöveges grafikához.

Kód:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
public class FontsDemo extends Frame (
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main( String() argv ) (
FontsDemo myExample = new FontsDemo( "Text Graphics" );
)
public FontsDemo( String title ) (
super( title );
setSize( 450, 180 );
addWindowListener( new WindowAdapter() (
public void windowClosing( WindowEvent we ) (
dispose();
System. exit ( 0 );
)
) );
setVisible( true );
)
public void paint( Graphics g ) (
Graphics2D graphics = (Graphics2D) g;
FontRenderContext frc = graphics.getFontRenderContext();
Font font = new Font( "Arial", Font. HANGING_BASELINE | Font. BOLD, 72 );
TextLayout tl = new TextLayout( "eduCBA", font, frc );
Shape myShape = tl.getOutline( AffineTransform. getTranslateInstance ( 50, 100 ) );
Paint myPaint = loadTextureResource( "1.gif" );
graphics.setPaint( myPaint );
graphics.fill( myShape );
)
public TexturePaint loadTextureResource( String absfilename ) (
MediaTracker tracker = new MediaTracker( this );
Image imtexture = Toolkit.getDefaultToolkit().getImage( absfilename );
tracker.addImage( imtexture, 0 );
try (
tracker.waitForID( 0 );
int width = imtexture.getWidth( this );
int height = imtexture.getHeight( this );
System. out .println( "width" + width + " height =" + height );
BufferedImage buffImg = new
BufferedImage( width, height, BufferedImage. TYPE_INT_ARGB );
Graphics g = buffImg.getGraphics();
g.drawImage( imtexture, 0, 0, this );
return new TexturePaint( buffImg, new Rectangle2D.Double( 0, 0, width, height ) );
)
catch( Exception e ) (
System. out .println( "Exception on Image-Texture Loading" );
)
return null;
)
)

Kimenet:

Következtetés

Most, hogy elértük a cikk végét, remélem, srácoknak tisztességes elképzeléssel kell rendelkezniük arról, mit lehet elérni a Java 2D grafikával. Őszintén szólva, a Java 2D osztályok képessége nem korlátozódik az egyszerű formákra és ábrákra, hanem kibővíthető komplex ábrák és geometriai alakzatok tervezésére is, és leginkább attól függ, hogy miként hasznosítják a meglévő osztályokat és módszereket.

Ajánlott cikk

Ez egy útmutató a 2D grafikához a Java-ban. Itt a Java 2D grafika bevezetése, a kód implementációja és kimenete mellett tárgyaljuk. A további javasolt cikkeken keresztül további információkat is megtudhat -

  1. Bevezetés a 2D animációs szoftverbe
  2. 2D és 3D alakzatok | A 10 legjobb összehasonlítás
  3. Palindrome Java alkalmazáskóddal
  4. A GridBagLayout módszerei Java-ban

Kategória: