【问题标题】:Swing repaint() not working摆动重绘()不起作用
【发布时间】:2014-04-07 00:32:06
【问题描述】:
 class ballbouncepanel extends JPanel
{
        public void start()
            {

                Timer timer;
                final int FREQ = 45;
                timer = new Timer(FREQ, new ActionListener()
                {
                    public void actionPerformed(ActionEvent evt)
                    {
                        repaint();
                    }
                });
                timer.start();
    }

    Rect rect = new Rect();
        public Dimension getPreferredSize()
        {
            return new Dimension(250,200);
        }
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            rect.draw(g);
            rect.move(g);
            rect.erase(g);
        }
}

class Rect
{
    public int xLocation = 0;
    public int yLocation = 0;
    public int xVelocity = 10;
    public int yVelocity = 10;

    public void draw(Graphics g)
    {
        g.setColor(Color.cyan);
        g.fillRect(xLocation, yLocation, 20, 20);
    }
    public void move(Graphics g)
    {
        xLocation += xVelocity;
        yLocation += yVelocity;
    }
    public void erase(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(xLocation, yLocation, 20, 20);
    }
}

新的错误是现在我的重绘方法不起作用。

上面是我想要绘制的框架的代码,我了解使用小程序或 JApplet 进行绘制,但我正在尝试在 Swing 上的小程序中执行我所做的事情,现在我遇到了问题,我查阅了很多关于如何在其中实现图形的教程,但其中大多数只是运行一个主图形,我需要我的在这个特定的框架(BB)中。如果有人可以帮助我理解或指向我的初学者教程,将不胜感激。

【问题讨论】:

  • 查看 Custom Painting 上的 Swing 教程。
  • “我了解使用小程序或 JApplet 进行绘制,但我正在尝试在 Swing 上的小程序中做的事情” 这是相同的概念。 fyi JApplet 一个swing组件。 “现在我遇到了问题” - 什么问题?显示一些代码。您发布的代码没有显示任何关于绘画的内容。
  • 好的,我编辑了它。新的问题是它没有重绘。抱歉没有代码

标签: swing jframe jpanel paint paintcomponent


【解决方案1】:

我认为您只是忘记调用ballbouncepanelstart() 方法。另请注意:您的move() 方法没有绘画,所以取出Graphics 参数并在计时器中调用它

也不确定erase 方法应该做什么,但我想你想在计时器的每个滴答声中改变颜色。在这种情况下,只需保留一个 color 变量,然后更改该变量即可。你可以看下面的例子

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class bounceballpanel extends JPanel {
    public void start() {

        Timer timer;
        final int FREQ = 45;
        timer = new Timer(FREQ, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                rect.move();
                rect.changeColor();
                repaint();
            }
        });
        timer.start();
    }

    Rect rect = new Rect();

    public Dimension getPreferredSize() {
        return new Dimension(250, 200);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        rect.draw(g);
        //rect.erase(g);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame();
                bounceballpanel panel = new bounceballpanel();
                panel.start();
                frame.add(panel);
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

class Rect {
    public int xLocation = 0;
    public int yLocation = 0;
    public int xVelocity = 10;
    public int yVelocity = 10;

    Color color = Color.cyan;

    public void draw(Graphics g) {
        g.setColor(color);
        g.fillRect(xLocation, yLocation, 20, 20);
    }

    public void move() {
        xLocation += xVelocity;
        yLocation += yVelocity;
    }

    public void changeColor() {
        if (color == Color.cyan) {
            color = Color.white;
        } else {
            color = Color.cyan;
        }
    }

    /*
    public void erase(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(xLocation, yLocation, 20, 20);
    }*/
}

【讨论】:

  • 像一个魅力一样工作,但现在我正在制作一个按钮,将一个 int 添加到 xvelocity,但由于我试图从它引用它形成一个静态上下文,所以它不起作用,但是当我添加一个新的 Rect , 它什么都不做
  • 如果按钮是bounceballpanel的类成员,则不能在main中使用它在main之外的任何不是static的东西都不能从@987654331访问@。不过,您可以将按钮添加到面板中。
  • 我得到了按钮,但是我应该把动作监听器放在什么下面,它会调用方法 addx()?
  • 只要放任何改变矩形速度的东西。您不需要调用 repaint,因为计时器已经这样做了。
  • 是的,但是当我把它放在 actionlistener 下调用 rect.addX() 时,它会遇到静态错误。如果我将按钮的 actionlistener 放在 rect 类中,显然这会导致错误,那么它将无法找到按钮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多