Ciao ragazzi, ho un piccolo problemino...
Sto sviluppando un'applicazione che permetta di utilizzare i diagrammi di Eulero (non sto qui a spiegarvi i motivi), quindi ho la necessità di consentire all'utente di disegnare una serie di ellissi in modo dinamico, ossia tramite trascinamento del mouse.
Ho scritto una classe che funziona correttamente, ossia è possibile disegnare ellissi seguendo il movimento del mouse; la questione è che le ellissi vengono disegnate solo orizzontalmente e verticalmente, mentre dovrebbe esserci un modo per far si che l'ellissi che si sta disegnando ruoti in modo dinamico, ossia muovendo il mouse in modo circolare.
Vi posto la classe che ho scritto, in modo che possiate avere un'idea:
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
public class DrawingOperations extends JPanel {
private static final long serialVersionUID = 1L;
//private boolean isSelected = false;
private String notSel = "Nessun diagramma selezionato!";
private ArrayList<Shape> shapes;
private Point startDrag, endDrag;
private JPopupMenu popMenu;
private JMenuItem pRename;
private JMenuItem pChangeColor;
private JMenuItem pDelete;
private JSeparator sep1;
private JSeparator sep2;
private FunEuler4Test euler;
public DrawingOperations(FunEuler4Test eul) {
//Inizializzazione componenti
euler = eul;
shapes = new ArrayList<Shape>();
popMenu = new JPopupMenu();
pRename = new JMenuItem();
pChangeColor = new JMenuItem();
pDelete = new JMenuItem();
sep1 = new JSeparator();
sep2 = new JSeparator();
drawingOperationsSet();
}
//settaggio disegno ed eventi associati
private void drawingOperationsSet(){
setPopMenu();
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt){
drawMousePressed(evt);
}
public void mouseReleased(MouseEvent evt){
drawMouseReleased(evt);
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent evt) {
drawMouseDragged(evt);
}
});
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt){
popMousePressed(evt);
}
public void mouseReleased(MouseEvent evt){
popMouseReleased(evt);
}
});
}
public void draw(){
JFrame drawingFrame = new JFrame();
drawingFrame.setSize((euler.windowWidth - 170), (euler.windowHeight - 77));
drawingFrame.setLocation(150, 65);
drawingFrame.setTitle("Drawing Area");
drawingFrame.setVisible(true);
drawingFrame.setResizable(false);
drawingFrame.add(this);
repaint();
}
//settaggio menu popUp associato ad ogni diagramma
private void setPopMenu(){
pRename.setText("Rinomina");
pRename.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(euler.jPanelButtons, notSel, "Informazione",
JOptionPane.INFORMATION_MESSAGE,
new ImageIcon("info.png"));
}
});
pChangeColor.setText("Cambia colore");
pChangeColor.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
Color oldColor = JColorChooser.showDialog(euler.jPanelButtons,
"Choose color", euler.jPanelButtons.getBackground());
if (oldColor != null)
euler.jPanelButtons.setBackground(oldColor);
repaint();
}
});
pDelete.setText("Cancella");
pDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(euler.eulerWindow, notSel, "Informazione",
JOptionPane.INFORMATION_MESSAGE,
new ImageIcon("info.png"));
}
});
popMenu.add(pRename);
popMenu.add(sep1);
popMenu.add(pChangeColor);
popMenu.add(sep2);
popMenu.add(pDelete);
}
//MousePremuto: calcolo punti per il disegno
public void drawMousePressed(MouseEvent e) {
startDrag = new Point(e.getX(), e.getY());
endDrag = startDrag;
repaint();
}
//MouseRilasciato: Definizione figura disegnata
public void drawMouseReleased(MouseEvent e) {
Shape r = makeEllipse(startDrag.x, startDrag.y, e.getX(), e.getY());
shapes.add(r);
startDrag = null;
endDrag = null;
repaint();
}
//MouseTrascinato: calcolo dinamico nuove dimensioni
public void drawMouseDragged(MouseEvent e) {
endDrag = new Point(e.getX(), e.getY());
repaint();
}
public void popMousePressed(MouseEvent evt) {
if(evt.isPopupTrigger()){
popMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
public void popMouseReleased(MouseEvent evt) {
if(evt.isPopupTrigger()){
popMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASIN G, RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK,
Color.GRAY, Color.GREEN, Color.BLACK, Color.ORANGE, Color.WHITE};
int colorIndex = 0;
g2.setStroke(new BasicStroke(2));
g2.setComposite(AlphaComposite.getInstance(AlphaCo mposite.SRC_OVER, 0.50f));
for (Shape s : shapes) {
g2.setPaint(Color.BLACK);
g2.draw(s);
g2.setPaint(colors[(colorIndex++) % 11]);
g2.fill(s);
}
if (startDrag != null && endDrag != null) {
g2.setPaint(Color.LIGHT_GRAY);
Shape r = makeEllipse(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
g2.draw(r);
}
}
private Ellipse2D.Float makeEllipse(int x1, int y1, int x2, int y2) {
return new Ellipse2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
A me interessa sapere come far ruotare un'ellisse durante il trascinamento; ho provato con AffineTransform, ma ho ottenuto come risultato la rotazione del disegno solamente al rilascio del mouse (non so se sono io ad usare male la classe, o non è questo il modo giusto :/)
Spero che qualcuno possa aiutarmi, grazie in anticipo a chi risponderà!!
Ciao!


Rispondi quotando