亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Swing如何縮放三角形

Java Swing如何縮放三角形

長風秋雁 2022-10-26 17:12:34
當我更改窗口大小時,我想繪制一些隨機三角形并縮放它們。我有一個單獨的類MyTriangle擴展MyShape. 我也有兩個變量:scaleX和scaleY. 每當我嘗試將三角形x和y值相乘并更改窗口大小時,三角形就會變得瘋狂并突然消失。當我嘗試寫作時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);    }我應該怎么做才能讓它工作?像這樣的縮放適用于矩形和橢圓形。
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

每次繪制時都會縮放它。因此,如果在您進行縮放后比例因子沒有設置為 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);

}


查看完整回答
反對 回復 2022-10-26
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

由于您正在處理多邊形,因此最簡單的解決方案是利用 API 的現有功能,通過使用 aAffineTransform來更改輸出的比例

https://i.stack.imgur.com/e2vLR.gif

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 圖形教程以獲取更多詳細信息



查看完整回答
反對 回復 2022-10-26
  • 2 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號