这是我项目的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 上询问之外。
您的比例值不是您所期望的,因为 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(...) 方法按比例因子移动绘画。