Java 为什么repaint()方法在这里不起作用? 公共类Ova扩展JPanel实现ActionListener{ int x=0; 定时器=新定时器(100,本); int y=0,x1=5,y1=5; 公共静态void main(字符串[]ds) { Ova ss=新的Ova(); ss.nn(); } 私有void nn(){ JFrame=新JFrame(“fram”); 框架设置尺寸(1000600); JPanel as=新的JPanel(); 框架。添加(as); frame.add(新的Ova()); frame.setVisible(true); timer.start(); } 公共组件(图形g) { 超级组件(g); g、 牵引椭圆(x,y,50,50); } 已执行的公共无效操作(操作事件e){ 如果(x950){ x1=-x1; } 如果(y530) { y1=-y1; } x=x+x1; y=y+y1; 重新油漆(); } }

Java 为什么repaint()方法在这里不起作用? 公共类Ova扩展JPanel实现ActionListener{ int x=0; 定时器=新定时器(100,本); int y=0,x1=5,y1=5; 公共静态void main(字符串[]ds) { Ova ss=新的Ova(); ss.nn(); } 私有void nn(){ JFrame=新JFrame(“fram”); 框架设置尺寸(1000600); JPanel as=新的JPanel(); 框架。添加(as); frame.add(新的Ova()); frame.setVisible(true); timer.start(); } 公共组件(图形g) { 超级组件(g); g、 牵引椭圆(x,y,50,50); } 已执行的公共无效操作(操作事件e){ 如果(x950){ x1=-x1; } 如果(y530) { y1=-y1; } x=x+x1; y=y+y1; 重新油漆(); } },java,swing,timer,paintcomponent,repaint,Java,Swing,Timer,Paintcomponent,Repaint,每当我将timer.start()放入paintComponent()内部时,repaint()方法起作用,但如果我在paintComponent方法外部启动计时器,则repaint方法不起作用。请解释原因。谢谢。没问题 您有不匹配的参考问题 从这个片段开始 public class Ova extends JPanel implements ActionListener{ int x=0; Timer timer=new Timer(100,this); int y=0,x1=5,y1=5;

每当我将
timer.start()
放入
paintComponent()
内部时,
repaint()
方法起作用,但如果我在paintComponent方法外部启动计时器,则repaint方法不起作用。请解释原因。谢谢。

没问题 您有不匹配的参考问题

从这个片段开始

public class Ova extends JPanel implements ActionListener{

int x=0;
Timer timer=new Timer(100,this);
int y=0,x1=5,y1=5;

public static void main(String[] ds)
{
    Ova ss=new Ova();
    ss.nn();    
}

private void nn() {     
    JFrame frame=new JFrame("fram");
    frame.setSize(1000,600);
    JPanel as=new JPanel();
    frame.add(as);  
    frame.add(new Ova());
    frame.setVisible(true);

    timer.start();
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);    
    g.drawOval(x, y, 50, 50);
}

public void actionPerformed(ActionEvent e) {
    if (x<0 || x>950){
        x1=-x1; 
    }
    if (y<0 || y>530)
    {
        y1=-y1;
    }

    x=x+x1;
    y=y+y1;

    repaint();
}
}
首先,
main
创建一个
Ova
的实例,然后方法
nn
创建一个
Ova
的新实例,然后启动
计时器

现在,您需要问的问题是,您启动了哪个
Ova
s
timer
…屏幕上的那个还是
main
创建的那个

我可以看出,它是
main
创建的,在屏幕上不可见

(可能的)解决办法 不要在
JPanel
(或其他组件)内部创建
JFrame
。我唯一一次会这样做是通过
静态
支持方法

public class Ova extends JPanel implements ActionListener {

    int x = 0;
    Timer timer = new Timer(100, this);
    int y = 0, x1 = 5, y1 = 5;

    public static void main(String[] ds) {
        Ova ss = new Ova();
        ss.nn();
    }

    private void nn() {
        JFrame frame = new JFrame("fram");
        frame.setSize(1000, 600);

        JPanel as = new JPanel();
        frame.add(as);
        frame.add(new Ova());
        frame.setVisible(true);
        timer.start();

    }
删除
nn
方法,并将其替换为启动
计时器的
begin
(或类似的)方法

main
方法中,创建
Ova
的实例,将其添加到
JFrame
的实例中,并调用
Ova
开始
方法

public class Ova extends JPanel implements ActionListener {

    int x = 0;
    Timer timer = new Timer(100, this);
    int y = 0, x1 = 5, y1 = 5;

    public static void main(String[] ds) {
        Ova ss = new Ova();
        ss.nn();
    }

    private void nn() {
        JFrame frame = new JFrame("fram");
        frame.setSize(1000, 600);

        JPanel as = new JPanel();
        frame.add(as);
        frame.add(new Ova());
        frame.setVisible(true);
        timer.start();

    }
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类Ova扩展JPanel实现ActionListener{
int x=0;
定时器=新定时器(100,本);
int y=0,x1=5,y1=5;
公共静态void main(字符串[]ds){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
Ova Ova=新的Ova();
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
帧。添加(ova);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
ova.begin();
}
});
}
@凌驾
公共维度getPreferredSize(){
返回新维度(600600);
}
私有void begin(){
timer.start();
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 牵引椭圆(x,y,50,50);
}
@凌驾
已执行的公共无效操作(操作事件e){
如果(x<0 | | x>950){
x1=-x1;
}
如果(y<0 | | y>530){
y1=-y1;
}
x=x+x1;
y=y+y1;
重新油漆();
}
}
避免对任何内容调用
setSize
,相反,请覆盖组件的
getPreferredSize
方法并返回首选大小,然后在
JFrame
上使用
pack
将框架环绕此大小。您将获得更好、更可靠的结果。

问题 您有不匹配的参考问题

从这个片段开始

public class Ova extends JPanel implements ActionListener{

int x=0;
Timer timer=new Timer(100,this);
int y=0,x1=5,y1=5;

public static void main(String[] ds)
{
    Ova ss=new Ova();
    ss.nn();    
}

private void nn() {     
    JFrame frame=new JFrame("fram");
    frame.setSize(1000,600);
    JPanel as=new JPanel();
    frame.add(as);  
    frame.add(new Ova());
    frame.setVisible(true);

    timer.start();
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);    
    g.drawOval(x, y, 50, 50);
}

public void actionPerformed(ActionEvent e) {
    if (x<0 || x>950){
        x1=-x1; 
    }
    if (y<0 || y>530)
    {
        y1=-y1;
    }

    x=x+x1;
    y=y+y1;

    repaint();
}
}
首先,
main
创建一个
Ova
的实例,然后方法
nn
创建一个
Ova
的新实例,然后启动
计时器

现在,您需要问的问题是,您启动了哪个
Ova
s
timer
…屏幕上的那个还是
main
创建的那个

我可以看出,它是
main
创建的,在屏幕上不可见

(可能的)解决办法 不要在
JPanel
(或其他组件)内部创建
JFrame
。我唯一一次会这样做是通过
静态
支持方法

public class Ova extends JPanel implements ActionListener {

    int x = 0;
    Timer timer = new Timer(100, this);
    int y = 0, x1 = 5, y1 = 5;

    public static void main(String[] ds) {
        Ova ss = new Ova();
        ss.nn();
    }

    private void nn() {
        JFrame frame = new JFrame("fram");
        frame.setSize(1000, 600);

        JPanel as = new JPanel();
        frame.add(as);
        frame.add(new Ova());
        frame.setVisible(true);
        timer.start();

    }
删除
nn
方法,并将其替换为启动
计时器的
begin
(或类似的)方法

main
方法中,创建
Ova
的实例,将其添加到
JFrame
的实例中,并调用
Ova
开始
方法

public class Ova extends JPanel implements ActionListener {

    int x = 0;
    Timer timer = new Timer(100, this);
    int y = 0, x1 = 5, y1 = 5;

    public static void main(String[] ds) {
        Ova ss = new Ova();
        ss.nn();
    }

    private void nn() {
        JFrame frame = new JFrame("fram");
        frame.setSize(1000, 600);

        JPanel as = new JPanel();
        frame.add(as);
        frame.add(new Ova());
        frame.setVisible(true);
        timer.start();

    }
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类Ova扩展JPanel实现ActionListener{
int x=0;
定时器=新定时器(100,本);
int y=0,x1=5,y1=5;
公共静态void main(字符串[]ds){
invokeLater(新的Runnable(){
@凌驾