可以通过Java 2D API中的绘制管道技术来实现。
下面是一个例子:
//file: Iguana.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;public class Iguana extends JComponent {
private Image image;
private int theta; public Iguana( ) {
theta = 0;
addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
} public void paint(Graphics g) {
//theta = (theta + 15) % 360;
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int cx = getSize( ).width / 2;
int cy = getSize( ).height / 2;
g2.translate(cx, cy);
g2.rotate(theta * Math.PI / 180);
Shape oldClip = g2.getClip( );
g2.setClip(oldClip);
g2.setFont(new Font("Times New Roman", Font.PLAIN, 64));
g2.setPaint(new GradientPaint(-cx, 0, Color.red,
cx, 0, Color.black, false));
g2.drawString("Hello, 2D!", -cx * 3 / 4, cy / 4);
}
public static void main(String[] args) {
JFrame f = new JFrame("Iguana");
Container c = f.getContentPane( );
c.setLayout(new BorderLayout( ));
c.add(new Iguana( ), BorderLayout.CENTER);
f.setSize(300, 300);
f.setLocation(100, 100);
f.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
f.setVisible(true);
}
}
当你在窗体上点鼠标时,Hello, 2D!将会在窗体内旋转;若想去掉鼠标事件,则去掉addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
着一段程序,在public void paint(Graphics g)的第一句加上自己设置的倾斜角度,即可实现,这里的程序把theta = (theta + 15) % 360;注释掉了。
下面是一个例子:
//file: Iguana.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;public class Iguana extends JComponent {
private Image image;
private int theta; public Iguana( ) {
theta = 0;
addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
} public void paint(Graphics g) {
//theta = (theta + 15) % 360;
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int cx = getSize( ).width / 2;
int cy = getSize( ).height / 2;
g2.translate(cx, cy);
g2.rotate(theta * Math.PI / 180);
Shape oldClip = g2.getClip( );
g2.setClip(oldClip);
g2.setFont(new Font("Times New Roman", Font.PLAIN, 64));
g2.setPaint(new GradientPaint(-cx, 0, Color.red,
cx, 0, Color.black, false));
g2.drawString("Hello, 2D!", -cx * 3 / 4, cy / 4);
}
public static void main(String[] args) {
JFrame f = new JFrame("Iguana");
Container c = f.getContentPane( );
c.setLayout(new BorderLayout( ));
c.add(new Iguana( ), BorderLayout.CENTER);
f.setSize(300, 300);
f.setLocation(100, 100);
f.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
f.setVisible(true);
}
}
当你在窗体上点鼠标时,Hello, 2D!将会在窗体内旋转;若想去掉鼠标事件,则去掉addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
着一段程序,在public void paint(Graphics g)的第一句加上自己设置的倾斜角度,即可实现,这里的程序把theta = (theta + 15) % 360;注释掉了。
解决方案 »
- 一道关于Java内部类的难题
- 如何用java部分预览doc和ppt文件 在线-等待
- 谁知道tomcat临时文件在哪放着?
- applet可以实现c/s吗?
- 急急急!!!!!!!!!帮我找找这段程序错在哪里??????????在线等待!!!!!!!!!!!!!
- 什么是环境变量,为什么要设置环境变量?
- Applet中,怎样让一个JEditorPane位于JButton的上边,也就是盖住JButton. (无内容)
- 每日定时将数据库(1)中的信息转移到数据库(2),如何操作?急!有分!
- 关于构造函数的重载:很简单的:)
- JAVA 错误,请教大哥大姐,一天都未解决
- 求救!
- 请高手指点:关于数据的表示问题
g2.rotate(0.4);
g2.drawString("AAAAAAAA", 100,100);
一试便知!
如:
Graphics2D g2d = (Graphics2D)g;
g2d.drawString("aaaaaaaaaaa",300,150);
g2d.rotate(30*Math.PI/180);
g2d.drawString("aaaaaaaaaaa",300,150);
g2d.rotate(60*Math.PI/180);
g2d.drawString("aaaaaaaaaaa",300,150);
g2d.rotate(90*Math.PI/180);
g2d.drawString("aaaaaaaaaaa",300,150);我上面一串代码后,写的字:aaaaaaaaaaaa根本不在一个位置了,有的在屏幕上已经看不到了啊?这该如何解决啊?
下面我对我第一次提到的例子改进如下,可以实现你的要求:
//file: Iguana.java
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import javax.swing.*;public class Iguana extends JComponent {
private Image image;
private int theta;
private float x,y; public Iguana( ) {
theta = 0;
addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
} public void paint(Graphics g) {
//theta = (theta + 15) % 360;
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = getSize( ).width;
int height = getSize( ).height;
Font font = new Font("Times New Roman", Font.PLAIN, 20);
g2.setFont(font);
g2.setFont(new Font("Times New Roman", Font.PLAIN, 20));
FontRenderContext frc = g2.getFontRenderContext( );
LineMetrics metrics = font.getLineMetrics("Hello, 2D!", frc);
float messageWidth =
(float)font.getStringBounds("Hello, 2D!", frc).getWidth( );
float ascent = metrics.getAscent( );
float descent = metrics.getDescent( );
float cx = (width - messageWidth) / 2;
float cy = (height + metrics.getHeight( )) / 2 - descent;
g2.setPaint(getBackground( ));
g2.fillRect(0, 0, width, height);
g2.translate(100,100);
g2.rotate(theta * Math.PI / 180);
Shape oldClip = g2.getClip( );
g2.setClip(oldClip);
g2.setPaint(new GradientPaint(-cx, 0, Color.red,cx, 0, Color.black, false));
g2.drawString("Hello, 2D!", 0,0);
}
public static void main(String[] args) {
JFrame f = new JFrame("Iguana");
Container c = f.getContentPane( );
c.setLayout(new BorderLayout( ));
c.add(new Iguana( ), BorderLayout.CENTER);
f.setSize(300, 300);
f.setLocation(100, 100);
f.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
f.setVisible(true);
}
}
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import javax.swing.*;public class RotateText extends JComponent {
private Image image;
private int theta;
private float x,y;
public RotateText( ) {
theta = 0;
addMouseListener(new MouseAdapter( ) {
public void mousePressed(MouseEvent me) {
theta = (theta + 15) % 360;
repaint( );
}
});
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = getSize().width;
int height = getSize().height;
Font font = new Font("Times New Roman", Font.PLAIN, 20);
g2.setFont(font);
float cx = width/2;
g2.setPaint(getBackground());
g2.fillRect(0, 0, width, height);
g2.translate(100,100);
g2.rotate(theta * Math.PI / 180);
Shape oldClip = g2.getClip();
g2.setClip(oldClip);
g2.setPaint(new GradientPaint(-cx, 0, Color.red,cx, 0, Color.black, false));
g2.drawString("Hello, 2D!", 0,0);
}
public static void main(String[] args) {
JFrame f = new JFrame("RotateText");
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
c.add(new RotateText(), BorderLayout.CENTER);
f.setSize(300, 300);
f.setLocation(100, 100);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
f.setVisible(true);
}
}
g.drawString("Hell0,aa!",100,100);//没旋转之前,在(100,100)写一水平字符;
g2d.translate(100,100);
g2d.rotate(30* Math.PI / 180);//写与水平线30度字体
g.drawString("Hell0,aa!",100,100);//g2d.rotate(60 * Math.PI / 180);
g2d.drawString("Hello, 90909090909090", 0,0);//写出与水平线90度字符;就直接用上面的代码,则能保证三个字符的起点位置都一样了.都是在(100,100)开始了.我昨天用错了.现在新问题是:这个时候,如果我再要在(100,100)这点为起点画一条线,或者还在这里写字符的话,因为现在的坐标系统已经转换了,现在的(100,100)已经不是原来的(100,100)的位置,还有,方向也已经旋转变换了.在应用中,应该要一写完有角度的字,坐标系统要马上还原,因为后面还要进行很多的画图操作.我试着用以下方法还原:
g2d.translate(-100,-100);//还原坐标原点;
g2d.rotate(-90 * Math.PI / 180);//还原旋转角度,上面做了两次旋转,共转了90度.
g.drawString("Hello0000000000000!", 100,100);//重新定回水平的,位置在(100,100);
g.drawLine(100,100,250,100);//画水平线;这样处理了以后,被旋转的方向是又被旋转回来,后面的写的字符和画的线都已经是水平的了,可是坐标原点却没有回到原来的(0,0),我发现Y轴方向已经还原了,但X轴方向却比原来大了很多?不知何故?
利用你的代码:
g2d.translate(-100,-100);//还原坐标原点;
g2d.rotate(-90 * Math.PI / 180);//还原旋转角度,上面做了两次旋转,共转了90度.
g.drawString("Hello0000000000000!", 100,100);//重新定回水平的,位置在(100,100);
g.drawLine(100,100,250,100);//画水平线;
我的确测试出Y轴方向已经还原了,但X轴方向却比原来大了很多,但是你把你吧旋转变换防在平移变换之前,X和Y轴就都还原了!如下:
g2d.rotate(-90 * Math.PI / 180);//还原旋转角度,上面做了两次旋转,共转了90度
g2d.translate(-100,-100);//还原坐标原点;
g.drawString("Hello0000000000000!", 100,100);//重新定回水平的,位置在(100,100);
g.drawLine(100,100,250,100);//画水平线;
我想可能是由于着两个变换是有一定的顺序的!!
我的应用是用在APPLET里的,而且不能装JRE的。所以只能用在MS的JDK1.1下。
在JDK1.1里没有Graphics2D这个类啊。这该如何是好啊??
我想过把这个类打包打在我的APPLET里面去,可graphics2d这个类全是些抽象的方法,打包进去也没有用啊??