我需要制作一个绘制三角形的代码。然后用户将单击三角形的内部或外部。并显示一个对话框,如果是,则“点击在三角形内”。
我有绘制三角形的代码,这里是代码,现在该做什么。我不知道。如果有人帮助那么请。
我尝试过轴基,但我没有得到所需的结果。
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(new Line2D.Double (150, 200, 200, 100));
g2.draw(new Line2D.Double (100, 100, 150, 200));
g2.draw(new Line2D.Double (100, 100, 200, 100));
}
输出在这里。
答案 0 :(得分:2)
Shape
类是你想要使用的。不是手动绘制三角形(每行包含单独的draw
语句),而是创建表示三角形的Shape
对象。 Polygon
足以创建三角形。
不是更改JFrame的绘画,而是设置自定义绘制的面板并将其添加到框架中更好。
public class YourFrame extends JFrame { //Replace with your class name, obviously
public YourFrame(){
//Create and add trianglePanel
setLayout(new BorderLayout());
add(new TrianglePanel(), BorderLayout.CENTER);
pack();
repaint();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
class TrianglePanel extends JPanel implements MouseListener{
private Polygon triangle;
public TrianglePanel(){
//Create triangle
triangle = new Polygon();
triangle.addPoint(150, 200);
triangle.addPoint(100, 100);
triangle.addPoint(200, 100);
//Add mouse Listener
addMouseListener(this);
//Set size to make sure that the whole triangle is shown
setPreferredSize(new Dimension(300, 300));
}
/** Draws the triangle as this frame's painting */
public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D)g;
g2d.draw(triangle);
}
//Required methods for MouseListener, though the only one you care about is click
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
/** Called whenever the mouse clicks.
* Could be replaced with setting the value of a JLabel, etc. */
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
if(triangle.contains(p)) System.out.println("Triangle contains point");
else System.out.println("Triangle Doesn't contain point");
}
}
}
答案 1 :(得分:0)
在@Mshink
的帮助下的最终代码 public class Triangle_shape extends JFrame {
/**
* @param args the command line arguments
*/
public Triangle_shape(){
//Create and add trianglePanel
// setVisible(true);
// setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
// TODO code application logic here
TrianglePanel t= new TrianglePanel();
JFrame frame = new JFrame ();
final int FRAME_WIDTH = 500;
final int FRAME_HEIGHT = 500;
frame.setSize (FRAME_WIDTH, FRAME_HEIGHT);
frame.setLayout(new BorderLayout());
frame.add(t);
// frame.add(new TrianglePanel(), BorderLayout.CENTER);
frame.pack();
frame.repaint();
frame.setTitle("A Test Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static class TrianglePanel extends JPanel implements MouseListener{
private Polygon triangle;
public TrianglePanel(){
//Create triangle
triangle = new Polygon();
triangle.addPoint(150, 200);
triangle.addPoint(100, 100);
triangle.addPoint(200, 100);
//Add mouse Listener
addMouseListener(this);
//Set size to make sure that the whole triangle is shown
setPreferredSize(new Dimension(300, 300));
}
/** Draws the triangle as this frame's painting */
public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D)g;
g2d.draw(triangle);
}
//Required methods for MouseListener, though the only one you care about is click
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
/** Called whenever the mouse clicks.
* Could be replaced with setting the value of a JLabel, etc. */
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
if(triangle.contains(p)) System.out.println("Triangle contains point");
else System.out.println("Triangle Doesn't contain point");
}
}
}
答案 2 :(得分:-1)
这应该可以胜任。它不是最好的选择,也不是性能最好的选择,但它确实有效。
// The main class which makes the frame and adds the necessary stuff
class Mainclass {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(400,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CPanel panel = new CPanel();
// I like colours
panel.setBackground(new Color(255,255,255,255));
frame.add(panel);
frame.addMouseListener(new Mouse(panel));
frame.setVisible(true);
}
}
// The MouseListener which checks if the mouse is clicked
class Mouse implements MouseListener {
CPanel panel;
public Mouse(CPanel panel) {
this.panel=panel;
}
@Override
public void mouseClicked(MouseEvent e) {
int x=e.getX();
int y=e.getY();
boolean inside=false;
ArrayList<Integer> Ys = panel.coordinates.get(x);
if(Ys != null) {
if(panel.coordinates.get(x).contains(y)) {
inside=true;
}
}
if(inside) {
System.out.println("You clicked in the triangle");
} else {
System.out.println("You clicked out of the triangle");
}
}
@Override public void mousePressed (MouseEvent e) {}
@Override public void mouseReleased (MouseEvent e) {}
@Override public void mouseEntered (MouseEvent e) {}
@Override public void mouseExited (MouseEvent e) {}
}
// The panel
class CPanel extends JPanel {
public int minX=100;
public int maxX=200;
public int minY=100;
public int maxY=200;
// All the pixels in the triangle
HashMap<Integer, ArrayList<Integer>> coordinates = new HashMap<Integer, ArrayList<Integer>>();
public void paintComponent(Graphics G) {
super.paintComponent(G);
/** For that one downvoter: I made it G2D, even though it makes no difference **/
Graphics2D g = (Graphics2D) G;
// Drawing a centered triangle
int xCen=(int)Math.round((minX+maxX)/2.0);
// I like colours
g.setColor(new Color(0,0,255,128));
for(int y=0; y<=maxY-minY; y++) {
int x0=xCen-y;
int x1=xCen+y;
int y0=y+minY;
for(int x=x0; x<=x1; x++) {
// Adding all pixels in this row to 'coordinates'
ArrayList<Integer> Ys = coordinates.get(x);
if(Ys==null) {
coordinates.put(x, new ArrayList<Integer>());
Ys = coordinates.get(x);
}
Ys.add(y0);
coordinates.put(x, Ys);
}
// Draw the row
g.drawLine(x0,y0,x1,y0);
}
// Output the coordinates for debugging purposes
System.out.println(coordinates);
}
}
同样,如果你想要性能更好的东西,不要使用它。