Inleiding tot 2D Graphics in Java
Java ondersteunt 2D Application Programming Interface waarmee u 2D-afbeeldingen in zeer hoge kwaliteit kunt maken. De Java 2D API bestaat uit klassen met vooraf gedefinieerde Java-functies of -methoden waarmee de programmeur de geometrische transformatie, beeldverwerking, alpha-compositie en vele andere geavanceerde grafische ontwerpen kan uitvoeren.
De Java 2D API is een onderdeel van het Java 2-platform. Hieronder staan de pakketten waaruit 2D API bestaat:
- awt
- awt.image
- awt.color
- awt.font
- awt.geom
- awt.print
- awt.image.renderable
Java 2D API breidt Abstract Windowing Toolkit (AWT) uit voor tweedimensionale grafische en beeldvormingsmogelijkheden. Het pakket bestaat uit een volledig raamwerk om een rijke gebruikersinterface, tekenprogramma's en editors voor afbeeldingen te ontwikkelen.
Met Java 2D API krijgt u ondersteuning voor de onderstaande functies:
- Hiermee kunt u complexe documenten afdrukken.
- Het biedt kleurbeheer met een verbeterde set kleuren.
- Het pakket heeft een breed scala aan gebruiksklare geometrische ontwerpen zoals curven, vierkanten, driehoeken, rechthoeken
- Met het pakket kunt u elke vorm op een zeer intuïtieve manier weergeven.
- Om tijdens het ontwerpproces dezelfde kwaliteit te behouden, verschijnen er waar nodig hints voor weergave
Tot nu toe hebben we op zeer hoog niveau besproken wat 2D API is en wat u kunt bereiken met deze API. Nu je er wat van begrijpt, laten we diep ingaan op deze sectie. Een van de belangrijkste aspecten is dat u met Java 2D Rendering niet altijd met primitieve geometriepatronen te maken hebt en uw geometrische figuur hoeft te ontwerpen. Laten we eens kijken hoe rendering werkt in 2D API.
Java 2D-weergave
Java 2D API ondersteunt een uniform renderingmodel voor alle verschillende soorten apparaten, of het nu een beeldschermmonitor of een printer is. Tijdens de ontwikkeling van het programma werkt weergave op dezelfde manier, ongeacht de eindcomponent, of het nu een printer of een beeldschermmonitor is. Het pakket detecteert en wijzigt automatisch de grafische context op basis van de eindcomponent. De Java 2D API bestaat uit java.awt.Graphics2D die de grafische klasse uitbreidt om ondersteuning te bieden voor verbeterde grafische en renderingfuncties.
Hieronder staan de functies die het pakket biedt:
- Het ondersteunt de weergave van primitieve geometrische vormen en figuren.
- Het biedt de optie om het interieur van elke vorm te vullen met elke kleur of patroon die is opgegeven in verfattributen met behulp van lijnen.
- Hiermee kunt u de opgegeven afbeelding renderen.
- Hiermee kunt u de tekststrings omzetten in glyphs die kunnen worden gevuld met de kleuren die zijn opgegeven in de verfattributen.
Voorbeeld 1
Laten we eens kijken naar hetzelfde Java-programma en kijken hoe het werkt.
Code:
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);
)
)
)
Output:
Grafische klasse biedt verschillende methoden voor het tekenen van verschillende grafische objecten. De meest voorkomende methoden zijn drawString (), drawImage () en fillXxx (). Deze methoden kunnen grofweg in twee categorieën worden verdeeld. Het eerste type grafische methode is, het biedt functies voor tekenen en vullen waarmee de gebruikers de basisvormen, tekst en afbeeldingen kunnen weergeven. Het andere type methode is voor attribuutinstellingen waarmee u het effect kunt veranderen van hoe de tekening in de console verschijnt. Met methoden zoals setColor en setFont kunt u bepalen hoe de tekening en opvulling worden weergegeven. De grafische context is verantwoordelijk voor het handhaven van de status of attributen zoals de huidige kleur van het schilderij, het huidige lettertype.
Voorbeeld 2
Laten we een ander voorbeeld bekijken van wat we nog meer kunnen bereiken met Java 2D-klassen.
Code:
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 ) );
)
)
Output:
Voorbeeld 3
Laten we 2D Java in het volgende programma toepassen.
Code:
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 );
)
)
)
Output:
Voorbeeld 4
Kleurcodering toepassen in het volgende programma.
Code:
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);
)
)
)
Output:
Voorbeeld 5
2D Java voor tekstafbeeldingen.
Code:
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;
)
)
Output:
Conclusie
Nu we het einde van het artikel hebben bereikt, hoop ik dat jullie een goed idee moeten hebben van wat je kunt bereiken met de Java 2D-graphics. Eerlijk gezegd, de mogelijkheden van Java 2D-klassen zijn niet beperkt tot eenvoudige vormen en figuren, het kan worden uitgebreid tot complexe figuren en geometrische vormen en hangt meestal af van hoe u de bestaande klassen en methoden gebruikt.
Aanbevolen artikel
Dit is een handleiding voor 2D-afbeeldingen in Java. Hier bespreken we de inleiding tot 2D-afbeeldingen in Java, samen met de implementatie en uitvoer van code. U kunt ook onze andere voorgestelde artikelen doornemen voor meer informatie -
- Inleiding tot 2D-animatiesoftware
- 2D- en 3D-vormen | Top 10 vergelijkingen
- Palindrome in Java met implementatie van code
- Methoden voor GridBagLayout in Java