使用Slider旋转对象在java中

我制作了一个GUI,它使用滑块来上下缩放对象。(在本例中为矩形)。 我想知道是否还有一种方法可以使用滑块来指定旋转度。 因此,将有2个滑块用于控制比例,另一个用于控制旋转。 如果有人可以帮助我做到这一点,这将是伟大的这是我到目前为止只有比例滑块。

import javax.swing.*; public class Parker { public static void main(String[] args) { TheWindow w = new TheWindow(); w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X wont close the window with out this line w.setSize(1280,720); w.setVisible(true); } } import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class TheWindow extends JFrame { private JSlider slider; //declare slider private drawRect myPanel; //declare/ create panel public TheWindow() { super("Slider Example"); //make title myPanel = new drawRect(); myPanel.setBackground(Color.cyan); //change background color slider = new JSlider(SwingConstants.VERTICAL, 0, 315, 10);// restrains the slider from scaling square to 0-300 pixels slider.setMajorTickSpacing(20); //will set tick marks every 10 pixels slider.setPaintTicks(true); //this actually paints the ticks on the screen slider.addChangeListener ( new ChangeListener() { public void stateChanged(ChangeEvent e) { myPanel.setD(slider.getValue()); //Wherever you set the slider, it will pass that value and that will paint on the screen } } ); add(slider, BorderLayout.WEST); //similar to init method, adds slider and panel to GUI add(myPanel, BorderLayout.CENTER); } import java.awt.*; import javax.swing.*; public class drawRect extends JPanel { private int d = 20; //this determines the beginning size of the rect. public void paintComponent(Graphics g)//paints obj on the screen { super.paintComponent(g); //prepares graphic object for drawing // ImageIcon i = new ImageIcon("A:\\Capture.png"); //location of Image // i.paintIcon(this, g, d, d); //paints icon on screen int originX = getWidth() / 2; //this is subtracting half of 'd' from the center point to scale it form the center int originY = getHeight() / 2; int x = originX - (d / 2); int y = originY - (d / 2); System.out.println(x + "x" + y); g.fillRect(x, y, d, d); //paints rectangle on screen //x , y, width, height } 

好吧,我一直在玩这个有一段时间我通常会使用AffineTransform这个,但它给了我奇怪的结果我无法解决…

ZoomSpin

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Parker { public static void main(String[] args) { new Parker(); } public Parker() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new ControlPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ControlPane extends JPanel { private JSlider slider; //declare slider private DrawPane myPanel; public ControlPane() { setLayout(new BorderLayout()); myPanel = new DrawPane(); myPanel.setBackground(Color.cyan); //change background color slider = new JSlider(SwingConstants.VERTICAL, 0, 400, 100);// restrains the slider from scaling square to 0-300 pixels slider.setMajorTickSpacing(20); //will set tick marks every 10 pixels slider.setPaintTicks(true); //this actually paints the ticks on the screen slider.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { myPanel.setScale(slider.getValue()); //Wherever you set the slider, it will pass that value and that will paint on the screen } } ); JSlider rotate = new JSlider(SwingConstants.VERTICAL, 0, 720, 0); rotate.setMajorTickSpacing(20); //will set tick marks every 10 pixels rotate.setPaintTicks(true); //this actually paints the ticks on the screen rotate.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { JSlider slider = (JSlider) e.getSource(); myPanel.setAngle(slider.getValue()); } } ); add(slider, BorderLayout.WEST); add(rotate, BorderLayout.EAST); add(myPanel); myPanel.setScale(400); } } public class DrawPane extends JPanel { private double scale = 1; private double angle = 0; private final int rectWidth = 20; private final int rectHeight = 20; @Override protected void paintComponent(Graphics g)//paints obj on the screen { super.paintComponent(g); //prepares graphic object for drawing int originX = getWidth() / 2; int originY = getHeight() / 2; int xOffset = -(rectWidth / 2); int yOffset = -(rectHeight / 2); g.setColor(Color.BLACK); Graphics2D g2d = (Graphics2D) g.create(); g2d.translate(originX, originY); g2d.scale(scale, scale); g2d.rotate(Math.toRadians(angle), 0, 0); g2d.fill(new Rectangle2D.Double(xOffset, yOffset, rectWidth, rectHeight)); g2d.dispose(); g.setColor(Color.RED); g.drawRect(originX + xOffset, originY + yOffset, rectWidth, rectWidth); } public void setAngle(double angle) { this.angle = angle; repaint(); } public void setScale(int scale) { // Scaling is normalized so that 1 = 100% this.scale = (scale / 100d); repaint(); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } } 

基本上,它使用Graphics APIfunction,为简单起见(特别是旋转), Graphics上下文被转换为原点。 然后矩形在此原点周围绘制,以允许它缩放并围绕它的中心旋转