【发布时间】:2013-01-10 06:49:33
【问题描述】:
我正在尝试创建一个面板,我可以在其中放大自定义 JComponent 对象。
我曾尝试用不同的值调用AffineTransform 类中的scale() 方法,但没有成功。我的对象就消失了。
下面是我在主框架类中使用的组件。除缩放外,一切正常。你们中的一些人能否解释一下 AffineTransform 的概念。我认为 JavaDoc explenation 对我来说还不够。
这是一个可执行的 SSCCE:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.AffineTransform;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class JavaApplication1 extends JFrame {
public static void main(String[] args) {
new JavaApplication1();
}
private MyComponent myComponent = new MyComponent();
public JavaApplication1() throws HeadlessException {
this.setSize(400,400);
this.setVisible(true);
this.add(myComponent);
}
class MyComponent extends JComponent {
private int x, y;
private double scale=1;
private MouseAdapter mouseAdapter = new MouseAdapter();
private AffineTransform transform = new AffineTransform();
public MyComponent() {
this.addMouseListener(mouseAdapter);
this.addMouseWheelListener(mouseAdapter);
this.addMouseMotionListener(mouseAdapter);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.DARK_GRAY);
g2.fillRect(0, 0, 400, 400);
g2.setColor(Color.RED);
g2.setTransform(transform);
transform.scale(scale, scale);
g2.drawString("My String!", x, y);
}
private class MouseAdapter implements MouseWheelListener, MouseListener, MouseMotionListener {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if(e.getWheelRotation() == 1) {
scale+=0.1;
}else {
scale-=0.1;
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
}
}
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
看看
JLayer(JXLayer有能力使用 PBJar 的扩展库来做到这一点,将这些相同的技术应用于JLayer应该不是不可能的)。您还应该致电super.paintComponent。您还有许多其他考虑因素,包括缩放组件的大小(或首选大小) -
@AndrewThompson:好的,我现在用 SSCCE 更新了我的帖子。
-
请注意,
new AffineTransform()为您提供 identity transformation。
标签: java swing zooming affinetransform