在学习了循环,数组,方法之后,…我开始玩图形游戏,但是遇到了一些问题.看到以下示例时,我正在寻找一些示例:http://javaceda.blogspot.ch/2010/06/draw-cartesian-coordinate-system-in.html
它提供了Java笛卡尔平面的示例.我几乎可以理解该代码的所有内容(除了一些行,例如invokelater,SwingUtilities,稍后我将对其进行介绍..).
假设现在我要用构造函数,getter,将点的笛卡尔坐标转换为“像素坐标”的方法以及在平面上打印该点的方法来创建“点”类.
因此,这是从链接中获取的代码:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Cartesian {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
CartesianFrame frame = new CartesianFrame();
frame.showUI();
}
});
}
}
class CartesianFrame extends JFrame {
CartesianPanel panel;
public CartesianFrame() {
panel = new CartesianPanel();
add(panel);
}
public void showUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Cartesian");
setSize(700, 700);
setVisible(true);
}
}
class CartesianPanel extends JPanel {
// x-axis coord constants
public static final int X_AXIS_FIRST_X_COORD = 50;
public static final int X_AXIS_SECOND_X_COORD = 600;
public static final int X_AXIS_Y_COORD = 600;
// y-axis coord constants
public static final int Y_AXIS_FIRST_Y_COORD = 50;
public static final int Y_AXIS_SECOND_Y_COORD = 600;
public static final int Y_AXIS_X_COORD = 50;
//arrows of axis are represented with "hipotenuse" of
//triangle
// now we are define length of cathetas of that triangle
public static final int FIRST_LENGHT = 10;
public static final int SECOND_LENGHT = 5;
// size of start coordinate lenght
public static final int ORIGIN_COORDINATE_LENGHT = 6;
// distance of coordinate strings from axis
public static final int AXIS_STRING_DISTANCE = 20;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// x-axis
g2.drawLine(X_AXIS_FIRST_X_COORD, X_AXIS_Y_COORD,
X_AXIS_SECOND_X_COORD, X_AXIS_Y_COORD);
// y-axis
g2.drawLine(Y_AXIS_X_COORD, Y_AXIS_FIRST_Y_COORD,
Y_AXIS_X_COORD, Y_AXIS_SECOND_Y_COORD);
// draw origin Point
g2.fillOval(
X_AXIS_FIRST_X_COORD - (ORIGIN_COORDINATE_LENGHT / 2),
Y_AXIS_SECOND_Y_COORD - (ORIGIN_COORDINATE_LENGHT / 2),
ORIGIN_COORDINATE_LENGHT, ORIGIN_COORDINATE_LENGHT);
// numerate axis
int xCoordNumbers = 10;
int yCoordNumbers = 10;
int xLength = (X_AXIS_SECOND_X_COORD - X_AXIS_FIRST_X_COORD)
/ xCoordNumbers;
int yLength = (Y_AXIS_SECOND_Y_COORD - Y_AXIS_FIRST_Y_COORD)
/ yCoordNumbers;
// draw x-axis numbers
for(int i = 1; i < xCoordNumbers; i++) {
g2.drawLine(X_AXIS_FIRST_X_COORD + (i * xLength),
X_AXIS_Y_COORD - SECOND_LENGHT,
X_AXIS_FIRST_X_COORD + (i * xLength),
X_AXIS_Y_COORD + SECOND_LENGHT);
g2.drawString(Integer.toString(i),
X_AXIS_FIRST_X_COORD + (i * xLength) - 3,
X_AXIS_Y_COORD + AXIS_STRING_DISTANCE);
}
//draw y-axis numbers
for(int i = 1; i < yCoordNumbers; i++) {
g2.drawLine(Y_AXIS_X_COORD - SECOND_LENGHT,
Y_AXIS_SECOND_Y_COORD - (i * yLength),
Y_AXIS_X_COORD + SECOND_LENGHT,
Y_AXIS_SECOND_Y_COORD - (i * yLength));
g2.drawString(Integer.toString(i),
Y_AXIS_X_COORD - AXIS_STRING_DISTANCE,
Y_AXIS_SECOND_Y_COORD - (i * yLength));
}
}
}
这是我要添加的类Point:
class Point{
public int x,y;
public Point(int x,int y){
this.x=x;
this.y=y;
}
public Point FromCartToPix() {
this.x=X_AXIS_FIRST_X_COORD+(x*xLength);
this.y=Y_AXIS_SECOND_Y_COORD - (y * yLength);
return this;
}
public int GetX(){
return this.x;
}
public int GetY(){
return this.y;
}
public void DrawPoint(){
g2.fillOval(
this.FromCartToPix().Getx(),
this.FromCartToPix().Gety(),
ORIGIN_COORDINATE_LENGHT, ORIGIN_COORDINATE_LENGHT);
}
}
我拥有的Java手册仅有一小章关于Java图形和Swing,因此我无法实现此类.我认为应该将其插入
PaintComponent(Graphics g)
否则我将无法使用
g2.filloval
但后来我无法使用
Point a = new Point (2,3);
内部主要
我知道这是一个模糊且笼统的问题,但我无法使其正常工作.我搜索了很多有关Graphics2D g2 =(Graphics2D)g的用法,但是即使在Javadocs上也找不到精确的解释.
如果您知道一个解释它的链接,我将不胜感激
提前致谢
解决方法:
您的Point类无法访问CartesianPanel的Graphics2D对象.
您应该将FromCartToPix和DrawPoint方法的功能移至CartesionPanel.这样,您实际上就可以绘制点,并从UI(CartesionPanel)中分离数据(点).
// add in CartesionPanel
private List<Point> points = new ArrayList<>();
public void drawPoint(Point point) {
points.add(point);
repaint();
}
private void drawPointOnPanel(Point point, Graphics g) {
final int pointDiameter = 5;
final int x = X_AXIS_FIRST_X_COORD + (point.x * xLength) - pointDiameter / 2;
final int y = Y_AXIS_SECOND_Y_COORD - (point.y * yLength) - pointDiameter / 2;
g.fillOval(x, y, pointDiameter, pointDiameter);
}
public void paintComponent(Graphics g) {
// existing code ...
// draw points
points.forEach(p -> drawPointOnPanel(p, g))
}
在主要功能中,您可以通过以下方式绘制点:
CartesianFrame frame = new CartesianFrame();
frame.showUI();
frame.panel.drawPoint(new Point(3, 4));