Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用drawRect时,图形速度太慢_Java_Performance_Awt_Drawrect - Fatal编程技术网

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

我正在做一个画板,我有几个问题

  • 每当我尝试使用它时,它不会自动更新。广告我通常必须调整屏幕大小,以便更新
  • 我如何做一个mouseDragged函数,在这个函数中我可以不断地得到x和y坐标
  • 代码如下:

    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
    。将其与每次重新绘制时执行900
    fillRects
    的原始代码进行比较


    您还需要检测大小的更改,并在那时重新创建
    缓冲区图像。

    @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();
    }