首頁 >Java >java教程 >Java 中的 2D 圖形

Java 中的 2D 圖形

PHPz
PHPz原創
2024-08-30 16:06:061147瀏覽

借助Java 2 平台的一些高級功能,可以使用Java 編程來實現2D 圖形,其中包括用於圖像處理、高級圖形設計選項、幾何變換、Alpha 合成等操作的Java 內置函數java 2D包下提供了許多套件,例如awt、awt.image、awt.color、awt.font、awt.geom、awt.print和awt.image.renderable。 Java 因其高品質的圖形結果而成為遊戲開發人員社群中著名的首選選項,各種各樣的幾何設計選項有利於文件的列印,並允許保持所開發產品的效能。

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

Java 2D 渲染

Java 2D API 支援跨所有不同裝置的統一渲染模型:顯示監視器或印表機。在程式開發過程中,無論最終組件是印表機還是顯示器,渲染都以相同的方式運作。該包根據最終組件自動檢測並更改圖形上下文。 Java 2D API 由 java.awt.Graphics2D 組成,它擴展了 Graphics 類別以提供對增強圖形和渲染功能的支援。

以下是該軟體包提供的功能:

  • 支援原始幾何形狀和圖形的渲染。
  • 它提供了使用描邊用繪畫屬性中指定的任何顏色或圖案填充任何形狀內部的選項。
  • 它可以讓您渲染指定的影像。
  • 它可以讓您將文字字串轉換為字形,並用繪製屬性中指定的顏色填滿。

範例#1

讓我們來看看同一個 Java 程序,看看它是如何運作的。

代碼:

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);
}
}
}

輸出:

Java 中的 2D 圖形

Graphics類別提供了不同的方法來繪製不同的圖形物件。最常見的方法是drawString()、drawImage() 和fillXxx()。這些方法大致可分為兩類。第一種類型的 Graphics 方法是,它提供繪製和填充功能,使用戶能夠渲染基本形狀、文字和圖像。另一種類型的方法是屬性設置,它允許您更改繪圖在控制台中的顯示效果。 setColor 和 setFont 等方法可讓您決定繪製和填滿的呈現方式。圖形上下文負責維護狀態或屬性,例如當前字體的當前繪畫顏色。

範例#2

讓我們看看另一個例子,看看我們還可以使用 Java 2D 類別實現什麼。

代碼:

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 ) );
}
}

輸出:

Java 中的 2D 圖形

範例 #3

讓我們在下面的程式中應用 2D java。

代碼:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
public class GeometricShapes2 extends JFrame
{
/**
*
*/
private static final long <em>serialVersionUID</em> = 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.<em>green</em> );
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.<em>PI</em> / 9.0 );
graphics2D.setColor(new Color( ( int ) ( Math.<em>random</em>() * 128 ),( int ) ( Math.<em>random</em>() * 128 ),
( int ) ( Math.<em>random</em>() * 128 ) ) );
graphics2D.fill( starFigure );
}
}
}

輸出:

Java 中的 2D 圖形

範例#4

在以下程式中套用顏色編碼。

代碼:

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);
}
}
} <strong> </strong><strong>Output:</strong>

Java 中的 2D 圖形

範例#5

用於文字圖形的 2D java。

代碼:

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 <em>serialVersionUID</em> = 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.<em>exit</em>( 0 );
}
} );
setVisible( true );
}
public void paint( Graphics g ) {
Graphics2D graphics = (Graphics2D) g;
FontRenderContext frc = graphics.getFontRenderContext();
Font font = new Font( "Arial", Font.<em>HANGING_BASELINE</em> | Font.<em>BOLD</em>, 72 );
TextLayout tl = new TextLayout( "eduCBA", font, frc );
Shape myShape = tl.getOutline( AffineTransform.<em>getTranslateInstance</em>( 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.<em>out</em>.println( "width" + width + " height =" + height );
BufferedImage buffImg = new
BufferedImage( width, height, BufferedImage.<em>TYPE_INT_ARGB</em> );
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.<em>out</em>.println( "Exception on Image-Texture Loading" );
}
return null;
}
}

輸出:

Java 中的 2D 圖形

結論

 現在我們已經到了文章的結尾,我希望你們一定對使用 Java 2D 圖形可以實現什麼有一個清晰的了解。老實說,Java 2D 類別的功能不僅限於簡單的形狀和圖形;它可以擴展到設計複雜的圖形和幾何形狀,並且主要取決於您如何利用現有的類別和方法。

以上是Java 中的 2D 圖形的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Java 關閉掛鉤下一篇:Java 關閉掛鉤