使用java 2D API
可以到
http://expert.csdn.net/TopicView.asp?id=42476
求助一下。

解决方案 »

  1.   

    参考一下,下面的程序
    // 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
            }
        }
    }
      

  2.   

    robber,谢谢你,你简直不想“强盗”,而是位乐于助人的大侠,!
    这样说,是不是有些酸?robber,我还想问一下:
    为什莫单独汉字,英文旋转的位置很好,而英汉混排文字则不正确呢?
    还有,经过旋转的字显示出来是模糊的,请问怎样解决?
      

  3.   

    谢谢happyHua:由于汉字比英文复杂的多,因此在绘制的时候就会有一些问题。
    你可以提高绘图质量来减少模糊!
    访问   http://expert.csdn.net/TopicView.asp?id=46612
    看看有没有帮助!!!