请问如何用java(1.22),写出倒着放的字,即字体逆时针转90度。如通常坐标轴Y轴标记所示。 使用java 2D API可以到http://expert.csdn.net/TopicView.asp?id=42476求助一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考一下,下面的程序// TTextLayout1.javaimport javax.swing.*;import javax.swing.event.*;import javax.swing.border.*;import java.awt.*;import java.awt.event.*;import java.awt.font.*;import java.awt.geom.*;public class TTextLayout1 extends JFrame { DisplayPanel displayPanel; JSlider slider, slider1, slider2, slider3, slider4, slider5, slider6, slider7, slider8, slider9; // Translation distances in x- and y- directions double transX = 0.0, transY = 0.0; // Rotation parameters: Theta and center of rotation. double rotateTheta = 0.0, rotateX = 150.0, rotateY = 150.0; // Scale factors in the x- and y- directions double scaleX = 1.0, scaleY = 1.0; // Shear factors in the x- and y- directions double shearX = 0.0, shearY = 0.0 ; public TTextLayout1() { // 1. Assign a title and get the content pane super("TTextLayout1"); Container container = getContentPane(); // 2. Add a control panel with titled border JPanel controlPanel = new JPanel(); controlPanel.setLayout(new GridLayout(4, 3)); container.add(controlPanel, BorderLayout.NORTH); TitledBorder border = new TitledBorder("Control Panel"); controlPanel.setBorder(border); // 3. Add various controls to the panel to adjust translation, // rotation, scaling and shearing. JLabel label1 = new JLabel("Translate(dx,dy): "); JLabel label2 = new JLabel("Rotate(Theta,ox,oy): "); JLabel label3 = new JLabel("Scale(sx,sy)x10E-2:"); JLabel label4 = new JLabel("Shear(shx, shy)X10E-2: "); // To control translation controlPanel.add(label1); setSlider(controlPanel, JSlider.HORIZONTAL, 0, 300, 150, 100, 50); slider1 = slider; setSlider(controlPanel, JSlider.HORIZONTAL, 0, 300, 150, 100, 50); slider2 = slider; // To control rotation controlPanel.add(label2); setSlider(controlPanel, JSlider.HORIZONTAL, 0, 360, 0, 90, 45); slider3 = slider; JPanel subPanel = new JPanel(); subPanel.setLayout(new GridLayout(1, 2)); setSlider(subPanel, JSlider.HORIZONTAL, 0, 300, 150, 150, 50); slider4 = slider; setSlider(subPanel, JSlider.HORIZONTAL, 0, 300, 150, 150, 50); slider5 = slider; controlPanel.add(subPanel); // To control scaling controlPanel.add(label3); setSlider(controlPanel, JSlider.HORIZONTAL, 0, 200, 100, 100, 10); slider6 = slider; setSlider(controlPanel, JSlider.HORIZONTAL, 0, 200, 100, 100, 10); slider7 = slider; // To control shearing controlPanel.add(label4); setSlider(controlPanel, JSlider.HORIZONTAL, -100, 100, 0, 100, 25); slider8 = slider; setSlider(controlPanel, JSlider.HORIZONTAL, -100, 100, 0, 100, 25); slider9 = slider; // 4. Add the display panel to the frame. displayPanel = new DisplayPanel(); container.add(displayPanel); // 5. Add a frame closing listener and display the frame addWindowListener(new WindowEventHandler()); setSize(400, 400); show(); // Display the frame } // 6. The main method... public static void main(String arg[]) { new TTextLayout1(); } // 7. Code to handle closing of the frame class WindowEventHandler extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } // 8. Creates a slider object with the required tick s public void setSlider(JPanel panel, int orientation, int minimumValue, int maximumValue, int initValue, int majorTickSpacing, int minorTickSpacing) { slider = new JSlider(orientation, minimumValue, maximumValue, initValue); slider.setPaintTicks(true); slider.setMajorTickSpacing(majorTickSpacing); slider.setMinorTickSpacing(minorTickSpacing); slider.setPaintLabels(true); slider.addChangeListener(new SliderListener()); panel.add(slider); } // 9. Slider listener class; Methods retrive the values from // the sliders and assign them to the respective parameters. // These parameters are used to apply to the font rendering context. // Next call the repaint() method on canvas. class SliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider tempSlider = (JSlider) e.getSource(); if (tempSlider.equals(slider1)) { transX = slider1.getValue()-150.0; displayPanel.repaint(); } else if (tempSlider.equals(slider2)) { transY = slider2.getValue()-150.0; displayPanel.repaint(); } else if (tempSlider.equals(slider3)) { rotateTheta = slider3.getValue()*Math.PI/180; displayPanel.repaint(); } else if (tempSlider.equals(slider4)) { rotateX = slider4.getValue(); displayPanel.repaint(); } else if (tempSlider.equals(slider5)) { rotateY = slider5.getValue(); displayPanel.repaint(); } else if (tempSlider.equals(slider6)) { if (slider6.getValue() != 0.0) { scaleX = slider6.getValue()/100.0; displayPanel.repaint(); } } else if (tempSlider.equals(slider7)) { if (slider7.getValue() != 0.0) { scaleY = slider7.getValue()/100.0; displayPanel.repaint(); } } else if (tempSlider.equals(slider8)) { shearX = slider8.getValue()/100.0; displayPanel.repaint(); } else if (tempSlider.equals(slider9)) { shearY = slider9.getValue()/100.0; displayPanel.repaint(); } } } // 10. Definition of the display panel class DisplayPanel extends JPanel { // Constructor public DisplayPanel() { setBackground(Color.white); setSize(400, 200); } // The update method... public void update(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); paintComponent(g); } // The painting method... public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; // Assign the translation, rotation, scaling and shearing // to the affine transform. AffineTransform af = new AffineTransform(); af.translate(transX, transY); af.rotate(rotateTheta, rotateX, rotateY); af.scale(scaleX, scaleY); af.shear(shearX, shearY); // Apply the affine transform to a fort rendering context. FontRenderContext frc = new FontRenderContext(af, false, false); Font font = new Font("Dialog", Font.PLAIN, 36); // Assign the font and font rendering context to a text layout TextLayout layout = new TextLayout("Java 2D Text Layout", font, frc); layout.draw(g2D, 25, 75); // draw the layout string } }} robber,谢谢你,你简直不想“强盗”,而是位乐于助人的大侠,!这样说,是不是有些酸?robber,我还想问一下:为什莫单独汉字,英文旋转的位置很好,而英汉混排文字则不正确呢?还有,经过旋转的字显示出来是模糊的,请问怎样解决? 谢谢happyHua:由于汉字比英文复杂的多,因此在绘制的时候就会有一些问题。你可以提高绘图质量来减少模糊!访问 http://expert.csdn.net/TopicView.asp?id=46612看看有没有帮助!!! 如果有一个超大数列,比如1千亿,如何尽量精确的评估它的排序时间 求高手解答 抽象类实现一个接口为什么可以不用都实现接口中的方法 求个思路,关于SE JRE预加载。 谁能帮我证明一下 :“String StringBuffer 性能比较↓” 我需要帮助 关于方法能不能当类用 如何高亮JLabel java1.6是在5.0之前? 送分100!! 求代码例子---在线等 Applet的一个小问题 jdk1.2与jdk1.3差别大吗?jdk1.3中是不是没有了com.sun.java.swing包? 用java 如何制作数据选择标签?具体详见下文。
// TTextLayout1.javaimport javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;public class TTextLayout1 extends JFrame {
DisplayPanel displayPanel;
JSlider slider, slider1, slider2, slider3,
slider4, slider5, slider6, slider7,
slider8, slider9; // Translation distances in x- and y- directions
double transX = 0.0, transY = 0.0; // Rotation parameters: Theta and center of rotation.
double rotateTheta = 0.0, rotateX = 150.0, rotateY = 150.0; // Scale factors in the x- and y- directions
double scaleX = 1.0, scaleY = 1.0; // Shear factors in the x- and y- directions
double shearX = 0.0, shearY = 0.0 ; public TTextLayout1() {
// 1. Assign a title and get the content pane
super("TTextLayout1");
Container container = getContentPane(); // 2. Add a control panel with titled border
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new GridLayout(4, 3));
container.add(controlPanel, BorderLayout.NORTH);
TitledBorder border = new TitledBorder("Control Panel");
controlPanel.setBorder(border); // 3. Add various controls to the panel to adjust translation,
// rotation, scaling and shearing.
JLabel label1 = new JLabel("Translate(dx,dy): ");
JLabel label2 = new JLabel("Rotate(Theta,ox,oy): ");
JLabel label3 = new JLabel("Scale(sx,sy)x10E-2:");
JLabel label4 = new JLabel("Shear(shx, shy)X10E-2: "); // To control translation
controlPanel.add(label1);
setSlider(controlPanel, JSlider.HORIZONTAL,
0, 300, 150, 100, 50);
slider1 = slider;
setSlider(controlPanel, JSlider.HORIZONTAL,
0, 300, 150, 100, 50);
slider2 = slider; // To control rotation
controlPanel.add(label2);
setSlider(controlPanel, JSlider.HORIZONTAL,
0, 360, 0, 90, 45);
slider3 = slider; JPanel subPanel = new JPanel();
subPanel.setLayout(new GridLayout(1, 2)); setSlider(subPanel, JSlider.HORIZONTAL,
0, 300, 150, 150, 50);
slider4 = slider;
setSlider(subPanel, JSlider.HORIZONTAL,
0, 300, 150, 150, 50);
slider5 = slider;
controlPanel.add(subPanel); // To control scaling
controlPanel.add(label3);
setSlider(controlPanel, JSlider.HORIZONTAL,
0, 200, 100, 100, 10);
slider6 = slider;
setSlider(controlPanel, JSlider.HORIZONTAL,
0, 200, 100, 100, 10);
slider7 = slider; // To control shearing
controlPanel.add(label4);
setSlider(controlPanel, JSlider.HORIZONTAL,
-100, 100, 0, 100, 25);
slider8 = slider;
setSlider(controlPanel, JSlider.HORIZONTAL,
-100, 100, 0, 100, 25);
slider9 = slider; // 4. Add the display panel to the frame.
displayPanel = new DisplayPanel();
container.add(displayPanel); // 5. Add a frame closing listener and display the frame
addWindowListener(new WindowEventHandler());
setSize(400, 400);
show(); // Display the frame
} // 6. The main method...
public static void main(String arg[]) {
new TTextLayout1();
} // 7. Code to handle closing of the frame
class WindowEventHandler extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
} // 8. Creates a slider object with the required tick s
public void setSlider(JPanel panel, int orientation,
int minimumValue, int maximumValue,
int initValue,
int majorTickSpacing,
int minorTickSpacing) {
slider = new JSlider(orientation,
minimumValue, maximumValue,
initValue);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(majorTickSpacing);
slider.setMinorTickSpacing(minorTickSpacing);
slider.setPaintLabels(true);
slider.addChangeListener(new SliderListener());
panel.add(slider);
} // 9. Slider listener class; Methods retrive the values from
// the sliders and assign them to the respective parameters.
// These parameters are used to apply to the font rendering context.
// Next call the repaint() method on canvas.
class SliderListener implements ChangeListener {
public void stateChanged(ChangeEvent e) {
JSlider tempSlider = (JSlider) e.getSource(); if (tempSlider.equals(slider1)) {
transX = slider1.getValue()-150.0;
displayPanel.repaint();
}
else if (tempSlider.equals(slider2)) {
transY = slider2.getValue()-150.0;
displayPanel.repaint();
}
else if (tempSlider.equals(slider3)) {
rotateTheta = slider3.getValue()*Math.PI/180;
displayPanel.repaint();
}
else if (tempSlider.equals(slider4)) {
rotateX = slider4.getValue();
displayPanel.repaint();
}
else if (tempSlider.equals(slider5)) {
rotateY = slider5.getValue();
displayPanel.repaint();
}
else if (tempSlider.equals(slider6)) {
if (slider6.getValue() != 0.0) {
scaleX = slider6.getValue()/100.0;
displayPanel.repaint();
}
}
else if (tempSlider.equals(slider7)) {
if (slider7.getValue() != 0.0) {
scaleY = slider7.getValue()/100.0;
displayPanel.repaint();
}
}
else if (tempSlider.equals(slider8)) {
shearX = slider8.getValue()/100.0;
displayPanel.repaint();
}
else if (tempSlider.equals(slider9)) {
shearY = slider9.getValue()/100.0;
displayPanel.repaint();
}
}
} // 10. Definition of the display panel
class DisplayPanel extends JPanel {
// Constructor
public DisplayPanel() {
setBackground(Color.white);
setSize(400, 200);
} // The update method...
public void update(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
paintComponent(g);
} // The painting method...
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g; // Assign the translation, rotation, scaling and shearing
// to the affine transform.
AffineTransform af = new AffineTransform();
af.translate(transX, transY);
af.rotate(rotateTheta, rotateX, rotateY);
af.scale(scaleX, scaleY);
af.shear(shearX, shearY);
// Apply the affine transform to a fort rendering context.
FontRenderContext frc = new FontRenderContext(af, false, false);
Font font = new Font("Dialog", Font.PLAIN, 36);
// Assign the font and font rendering context to a text layout
TextLayout layout = new TextLayout("Java 2D Text Layout", font, frc);
layout.draw(g2D, 25, 75); // draw the layout string
}
}
}
这样说,是不是有些酸?robber,我还想问一下:
为什莫单独汉字,英文旋转的位置很好,而英汉混排文字则不正确呢?
还有,经过旋转的字显示出来是模糊的,请问怎样解决?
你可以提高绘图质量来减少模糊!
访问 http://expert.csdn.net/TopicView.asp?id=46612
看看有没有帮助!!!