gpt4 book ai didi

java - 需要在同一框架/面板中的现有绘图之上添加绘图

转载 作者:行者123 更新时间:2023-11-30 09:27:51 25 4
gpt4 key购买 nike

我基本上有一个矩形矩阵,想分别绘制它们,但每次绘制都会删除之前的任何一个,最后我得到了最后一个孤独的矩形。我已经用谷歌搜索了几个小时并进行了搜索,我发现的唯一建议是一次绘制所有内容,我尝试过但似乎完全毁了我的听众,这些听众是围绕每个独立的组件构建的。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Color;
import javax.swing.JComponent;


@SuppressWarnings("serial")
public class GraphicEdge extends JComponent
{

public Rectangle box;
private Edge edge;
/**
* Creates a graphical box corresponding to the given edge at the given
* position
* @param x x coordinate
* @param y y coordinate
* @param e edge represented
*/
public GraphicEdge(int x, int y, int width, int length, Edge e)
{
this.edge = e;
this.box = new Rectangle(x, y, width, length);
}
/**
* Paints said edge. Will be recalled whenever the edge switches from
* active to inactive.
* @param g graphics.
*/

public void paintComponent(Graphics g)
{

Graphics2D g2 = (Graphics2D)g;

if (this.edge.getActive()==0)
{
g2.setColor(Color.red);
}
else
{
g2.setColor(Color.green);
}
g2.fill(this.box);
g2.draw(this.box);

}
/**
* Calls for the redrawing of the component.
*/
public void redrawComponent()
{
repaint();
}

/**
* Gets edge.
*/
public Edge getEdge()
{
return this.edge;
}
/**
* Returns the edge's rectangle.
* @return
*/
public Rectangle getBox()
{
return this.box;
}
}

最佳答案

如果我没理解错的话,您基本上是想让 paintComponent 中的绘图持久化?

默认情况下,所有在 paintComponent 中完成的绘图都不是永久性的。

因此在 repaint()paintComponent 将被再次调用并绘制方法告诉它的任何内容。

所以解决你的问题:

1) 在您的类中创建一个 List,它扩展了 JPanel(不是 JComponent,除非出于某种原因)。

2) 创建一个public 方法以允许添加到列表(并在需要时删除)。

3) 在 paintComponent 中遍历 List 并绘制每个对象。

这是一个示例(用鼠标在容器上的任意位置单击以绘制 Rectangle):

enter image description here

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class Test {

private final JFrame frame = new JFrame();
private final MyPanel panel = new MyPanel();

private void createAndShowUI() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test().createAndShowUI();
}
});
}
}

class MyPanel extends JPanel {

private List<Rectangle> recs = new ArrayList<>();

public MyPanel() {
initComponents();
}

private void initComponents() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
addRec(new Rectangle(me.getPoint().x, me.getPoint().y, 100, 50));
repaint();
}
});
}

public void addRec(Rectangle rec) {
recs.add(rec);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

for (Rectangle rec : recs) {
g2d.drawRect(rec.x, rec.y, rec.width, rec.height);
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}

注意正如@HFOE 所说,请记住调用 super.paintComponent(g) 作为重写的 paintComponent 中的第一个调用,以兑现 paint 链 否则可能会出现视觉异常。

关于java - 需要在同一框架/面板中的现有绘图之上添加绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14304804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com