所以我试图检索我将在JPanel上绘制的2D线的坐标。 getBounds()
方法似乎适用于rectangle2D
,但不适用于line2D.
。如何获取line2D的坐标并将它们放在变量中,就像我为下面的rectangle2D所做的那样:这是我的整个代码!
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Test extends JFrame {
private int len;
// public int getSizes(){
// return len;
//}
private static final long serialVersionUID = -140274271716086522L;
JMenuBar menubar;
JMenu File, Exit;
JMenuItem New, Open;
JComponent DrawingBoard;
JButton lineBut, ellipseBut, rectBut, strokeBut;
DecimalFormat dec = new DecimalFormat("#.##");
// Contains all of the rules for drawing
Graphics2D graphSettings;
// Going to be used to monitor what shape to draw next
int currentAction = 1;
// Transparency of the shape
// Default stroke and fill colors
Color strokeColor = Color.BLACK;
public static void main(String[] args) {
new Test();
}
public Test() {
// Define the defaults for the JFrame
this.setSize(800, 600);
this.setTitle("ERD BUILDER");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setJMenuBar(menubar);
JMenuBar menuBar = new JMenuBar();
// Add the menubar to the frame
setJMenuBar(menuBar);
// Define and add two drop down menu to the menubar
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu dbMenu = new JMenu("Database");
JMenu ToolsMenu = new JMenu("Tools");
JMenu HelpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(dbMenu);
menuBar.add(ToolsMenu);
menuBar.add(HelpMenu);
// Create and add simple menu item to one of the drop down menu
JMenuItem newAction = new JMenuItem("New Project");
JMenuItem openAction = new JMenuItem("Open File");
JMenuItem exitAction = new JMenuItem("Quit");
JMenuItem cutAction = new JMenuItem("Cut");
JMenuItem copyAction = new JMenuItem("Copy");
JMenuItem pasteAction = new JMenuItem("Paste");
JMenuItem UndoAction = new JMenuItem("Undo");
JMenuItem RedoAction = new JMenuItem("Redo");
JMenuItem clearAction = new JMenuItem("Clear");
JMenuItem saveAction = new JMenuItem("Save");
JMenuItem exportAction = new JMenuItem("Export");
JMenuItem printAction = new JMenuItem("Print");
JMenuItem ConvertAction = new JMenuItem("Convert To Tables");
JMenuItem ColorAction = new JMenuItem("Color Picker");
JMenuItem ZoomAction = new JMenuItem("Zoom");
JMenuItem EntityAction = new JMenuItem("Entity & Attributes");
JMenuItem RelationshipAction = new JMenuItem("Relationship Attributes");
JMenuItem HelpAction = new JMenuItem("Help");
JMenuItem AboutAction = new JMenuItem("About");
fileMenu.add(newAction);
fileMenu.addSeparator();
fileMenu.add(openAction);
fileMenu.addSeparator();
fileMenu.add(saveAction);
fileMenu.addSeparator();
fileMenu.add(exportAction);
fileMenu.addSeparator();
fileMenu.add(printAction);
fileMenu.addSeparator();
fileMenu.add(exitAction);
editMenu.add(UndoAction);
editMenu.addSeparator();
editMenu.add(RedoAction);
editMenu.addSeparator();
editMenu.add(cutAction);
editMenu.addSeparator();
editMenu.add(copyAction);
editMenu.addSeparator();
editMenu.add(pasteAction);
editMenu.addSeparator();
editMenu.add(clearAction);
dbMenu.add(ConvertAction);
ToolsMenu.add(ColorAction);
ToolsMenu.addSeparator();
ToolsMenu.add(ZoomAction);
ToolsMenu.addSeparator();
ToolsMenu.add(EntityAction);
ToolsMenu.addSeparator();
ToolsMenu.add(RelationshipAction);
HelpMenu.add(HelpAction);
HelpMenu.addSeparator();
HelpMenu.add(AboutAction);
exitAction.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}}
);
ConvertAction.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
new ConvertForm().setVisible(true);
}}
);
newAction.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
new Test().setVisible(true);
}
});
JPanel buttonPanel = new JPanel();
JPanel FieldPanel = new JPanel();
// Swing box that will hold all the buttons
Box theBox = Box.createVerticalBox();
Box theBoxs = Box.createVerticalBox();
// Make all the buttons in makeMeButtons by passing the
// button icon.
lineBut = makeMeButtons("./src/line.png", 2);
ellipseBut = makeMeButtons("./src/ellipse.png", 3);
rectBut = makeMeButtons("./src/rectangle.png", 4);
// Make all the buttons in makeMeColorButton by passing the
// button icon and true for stroke color or false for fill
strokeBut = makeMeColorButton("./src/stroke.png", 5, true);
// Add the fields to the boxs
//theBox.add(brushBut);
theBox.add(lineBut);
theBox.add(ellipseBut);
theBox.add(rectBut);
theBox.add(strokeBut);
buttonPanel.add(theBox);
FieldPanel.add(theBoxs);
this.add(buttonPanel, BorderLayout.WEST);
this.add(FieldPanel, BorderLayout.EAST);
buttonPanel.setPreferredSize(new Dimension(200,480));
FieldPanel.setPreferredSize(new Dimension(200,480));
// Make the drawing area take up the rest of the frame
// this.add(new DrawingBoard(), BorderLayout.CENTER);
final DrawingBoard drawPanel = new DrawingBoard();
this.add(drawPanel, BorderLayout.CENTER);
this.getContentPane().setBackground(Color.WHITE);
exportAction.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
BufferedImage image = new BufferedImage(drawPanel.getWidth(),
drawPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
drawPanel.paint(g);
g.dispose();
JFileChooser fileChooser = new JFileChooser();
File theDirectory = new File("C:/Users/Wenda/Desktop");
fileChooser.setCurrentDirectory(theDirectory);
FileNameExtensionFilter pngFilter = new FileNameExtensionFilter(
"PNG file (*.png)", "png");
fileChooser.addChoosableFileFilter(pngFilter);
fileChooser.setFileFilter(pngFilter);
int status = fileChooser.showSaveDialog(Test.this);
if (status == JFileChooser.APPROVE_OPTION) {
try {
ImageIO.write(image, "png",
fileChooser.getSelectedFile());
JOptionPane.showMessageDialog(null, "Image saved to "
+ fileChooser.getSelectedFile().getName());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
// Show the frame
this.setVisible(true);
}
public JButton makeMeButtons(String iconFile, final int actionNum) {
JButton theBut = new JButton();
Icon butIcon = new ImageIcon(iconFile);
theBut.setIcon(butIcon);
theBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentAction = actionNum;
}
});
return theBut;
}
// Spits out buttons based on the image supplied and
// whether a stroke or fill is to be defined
public JButton makeMeColorButton(String iconFile, final int actionNum,
final boolean stroke) {
JButton theBut = new JButton();
Icon butIcon = new ImageIcon(iconFile);
theBut.setIcon(butIcon);
theBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (stroke) {
// JColorChooser is a popup that lets you pick a color
strokeColor = JColorChooser.showDialog(null,
"Pick a Stroke", Color.BLACK);
} else {
}
}
});
return theBut;
}
public class DrawingBoard extends JComponent {
private static final long serialVersionUID = -4431176095451940075L;
// ArrayLists that contain each shape drawn along with
// that shapes stroke and fill
ArrayList<Shape> shapes = new ArrayList<Shape>();
ArrayList<Color> shapeStroke = new ArrayList<Color>();
ArrayList<Integer> count = new ArrayList<Integer>();
Point drawStart, drawEnd;
// Monitors events on the drawing area of the frame
public DrawingBoard() {
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (currentAction != 1) {
// When the mouse is pressed get x & y position
drawStart = new Point(e.getX(), e.getY());
drawEnd = drawStart;
repaint();
}
}
public void mouseReleased(MouseEvent e) {
int counts =0;
if (currentAction != 1) {
Shape aShape = null;
if (currentAction == 2) {
aShape = drawLine(drawStart.x, drawStart.y,
e.getX(), e.getY());
shapes.add(aShape);
int var = shapes.size();
System.out.println("Array index"+var);
shapeStroke.add(strokeColor);
drawStart = null;
drawEnd = null;
repaint();
} else
if (currentAction == 4) {
boolean collision = false;
// Create a new rectangle using x & y coordinates
aShape = drawRectangle(drawStart.x, drawStart.y,
e.getX(), e.getY());
shapes.add(aShape);
//returns the coordinates of each rectangle
//System.out.println(aShape);
int var = shapes.size();
System.out.println("Array index"+var);
if(var>1){
//look for collisions between shapes
for(int i=0;i<var-1;i++){
Shape st = shapes.get(var-1);
Shape s = shapes.get(i);
double x = (s.getBounds2D().getX());
double y = (s.getBounds2D().getY());
double w = (s.getBounds2D().getWidth());
double h = (s.getBounds2D().getHeight());
Line2D.Float l = (Line2D.Float)s;
double x1 = (l.getX1());
double y1 = (l.getY1());
double x2 = (l.getX2());
double y2 = (l.getY2());
System.out.println(x1+" , "+x2+" , "+y1+" , "+y2);
if(st.intersects(x+7, y+7, w+7, h+7)){
collision = true;
System.out.println("it collides with "+i);
}
else{
collision = false;
System.out.println("NO COLLISION with " +i);
}
}
}
shapeStroke.add(strokeColor);
drawStart = null;
drawEnd = null;
repaint();
//new EntityForm().setVisible(true);
}
}
}
});
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
JTextField name = new JTextField(15);
super.mouseClicked(me);
for (Shape s : shapes) {
if (s.contains(me.getPoint())) {//check if mouse is clicked within shape
//we can either just print out the object class name
System.out.println("Clicked a "+s.getClass().getName());
//or check the shape class we are dealing with using instance of with nested if
if (s instanceof Rectangle2D) {
//create table
}
else if (s instanceof Ellipse2D) {
}
}
}
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
// If this is a brush have shapes go on the screen quickly
if (currentAction == 1) {
int x = e.getX();
int y = e.getY();
Shape aShape = null;
shapes.add(aShape);
shapeStroke.add(strokeColor);
// Add the transparency value
}
// Get the final x & y position after the mouse is dragged
drawEnd = new Point(e.getX(), e.getY());
repaint();
}
});
}
public void paint(Graphics g) {
// Class used to define the shapes to be drawn
graphSettings = (Graphics2D) g;
// Antialiasing cleans up the jagged lines and defines rendering
// rules
graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// Defines the line width of the stroke
graphSettings.setStroke(new BasicStroke(4));
// Iterators created to cycle through strokes and fills
Iterator<Color> strokeCounter = shapeStroke.iterator();
for (Shape s : shapes) {
// Grabs the next stroke from the color arraylist
graphSettings.setPaint(strokeCounter.next());
graphSettings.draw(s);
}
// Guide shape used for drawing
if (drawStart != null && drawEnd != null) {
// Makes the guide shape transparent
graphSettings.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.40f));
// Make guide shape gray for professional look
graphSettings.setPaint(Color.LIGHT_GRAY);
Shape aShape = null;
if (currentAction == 2) {
aShape = drawLine(drawStart.x, drawStart.y, drawEnd.x,
drawEnd.y);
} else
if (currentAction == 4) {
aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x,
drawEnd.y);
}
graphSettings.draw(aShape);
}
}
private Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) {
// Get the top left hand corner for the shape
// Math.min returns the points closest to 0
int x = Math.min(x1, x2);
int y = Math.min(y1, y2);
// Gets the difference between the coordinates and
int width = Math.abs(x1 - x2);
int height = Math.abs(y1 - y2);
return new Rectangle2D.Float(x, y, width, height);
}
private Line2D.Float drawLine(int x1, int y1, int x2, int y2) {
return new Line2D.Float(x1, y1, x2, y2);
}
}
}
答案 0 :(得分:1)
使用pathIterator遍历形状并获取形成形状及其顶点的线段。
final float[] coords = new float[n];
while (!iterator.isDone()) {
iterator.currentSegment(coords );
float x = coords [0];
float y = coords [1];
// TODO your stuff
iterator.next();
}
答案 1 :(得分:0)
你可以使用
getX1();
getX2();
和
getY1()
getY2()
获取x1,y1
和x2,y2
坐标.2d line没有宽度和高度。在这里api
更新
假设你有一个第2行的形状
Shape s = new Line2D.Float(1, 2, 200, 200);
现在你想获得(x1,y1,x2,y2)
然后使用
Shape s = new Line2D.Float(1, 2, 200, 200);
Line2D.Float l1 = (Line2D.Float) s;
double x1 = (l1.getX1());
double y1 = (l1.getY1());
double x2 = (l1.getX2());
double y2 = (l1.getY2());
System.out.println(x1+" , "+x2+" , "+y1+" , "+y2);
答案 2 :(得分:0)
在你的类中实现mouseListener接口,并覆盖mouseClicked(),就像这样,
//define x,y as class members
int x=0;
int y=0;
public void mouseClicked(MouseEvent me){
x=me.getX();
y=me.getY();
System.out.println("x:"+x+"Y:"+y);
}
点击你的JPanel中显示的线条形状,用鼠标按钮克隆JPanel,坐标将显示在你的控制台上。