我想用Java实现的是能够从另一种方法中绘制随机形状,而不必从头开始绘制那些形状(用户选择x,y,w,h本身)
这是我到目前为止所做的:
public class Design extends JComponent {
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
super.paintComponent(g);
}
public void drawRect(int xPos, int yPos, int width, int height) {
Graphics g = null;
g.drawRect(width, height, xPos, yPos);
}
}
正如你在上面看到的那样,我有drawRect函数编码,但是我不知道怎么做它所以当我调用drawRect()函数时,它得到paint()函数来绘制一个矩形,而这正是什么paint函数在其中输入g.drawRect()和你的x,y,w,h。 我之所以这样做而不仅仅是直接使用paint()是因为我正在尝试创建一个组件而不必每次都输出paint()函数,我只是将这个类添加到我的Swing中它是完成。
希望你明白我在这里想要实现的目标。 感谢。
答案 0 :(得分:1)
你需要做的第一件事是放弃你可以控制绘画过程的想法,你不能,你可以回应绘制事件并向RepaintManager
发出更新请求可能需要。
基本上,你不能直接打电话给paint
,为了回应RepaintManager
想要画的东西而调用画。
请查看Painting in AWT and Swing和Performing Custom Painting。
转到您的代码。不要覆盖paint
,当然不要绕过油漆过程,相反,它应该看起来更像这样......
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawRect(g, 10, 10, 10, 10);
}
protected void drawRect(Graphics g, int xPos, int yPos, int width, int height) {
g.drawRect(xPos, yPos, width, height);
}
Graphics#drawRect
实际上按顺序获取参数x
,y
,width
,height
...
我这样做的原因并不仅仅是直接使用paint()是因为我试图制作一个组件而不必每次都输出paint()函数
没有意义,这是使用paint
方法的重点,因此您可以自定义组件的绘制方式,创建大量实例并将其添加到GUI中......这就是所有Swing控件的工作原理......
此外,您可能会发现感兴趣的2D Graphics
根据评论更新
所以,你想要一个其他对象可以调用的方法,它将使它们能够添加一个"矩形"到现有的对象/组件......
首先定义Rectangle
private Rectangle rectangle;
在paintComponent
中,检查rectangle
是否null
是否为protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (rectangle != null) {
Graphics2D g2d = (Graphics2D)g;
g2d.draw(rectangle);
}
}
,如果不是,请将其绘制成......
drawRect
现在,更新您的Rectangle
方法以创建实例public void drawRect(int xPos, int yPos, int width, int height) {
rectangle = new Rectangle(xPos, yPos, width, height);
repaint();
}
并请求重新绘制该组件
public class Design extends JComponent {
private Rectangle rectangle;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (rectangle != null) {
Graphics2D g2d = (Graphics2D)g;
g2d.draw(rectangle);
}
}
public void drawRect(int xPos, int yPos, int width, int height) {
rectangle = new Rectangle(xPos, yPos, width, height);
repaint();
}
}
例如......
List
现在,如果你想支持多个矩形,你可以简单地使用Rectangle
并根据需要添加任意数量的实例List
,迭代paintComponent
{{1}} 1}}方法
答案 1 :(得分:1)
您需要通过调用paintComponent()
在super.paintComponent()
方法内完成所有绘画。
我建议您在List
中存储所有需要的形状,并在paintComponent()
中绘制所有形状。
而不是drawRect
使用addRect
之类的内容,为List
添加新形状并调用repaint()
方法。检查下一个简单的例子:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class TestFrame extends JFrame {
public TestFrame() {
System.out.println("as".equalsIgnoreCase(null));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
pack();
setVisible(true);
}
private void init() {
final Design d = new Design();
d.addRect(0,0,10,20);
JButton b = new JButton("add");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Random r = new Random();
int w = r.nextInt(100);
int h = r.nextInt(100);
d.addRect(0,0,w,h);
}
});
add(d);
add(b,BorderLayout.SOUTH);
}
public static void main(String... strings) {
new TestFrame();
}
private class Design extends JComponent {
private static final long serialVersionUID = 1L;
private List<Shape> shapes = new ArrayList<Shape>();
public void paint(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for(Shape s : shapes){
g2d.draw(s);
}
}
public void addRect(int xPos, int yPos, int width, int height) {
shapes.add(new Rectangle(xPos,yPos,width,height));
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(100,100);
}
}
}