我的正弦图在缩小时不会继续,但在使应用程序窗口变长时会继续,不确定它在哪里

问题描述 投票:0回答:1

Before Zooming Out After Zooming Out When making the window longer it carries on on the left

这是我项目的JPanel。

package SineWave;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Line2D;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class SineWave extends JPanel implements MouseWheelListener {
    private double scale = 1.0;

    public SineWave() {
        addMouseWheelListener(this);
        
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        double xScale = getWidth() / 2 * scale;
        double yScale = getHeight() / 2 * scale;
        g2.draw(new Line2D.Double(0, getHeight() / 2 * scale, getWidth(), getHeight() / 2 * scale));
        g2.draw(new Line2D.Double(getWidth() / 2 * scale, 0, getWidth() / 2 * scale, getHeight()));
        g2.setColor(Color.BLUE);
        double x, y, oldx = 0, oldy = getHeight() / 2;
        for (x = 0; x <= getWidth(); x += 0.1) {
            y = getHeight() / 2 - Math.sin((x - getWidth() / 2) / 100) * 100;
            g2.draw(new Line2D.Double(oldx * scale, oldy * scale, x * scale, y * scale));
            oldx = x;
            oldy = y;
        }
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        
        
        
        if (e.getWheelRotation() < 0) {
            
            scale *= 1.1;
        } else {
            scale /= 1.1;
        }
        repaint();
    }
}

这是我项目的 JFrame。

package SineWave;

import javax.swing.JFrame;

public class MyFrame extends JFrame{
    MyFrame(){
        this.setSize(500, 500);
        SineWave wave = new SineWave();
        this.add(wave);
        this.setVisible(true);
    }

}

我尝试查看油漆组件,但不确定哪里出了问题以及解决方案是什么,轴也没有居中。我尝试进行编辑,但它只是让杯子变得奇怪并停止绘制。

我也尝试过要求 AI 找出问题所在,但无法给出一个有用的答案,除了在 stackoverflow 上询问之外。

java swing jframe paintcomponent
1个回答
0
投票

您的比例值不是您所期望的,因为 MouseWheelListener 没有按您期望的方式工作。

尝试下面的代码:

public void mouseWheelMoved(MouseWheelEvent e) {

    System.out.println( e.getWheelRotation() );

    if (e.getWheelRotation() == 0) return;

    if (e.getWheelRotation() < 0) {
        scale *= 1.1;
    } else {
        scale /= 1.1;
    }

    repaint();
}

您会看到旋转在 1 或 -1 之前多次为 0,因此您的 else 条件被执行多次,导致比例因子减小。

轴也不居中。

您正在更改比例,因此我相信您还需要使用 Graphics.translate(...) 方法按比例因子移动绘画。

© www.soinside.com 2019 - 2024. All rights reserved.