【问题标题】:Java Swing How to scale triangleJava Swing如何缩放三角形
【发布时间】:2019-09-18 12:35:36
【问题描述】:

当我更改窗口大小时,我想绘制一些随机三角形并缩放它们。

我有一个单独的类MyTriangle 扩展MyShape。我还有两个变量:scaleXscaleY。每当我尝试将三角形 xy 值相乘并更改窗口大小时,三角形就会变得疯狂并突然消失。 当我尝试写作时

graphics.fillPolygon(new int[]{(int)(x1*scX),(int)(x2*scX)(int)(x3*scX)}, new int[]{(int)(y1*scY),(int)(y2*scY),(int)(y3*scY), 3);

由于某种原因,我的窗口没有任何反应。

//from MyShape class:
//scX = window.getWidth()/(double)window.defaultWidth;
//scY = window.getHeight()/ (double)window.defaultHeight;

public class MyTriangle extends MyShape {
    int[] x;
    int[] y;
    public MyTriangle(int x1, int x2, int x3, int y1, int y2, int y3, int red, int green, int blue) {
        super(x1, x2, x3, y1, y2, y3, red, green, blue);
        this.x=new int[]{x1,x2,x3};
        this.y=new int[]{y1,y2,y3};
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        for(int i = 0; i<3; i++){
            x[i]=(int)(x[i]*scX);
            y[i]=(int)(y[i]*scY);
        }
        graphics.fillPolygon(x,y,3);
    }

我应该怎么做才能让它发挥作用?像这样的缩放适用于矩形和椭圆形。

【问题讨论】:

    标签: java swing graphics awt


    【解决方案1】:

    每次绘制时都会缩放它。因此,如果在您进行缩放后比例因子没有设置为 1,那么每次绘制它时它都会变大或变小。在paintComponent 中创建新数组以传递缩放值但保留原始值。
    *编辑

     @Override
    protected void paintComponent(Graphics graphics) {
        int[] xS = new int[3];
        int[] yS = new int[3]; 
        super.paintComponent(graphics);
        for(int i = 0; i<3; i++){
            xS[i]=(int)(x[i]*scX);
            yS[i]=(int)(y[i]*scY);
        }
        graphics.fillPolygon(xS,yS,3);
    }
    

    【讨论】:

    • 感谢您的回复。你的意思是在paintComponent中做这样的事情吗? int[] xScaled = x; int[] yScaled = y; for(int i = 0 ; i
    【解决方案2】:

    由于您正在处理多边形,最简单的解决方案是利用 API 的现有功能,通过使用 AffineTransform 来更改输出的比例

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class Main {
    
        public static void main(String[] args) {
            new Main();
        }
    
        public Main() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    MyTriangle shape = new MyTriangle(50, 100, 0, 0, 100, 100, 0, 0, 0);
                    JSlider slider = new JSlider(0, 400);
                    slider.setValue(100);
                    frame.add(shape);
                    frame.add(slider, BorderLayout.SOUTH);
    
                    slider.addChangeListener(new ChangeListener() {
                        @Override
                        public void stateChanged(ChangeEvent arg0) {
                            double value = slider.getValue() / 100d;
                            shape.setScale(value);
                        }
                    });
    
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class MyTriangle extends JPanel {
    
            int[] x;
            int[] y;
    
            double scX;
            double scY;
    
            public MyTriangle(int x1, int x2, int x3, int y1, int y2, int y3, int red, int green, int blue) {
                this.x = new int[]{x1, x2, x3};
                this.y = new int[]{y1, y2, y3};
                scX = 1;
                scY = 1;
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            public void setScale(double scale) {
                scX = scale;
                scY = scale;
                repaint();
            }
    
            @Override
            protected void paintComponent(Graphics graphics) {
                super.paintComponent(graphics);
                Graphics2D g2d = (Graphics2D) graphics.create();
                AffineTransform at = AffineTransform.getScaleInstance(scX, scY);
                g2d.setTransform(at);
                g2d.fillPolygon(x, y, 3);
                g2d.dispose();
            }
        }
    }
    

    我强烈建议您查看2D Graphics Tutorial 了解更多详情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多