2012-04-10 82 views
2

我的程序涉及绘制三角形,我点击它们。根据比例因子变换鼠标坐标 - java swing

有两个类,Ecad和Line类。 Ecad是主框架,Line类用于绘制线条。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
public class Ecad extends JFrame implements MouseListener{ 
    ArrayList<Line2> lines=new ArrayList(); 
    public Ecad(){ 
     this.setVisible(true); 
     this.setSize(600,400); 
     this.addMouseListener(this); 
    } 
    public void mouseReleased(MouseEvent me){ 
     Point p1,p2,p3; 
     int X=me.getX(); 
     int Y=me.getY(); 
     p1=new Point(X,Y);              
     p2=new Point((int)(p1.getX()-100),(int)(p1.getY()+(1.732/2*200))); 
     p3=new Point((int)(p1.getX()+100),(int)(p1.getY()+(1.732/2*200)));           
     Line2 l1=new Line2(p2,p1); 
     Line2 l2=new Line2(p1,p3); 
     Line2 l3=new Line2(p2,p3); 
     lines.add(l1); 
     lines.add(l2); 
     lines.add(l3); 
     this.repaint(); 
    } 
    public void mouseClicked(MouseEvent me){ 

    } 
    public void mouseExited(MouseEvent me){ 

    } 
    public void mouseEntered(MouseEvent me){ 

    } 
    public void mousePressed(MouseEvent me){ 
    } 
    public void mouseMoved(MouseEvent me){ 

    } 
    public static void main(String args[]){ 
     new Ecad(); 
    } 
    public void paint(Graphics g){ 
     Graphics2D g2=(Graphics2D)g; 
     super.paintComponents(g2); 
     //g2.scale(0.5, 0.5); 
     for(final Line2 r:lines){ 
      r.paint((Graphics2D)g2); 
     } 
    } 
} 

这是行级

import java.awt.*; 
public class Line2 { 
    Point start,end; 
    public Line2(Point a,Point b){  
     start=a; 
     end=b; 
    } 
    public void paint(Graphics2D g){ 
     g.drawLine((int)start.getX(),(int)start.getY(),(int)end.getX(),(int)end.getY()); 
    } 

} 

在ECAD类的paint()方法,如果我使用缩放选项来放大或缩小,鼠标坐标没有得到转化。所以在缩放之后,如果我点击某一点,三角形就会被放置在其他点上。有什么方法来改变鼠标坐标,以及当我缩放图形组件?

+0

不确定你的主要问题,但你的绘图都是错误的。您不应该直接在JFrame的paint(...)方法中绘制,而应该使用JComponent的paintComponent(...)方法(或JComponent的子例如JPanel)。然后你会称之为真正的超级方法。我不知道你为什么要调用'super.paintComponents(...)'。 – 2012-04-10 20:37:56

+0

我没有在我的真实程序中绘制JFrame。我在JPanel中做过。我想关注这个缩放问题,所以在这个例子中跳过了JPanel的创建。当我在正常范围内点击鼠标时,三角形被放置在我想要的位置。但是,如果我将比例设置为0.5,则三角形不会放在我点击的位置。尝试运行程序设置不同的比例因子。你会明白的。 – 2012-04-10 20:42:40

+0

您需要使用一个简单的几何图形来根据比例和固定点(这里是三角形的顶点)为每个三角形形状转换Graphics2D对象。 – 2012-04-10 21:39:23

回答

2

同样,你应该使用比例尺和一个固定点来转换你绘制的形状(这里似乎每个形状的固定点会是三角形的顶点,但它可能是中心应该你这样决定,翻译是基于简单的几何原则,将是fixedPoint.x *(1-scale)/ scale,并且y翻译也是一样的。

例如(并且这个使用JPanel作为你上面的例子应该):

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.*; 
import java.util.List; 

class EcadB extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 600; 
    private List<MyShape> myShapes = new ArrayList<MyShape>(); 
    private double scale = 1.0; 
    private JSlider slider = new JSlider(0, 200, 100); 

    public EcadB() { 
     addMouseListener(new MyMouseAdapter()); 
     setLayout(new BorderLayout()); 

     slider.setOpaque(false); 
     slider.setMajorTickSpacing(20); 
     slider.setMinorTickSpacing(10); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 
     slider.addChangeListener(new SliderChangeListener()); 
     add(slider, BorderLayout.SOUTH); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     Graphics2D g2b = (Graphics2D)g2.create(); 
     g2b.scale(scale, scale); 
     for (MyShape myShape : myShapes) { 
     myShape.draw(g2b, scale); 
     } 
     g2b.dispose(); 
    } 

    public void setScale(double scale) { 
     this.scale = scale; 
     repaint(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent e) { 
     Point2D p1 = e.getPoint(); 
     Point2D p2 = new Point((int) (p1.getX() - 100), 
       (int) (p1.getY() + (1.732/2 * 200))); 
     Point2D p3 = new Point((int) (p1.getX() + 100), 
       (int) (p1.getY() + (1.732/2 * 200))); 
     Path2D path = new Path2D.Double(); 
     path.moveTo(p1.getX(), p1.getY()); 
     path.lineTo(p2.getX(), p2.getY()); 
     path.lineTo(p3.getX(), p3.getY()); 
     path.lineTo(p1.getX(), p1.getY()); 

     myShapes.add(new MyShape(path, p1)); 
     repaint(); 
     } 
    } 

    private class SliderChangeListener implements ChangeListener { 
     @Override 
     public void stateChanged(ChangeEvent arg0) { 
     double value = slider.getValue()/100.0; 
     setScale(value); 
     } 
    } 

    public static void main(String args[]) { 
     // new Ecad(); 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      EcadB ecadB = new EcadB(); 
      JFrame frame = new JFrame("Scale"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.getContentPane().add(ecadB); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     }); 
    } 
} 

class MyShape { 
    Shape shape; 
    Point2D fixedPoint; 

    public MyShape(Shape shape, Point2D fixedPoint) { 
     this.shape = shape; 
     this.fixedPoint = fixedPoint; 
    } 

    public void draw(Graphics2D g2, double scale) { 
     Graphics2D g2b = (Graphics2D) g2.create(); 
     double tx = fixedPoint.getX() * (1.0 - scale)/scale; 
     double ty = fixedPoint.getY() * (1.0 - scale)/scale; 
     g2b.translate(tx, ty); 
     g2b.draw(shape); 
     g2b.dispose(); 
    } 
} 

请注意,我转换它们之前,我的图形对象的副本,以便没有tra nsform影响可能由Graphic对象绘制的其他对象。例如,如果您摆脱了在JPanel的paintComponent(...)方法中使用的Graphics2D副本,则会发现JSlider会与其他所有内容一起缩放。

+0

谢谢!这个想法很有效,但我修改了一些几何计算。但另一个问题是,我在三角形的终点创建JLabel,并使用mouseListener作为标签。由于绘图由于缩放而移位,因此我无法获取标签的鼠标事件。我们如何解决这个问题?如果我添加一个JScrollPane,它也不会更新滚动条.. – 2012-04-11 09:18:56

+0

@SivaSubramaniam:让我们不要过多地转移需求,我认为你的问题应该是你的下一个关于堆栈溢出的问题,因为我认为这个帖子在上面以足够的细节和足够的努力回答了您的原始问题。 – 2012-04-11 11:47:42

+0

感谢兄弟!我会努力工作! – 2012-04-11 12:04:42