当前位置: 首页 > 知识库问答 >
问题:

在java中使用滑块旋转对象

华森
2023-03-14

我做了一个图形用户界面,它使用滑块来上下缩放对象。(在这种情况下是矩形)。我想知道是否有一种方法也可以使用滑块来指定旋转程度。所以会有两个滑块,一个控制比例,另一个控制旋转。如果有人能帮我做这个,那就太好了,这是我到目前为止用比例滑块做的。

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      
    }           

共有1个答案

鲜于宏义
2023-03-14

好吧,我已经玩了一段时间了,我通常会为此使用affineTransform,但它给了我无法解决的奇怪结果…

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

    }

}

基本上,这使用GraphicsAPI功能,为了简化(尤其是旋转),Graphics上下文被转换为原点。然后围绕该原点绘制矩形,以允许缩放并围绕其中心旋转

 类似资料:
  • 我穿着magento 2.2.2和使用Unero主题,我正在开发magento前端。当我在内容部分添加OWL旋转木马滑块时,它是不可见的?

  • 我有一个简单的codepen设置,我认为应该作为一个滑块工作。它包括bootstrap.css、jquery.js和bootstrap.js。我不知道缺少什么是阻止js滑动。 HTML CSS

  • 我想把velocity.js效果结合到Slick Carousel插件中。 slick:http://kenwheeler.github.io/slick/velocity:http://julian.com/research/velocity/ 这很管用,但有一个奇怪的副作用: 这是我现在得到的密码。所以我做了一个效果序列,它是用钩子beforeChange触发的。 当我转到下一张幻灯片时,它起

  • 我正在尝试创建一个脚本,允许我通过水平滑块在0°-360°(y轴)范围内旋转相机,带有Slerp效果。相机只沿着一个轴旋转(我在一个房间的中间,我必须使用水平滑块转身) 我制作了两个脚本:第一个应用于参考立方体以获得旋转,第二个应用于腔室以获得Slerp效果,同时跟踪立方体的旋转。 360°立方体旋转脚本: 具有Slerp效果的摄像机旋转脚本: 它可以工作,但有一些问题:如果我从左(0°)到右(3

  • 为子画面创建一个资产类,用于定义纹理,然后将子画面作为该纹理片,并带有该条的坐标。这是我试图旋转的精灵。我得到了使用Sprite Batch旋转它的建议(它旋转到我的触摸输入: 我收到错误: 类型SpriteBatch中的方法< code>draw(Texture,float,float,int,int,int,int)不适用于参数< code>(Sprite,int,int,int,int,in

  • 所以基本上我想跟滑头做点这样的事...我想有正常的幻灯片,但事情是,是,我想有行动呼吁(按钮)在他们。这通常很容易将按钮与幻灯片一起放入,但有一个溢出:旋转式播放器上隐藏的样式无法取下,否则其他幻灯片会显示出来。我想知道如何才能做到这一点(按钮稍微往外走而不被切断)。 编辑:添加边框到旋转木马,这是真正的问题,我有...维护边框并使底部与边框重叠