在 Java 中绘制矩形
Drawing Rectangle in Java
我正在尝试绘制一个矩形。但我不确定它是如何在某些面板上绘制的。想看一个例子,我如何提供面板和绘制矩形的位置。我有以下模板,我想看看我需要做哪些修改才能使用此 class 在任何面板上绘制矩形。我的意图是使用面板的宽度和高度,并在该位置添加一个矩形。目标是能够在任何地方使用任何 JPanels class。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class DrawRectangle{
private int startX;
private int startY;
private int width;
private int height;
private Color color;
private JPanel panel;
public DrawRectangle(JPanel panel, int startX, int startY, int width, int height, Color color) {
this.startX = startX;
this.startY = startY;
this.width = width;
this.height = height;
this.color = color;
this.panel = panel;
}
public void paint(Graphics g) {
g.setColor(this.color);
g.fillRect(this.startX, this.startY, this.width, this.height);
g.drawRect(this.startX, this.startY, this.width, this.height);
}
}
您必须通过以下方式修改感兴趣的 JPanel 才能使用该代码:
- 覆盖其 paintComponent 方法
- 首先在您的重写中调用 super 的 paintComponent 方法
- 然后绘制自己的DrawRectangleclass的paint方法
- 如果您希望能够绘制多个矩形,则给 JPanel 一个
List<DrawRectangle>
并在 paintComponent 内的 for 循环中绘制它们
例如,对于一个矩形:
public class DrawingPanel extends JPanel {
private DrawRectangle drawRectangle;
public DrawingPanel(DrawRectangle drawRectangle) {
this.drawRectangle = drawRectangle;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawRectangle != null) {
drawRectangle.paint(g);
}
}
}
对于许多矩形:
public class DrawingManyRectPanel extends JPanel {
private List<DrawRectangle> drawRectangles;
public DrawingManyRectPanel(List<DrawRectangle> drawRectangles) {
this.drawRectangles = drawRectangles;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawRectangles != null) {
for (DrawRectangle rectangle : drawRectangles) {
rectangle.paint(g);
}
}
}
}
在这些 class 中,构造函数被覆盖以允许通过构造函数调用将矩形注入 class。对于第二个 class,我还要添加一个允许添加更多矩形的方法:
public void addRectangle(DrawRectangle rectangle) {
drawRectangles.add(rectangle);
repaint();
}
删除矩形类似
如果您不打算删除矩形或修改已绘制的矩形,另一种方法是在 BufferedImage 中绘制它们,然后在绘图 JPanel 的 paintComponent 方法中绘制该图像。
查看 Graphics2D class 它正是您想要做的,并且比常规 paintComponent
方法更适合绘图。您可以阅读有关如何使用 Graphics2D here 的信息。
首先请注意,如果不像我在 Graphics2D g2 = (Graphics2D) g;
.
中那样从 Graphics
对象强制转换它,就不能拥有 Graphics2D
对象
这是一个可以帮助您入门的示例,请记住我使用的是绝对布局,因此没有布局管理器。这是我用来创建二十一点游戏的代码,所以这就是为什么名称不是通用的。
我还添加了平滑,这样使用 Graphics2D 的形状看起来会非常漂亮,而且这些方法可以使屏幕上的形状居中,这可能会很好地与您的 JPanel 配合使用。
请注意我是如何为要绘制的 Graphics2D 对象创建特定方法,然后使用 Graphics class 绘制它们的。这似乎对我来说效果最好,这样我的 paintComponent
就不会到处都是无休止的重复代码。 frame
在我的代码中得到了 JFrame
的宽度和高度我有 JPanel
所以你只需参考 JPanel
就可以了。
class DrawTable extends JPanel
{
DrawTable()
{
super();
System.out.println("Looks good to me pal!");
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//Setup background
drawRectangle(g, Color.BLACK,
frame.getWidth() / 2, frame.getHeight() / 2,
frame.getWidth(), frame.getHeight());
// Create table at center
drawRectangle(g, new Color(206, 187, 158),
frame.getWidth() / 4, frame.getHeight(), //left table leg
50, 600);
drawRectangle(g, new Color(206, 187, 158),
frame.getWidth() / 1.5, frame.getHeight(), //right table leg
50, 600);
drawEllipse(g, new Color(153, 154, 104),
frame.getWidth() / 2, frame.getHeight() / 2, //Draws outer circle
1200, 400);
drawEllipse(g, new Color(53, 101, 77),
frame.getWidth() / 2, frame.getHeight() / 2, //Draws inner circle
1125, 350);
}
private void drawEllipse(Graphics g, Color color, double x, double y, double width, double height) //centers ellipse
{
Graphics2D g2 = (Graphics2D) g;
double centerX = (double) x - width / 2;
double centerY = (double) y - height / 2;
Ellipse2D ellipse = new Ellipse2D.Double(centerX, centerY, width, height);
RenderingHints render = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
render.put(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(render);
g2.setColor(color);
g2.fill(ellipse);
g2.draw(ellipse);
}
private void drawRectangle(Graphics g, Color color, double x, double y, double width, double height) //centers rectangle
{
Graphics2D g2 = (Graphics2D) g;
double centerX = (double) x - width / 2;
double centerY = (double) y - height / 2;
Rectangle2D rect = new Rectangle2D.Double(centerX, centerY, width, height);
RenderingHints render = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
render.put(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.addRenderingHints(render);
g2.setColor(color);
g2.fill(rect);
}
}
如果您需要帮助,请告诉我!
我正在尝试绘制一个矩形。但我不确定它是如何在某些面板上绘制的。想看一个例子,我如何提供面板和绘制矩形的位置。我有以下模板,我想看看我需要做哪些修改才能使用此 class 在任何面板上绘制矩形。我的意图是使用面板的宽度和高度,并在该位置添加一个矩形。目标是能够在任何地方使用任何 JPanels class。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class DrawRectangle{
private int startX;
private int startY;
private int width;
private int height;
private Color color;
private JPanel panel;
public DrawRectangle(JPanel panel, int startX, int startY, int width, int height, Color color) {
this.startX = startX;
this.startY = startY;
this.width = width;
this.height = height;
this.color = color;
this.panel = panel;
}
public void paint(Graphics g) {
g.setColor(this.color);
g.fillRect(this.startX, this.startY, this.width, this.height);
g.drawRect(this.startX, this.startY, this.width, this.height);
}
}
您必须通过以下方式修改感兴趣的 JPanel 才能使用该代码:
- 覆盖其 paintComponent 方法
- 首先在您的重写中调用 super 的 paintComponent 方法
- 然后绘制自己的DrawRectangleclass的paint方法
- 如果您希望能够绘制多个矩形,则给 JPanel 一个
List<DrawRectangle>
并在 paintComponent 内的 for 循环中绘制它们
例如,对于一个矩形:
public class DrawingPanel extends JPanel {
private DrawRectangle drawRectangle;
public DrawingPanel(DrawRectangle drawRectangle) {
this.drawRectangle = drawRectangle;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawRectangle != null) {
drawRectangle.paint(g);
}
}
}
对于许多矩形:
public class DrawingManyRectPanel extends JPanel {
private List<DrawRectangle> drawRectangles;
public DrawingManyRectPanel(List<DrawRectangle> drawRectangles) {
this.drawRectangles = drawRectangles;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawRectangles != null) {
for (DrawRectangle rectangle : drawRectangles) {
rectangle.paint(g);
}
}
}
}
在这些 class 中,构造函数被覆盖以允许通过构造函数调用将矩形注入 class。对于第二个 class,我还要添加一个允许添加更多矩形的方法:
public void addRectangle(DrawRectangle rectangle) {
drawRectangles.add(rectangle);
repaint();
}
删除矩形类似
如果您不打算删除矩形或修改已绘制的矩形,另一种方法是在 BufferedImage 中绘制它们,然后在绘图 JPanel 的 paintComponent 方法中绘制该图像。
查看 Graphics2D class 它正是您想要做的,并且比常规 paintComponent
方法更适合绘图。您可以阅读有关如何使用 Graphics2D here 的信息。
首先请注意,如果不像我在 Graphics2D g2 = (Graphics2D) g;
.
Graphics
对象强制转换它,就不能拥有 Graphics2D
对象
这是一个可以帮助您入门的示例,请记住我使用的是绝对布局,因此没有布局管理器。这是我用来创建二十一点游戏的代码,所以这就是为什么名称不是通用的。
我还添加了平滑,这样使用 Graphics2D 的形状看起来会非常漂亮,而且这些方法可以使屏幕上的形状居中,这可能会很好地与您的 JPanel 配合使用。
请注意我是如何为要绘制的 Graphics2D 对象创建特定方法,然后使用 Graphics class 绘制它们的。这似乎对我来说效果最好,这样我的 paintComponent
就不会到处都是无休止的重复代码。 frame
在我的代码中得到了 JFrame
的宽度和高度我有 JPanel
所以你只需参考 JPanel
就可以了。
class DrawTable extends JPanel
{
DrawTable()
{
super();
System.out.println("Looks good to me pal!");
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//Setup background
drawRectangle(g, Color.BLACK,
frame.getWidth() / 2, frame.getHeight() / 2,
frame.getWidth(), frame.getHeight());
// Create table at center
drawRectangle(g, new Color(206, 187, 158),
frame.getWidth() / 4, frame.getHeight(), //left table leg
50, 600);
drawRectangle(g, new Color(206, 187, 158),
frame.getWidth() / 1.5, frame.getHeight(), //right table leg
50, 600);
drawEllipse(g, new Color(153, 154, 104),
frame.getWidth() / 2, frame.getHeight() / 2, //Draws outer circle
1200, 400);
drawEllipse(g, new Color(53, 101, 77),
frame.getWidth() / 2, frame.getHeight() / 2, //Draws inner circle
1125, 350);
}
private void drawEllipse(Graphics g, Color color, double x, double y, double width, double height) //centers ellipse
{
Graphics2D g2 = (Graphics2D) g;
double centerX = (double) x - width / 2;
double centerY = (double) y - height / 2;
Ellipse2D ellipse = new Ellipse2D.Double(centerX, centerY, width, height);
RenderingHints render = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
render.put(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHints(render);
g2.setColor(color);
g2.fill(ellipse);
g2.draw(ellipse);
}
private void drawRectangle(Graphics g, Color color, double x, double y, double width, double height) //centers rectangle
{
Graphics2D g2 = (Graphics2D) g;
double centerX = (double) x - width / 2;
double centerY = (double) y - height / 2;
Rectangle2D rect = new Rectangle2D.Double(centerX, centerY, width, height);
RenderingHints render = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
render.put(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.addRenderingHints(render);
g2.setColor(color);
g2.fill(rect);
}
}
如果您需要帮助,请告诉我!