Java 使用drawRect时,图形速度太慢
我正在做一个画板,我有几个问题Java 使用drawRect时,图形速度太慢,java,performance,awt,drawrect,Java,Performance,Awt,Drawrect,我正在做一个画板,我有几个问题 每当我尝试使用它时,它不会自动更新。广告我通常必须调整屏幕大小,以便更新 我如何做一个mouseDragged函数,在这个函数中我可以不断地得到x和y坐标 代码如下: import java.awt.geom.*; class griddedInput extends JComponent implements MouseListener { int SIZE = 10; int scSize = 300; int sSize = scSi
import java.awt.geom.*;
class griddedInput extends JComponent implements MouseListener
{
int SIZE = 10;
int scSize = 300;
int sSize = scSize/SIZE;
boolean [][] grid = new boolean[sSize][sSize];
public griddedInput(boolean grid[][])
{
grid=grid;
setPreferredSize(new Dimension(scSize,scSize));
addMouseListener(this);
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
int x, y;
for(y = 0; y < sSize; y ++) {
for(x = 0; x < sSize; x ++) {
if(grid[y][x])
g2.setColor(Color.BLACK);
else
g2.setColor(Color.WHITE);
g2.fillRect((x * SIZE), (y * SIZE), sSize, sSize);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
int squareX = (int)e.getX() / SIZE;
int squareY = (int)e.getY() / SIZE;
grid[squareY][squareX] = !grid[squareY][squareX];
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
导入java.awt.geom.*;
类griddedInput扩展JComponent实现MouseListener
{
int SIZE=10;
int scSize=300;
int sSize=scSize/尺寸;
布尔[][]网格=新布尔[sSize][sSize];
公共griddedInput(布尔网格[][])
{
网格=网格;
setPreferredSize(新维度(scSize,scSize));
addMouseListener(这个);
}
公共组件(图形g)
{
图形2d g2=(图形2d)g;
int x,y;
对于(y=0;y
您可以在任何时候调用绘图组件上的repaint()
,向JVM建议对其进行绘制——最有可能是在MouseListener方法中
e、 g
为了加快重新绘制的速度,您还可以调用重载方法,该方法允许您重新绘制GUI的选定矩形,但我敢打赌,对于这个GUI,您不需要这样做
如果您希望其他人能够更好地理解并帮助您,那么您也希望代码缩进少一些“创造性”
编辑关于: 2.我怎样做一个mouseDragged函数,在这个函数中我可以不断地得到x和y坐标
同时添加一个MouseMotionListener。它可以是同一个类,事实上,我通常使用一个匿名的内部类,一个扩展了MouseAdapter的类,一个我同时用于MouseListener和MouseMotionListener的实例。我在这个论坛的几个帖子中都有使用这个的例子。我会用不同的结构:
private BufferedImage bi = new BufferedImage(getWidth(), getHeight());
private Graphics2D big = bi.createGraphics();
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(bi, 0, 0, this);
}
@Override
public void mouseClicked(MouseEvent e) {
int squareX = (int)e.getX() / SIZE;
int squareY = (int)e.getY() / SIZE;
boolean b = !grid[squareY][squareX];
grid[squareY][squareX] = b;
if(b)
big.setColor(Color.BLACK);
else
big.setColor(Color.WHITE);
big.fillRect((x * SIZE), (y * SIZE), sSize, sSize);
repaint();
}
单击的mouseclick
执行单个fillRect
,而paintComponent
执行单个drawImage
。将其与每次重新绘制时执行900fillRects
的原始代码进行比较
您还需要检测大小的更改,并在那时重新创建
缓冲区图像。@user1377835:您的缩进到处都是,这使得我们很难从逻辑上遵循您的代码。如果您的代码使用标准的常规缩进更容易阅读,我们将能够更好地帮助您,这意味着您将在这里得到更好更快的答案。我们会感谢你的努力,让我们的工作更轻松。比如说一个鼠背式的听者。谢谢,你的建议真的很有帮助!非常感谢。还有一个问题…当我点击侧面时,一行或一列中有3个框被激活。如何修复?@user1377835:请先修复您的代码,以便我更好地理解它。每个缩进使用3个空格,因为这在论坛软件中效果更好。“修复狗的源早餐怎么样?”?“还有一个问题……”似乎是第二篇文章的好引子。如果有机会,请回答这个问题。请对代码块使用一致的逻辑缩进。
private BufferedImage bi = new BufferedImage(getWidth(), getHeight());
private Graphics2D big = bi.createGraphics();
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(bi, 0, 0, this);
}
@Override
public void mouseClicked(MouseEvent e) {
int squareX = (int)e.getX() / SIZE;
int squareY = (int)e.getY() / SIZE;
boolean b = !grid[squareY][squareX];
grid[squareY][squareX] = b;
if(b)
big.setColor(Color.BLACK);
else
big.setColor(Color.WHITE);
big.fillRect((x * SIZE), (y * SIZE), sSize, sSize);
repaint();
}