盒子不是';在JPanel上出现或移动。。JAVA

盒子不是';在JPanel上出现或移动。。JAVA,java,arrays,swing,animation,jpanel,Java,Arrays,Swing,Animation,Jpanel,我试图在我的Java面板1上创建此框,但屏幕上没有显示任何内容:/what's problem?对不起,我是java动画新手,它太难了!此外,我希望该框仅在第一个面板上显示并移动,而不是在第二个面板上。。这是我的密码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class frog extends J

我试图在我的Java面板1上创建此框,但屏幕上没有显示任何内容:/what's problem?对不起,我是java动画新手,它太难了!此外,我希望该框仅在第一个面板上显示并移动,而不是在第二个面板上。。这是我的密码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class frog extends JPanel implements ActionListener{
    JFrame frame= new JFrame();
    JPanel panel=new JPanel();
    JButton button = new JButton("Hungry");
    JPanel panel2=new JPanel();
    JTextField t;
    Timer tm= new Timer(5, this);
    int x=0, velX=2;
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.RED);
        g.drawRect(100,10,30,40);
        g.fillRect(x,10,20,10);
        tm.start();
    }
    JLabel l= new JLabel("Good");
    frog(){
        panel.setBackground(Color.CYAN);
        panel2.setBackground(Color.GREEN);
        t= new JTextField("Frog is hungry",10);
        panel2.add(t);
        panel2.add(button);
        frame.add(panel,BorderLayout.CENTER);
        frame.add(panel2,BorderLayout.PAGE_END);
        button.addActionListener(this);
        frame.setSize(500,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        frog f= new frog();

    }


    @Override
    public void actionPerformed(ActionEvent e) {
        t.setText("Now he is full");
        x=x+velX;
        repaint();
    }

}

您正在为
frog
类定义动画,但没有将
frog
面板添加到
JFrame
。第一个面板是一个普通的
Jpanel
,它没有相关的
paintComponent
覆盖

你应该:

  • 拆下线路

    JPanel panel=new JPanel();
    
  • 而不是

    panel.setBackground(Color.CYAN);
    
    使用

  • 而不是

    frame.add(panel,BorderLayout.CENTER);
    
    使用

  • 现在,第一个面板将是当前创建的
    青蛙
    ,您应该能够看到动画

    笔记:
    • 请注意Java语言惯例。类名应该以大写字母开头(
      Frog
      ,而不是
      Frog
    • 请注意,计时器和按钮都在使用您执行的
      操作。你确定这就是你想要的吗?此外,我认为不太可能每次重新喷漆面板时都要启动计时器

    您正在为
    frog
    类定义动画,但没有将
    frog
    面板添加到
    JFrame
    。第一个面板是一个普通的
    Jpanel
    ,它没有相关的
    paintComponent
    覆盖

    你应该:

  • 拆下线路

    JPanel panel=new JPanel();
    
  • 而不是

    panel.setBackground(Color.CYAN);
    
    使用

  • 而不是

    frame.add(panel,BorderLayout.CENTER);
    
    使用

  • 现在,第一个面板将是当前创建的
    青蛙
    ,您应该能够看到动画

    笔记:
    • 请注意Java语言惯例。类名应该以大写字母开头(
      Frog
      ,而不是
      Frog
    • 请注意,计时器和按钮都在使用您执行的
      操作。你确定这就是你想要的吗?此外,我认为不太可能每次重新喷漆面板时都要启动计时器

    让我们停下来看看你做了什么

    您已经创建了一个从
    JPanel

    public class Frog extends JPanel implements ActionListener {
    
    好的。您已经覆盖了
    paintComponent
    以进行一些自定义绘制

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.setColor(Color.RED);
        g.drawRect(100, 10, 30, 40);
        g.fillRect(x, 10, 20, 10);
        tm.start();
    }
    
    好吧,这里有一些问题,但让我们继续。在面板的构造函数中,您已经创建了两个新面板,您已经将这两个面板添加到
    JFrame
    并使其可见

    Frog() {
        panel.setBackground(Color.CYAN);
        panel2.setBackground(Color.GREEN);
        t = new JTextField("Frog is hungry", 10);
        panel2.add(t);
        panel2.add(button);
        frame.add(panel, BorderLayout.CENTER);
        frame.add(panel2, BorderLayout.PAGE_END);
        button.addActionListener(this);
        frame.setSize(500, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    但是等一下,如果
    Frog
    面板从未添加任何内容,那么它应该如何显示呢

    另外,构造器有一些非常糟糕的副作用,抛开不相关的面板,它会在调用时创建一个框架,这真是个糟糕的主意

    基本面向对象 在OO中,您希望将任何对象的功能限制为单个职责,
    Frog
    面板不负责创建其他面板(它们不向
    Frog
    面板添加任何功能)或制作框架,其职责是绘制青蛙并为其设置动画,而不是其他

    public class FrogPane extends JPanel {
    
        private Timer timer;
        int x = 0, velX = 2;
    
        public FrogPane() {
            timer = new Timer(40, new ActionListener() {
                                            @Override
                                            public void actionPerformed(ActionEvent e) {
                                                x = x + velX;
                                                repaint();
                                            }
                                        });
            setBackground(Color.CYAN);
        }
    
        public void start() {
            timer.start();
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            g2d.drawRect(100, 10, 30, 40);
            g2d.fillRect(x, 10, 20, 10);
            g2d.dispose();
        }
    
    }
    
    好的,
    FrogPane
    是非常基本的,它绘制了一个青蛙的表示,并通过使用
    定时器更新位置。请注意,
    paintComponent
    中没有启动
    计时器,可以出于多种原因调用
    paintComponent
    ,其中许多原因是您无法控制的,因此不要在计时器中执行任何可能会改变组件状态或依赖于执行某些次要任务的操作

    我们需要做的下一件事是显示它,并有一些方法来启动它

    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    FrogPane frogPane = new FrogPane();
    
                    JTextField t = new JTextField("Frog is hungry", 10);
                    JButton button = new JButton("Hungry");
    
                    JPanel actionPane = new JPanel();
                    actionPane.setBackground(Color.GREEN);
                    actionPane.add(t);
                    actionPane.add(button);
                    button.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            t.setText("Run frog run");
                            frogPane.start();
                        }
                    });
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(frogPane);
                    frame.add(actionPane, BorderLayout.PAGE_END);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    所以,你的下一个问题是如何管理不同类之间的状态,这向我建议你需要离开,做更多的研究,更好地理解职责分离的概念。基本的答案是,你使用了一个模型。

    让我们停下来看看你做了什么

    您已经创建了一个从
    JPanel

    public class Frog extends JPanel implements ActionListener {
    
    好的。您已经覆盖了
    paintComponent
    以进行一些自定义绘制

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.setColor(Color.RED);
        g.drawRect(100, 10, 30, 40);
        g.fillRect(x, 10, 20, 10);
        tm.start();
    }
    
    好吧,这里有一些问题,但让我们继续。在面板的构造函数中,您已经创建了两个新面板,您已经将这两个面板添加到
    JFrame
    并使其可见

    Frog() {
        panel.setBackground(Color.CYAN);
        panel2.setBackground(Color.GREEN);
        t = new JTextField("Frog is hungry", 10);
        panel2.add(t);
        panel2.add(button);
        frame.add(panel, BorderLayout.CENTER);
        frame.add(panel2, BorderLayout.PAGE_END);
        button.addActionListener(this);
        frame.setSize(500, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    但是等一下,如果
    Frog
    面板从未添加任何内容,那么它应该如何显示呢

    另外,构造器有一些非常糟糕的副作用,抛开不相关的面板,它会在调用时创建一个框架,这真是个糟糕的主意

    基本面向对象 在OO中,您希望将任何对象的功能限制为单个职责,
    Frog
    面板不负责创建其他面板(它们不向
    Frog
    面板添加任何功能)或制作框架,其职责是绘制青蛙并为其设置动画,而不是其他

    public class FrogPane extends JPanel {
    
        private Timer timer;
        int x = 0, velX = 2;
    
        public FrogPane() {
            timer = new Timer(40, new ActionListener() {
                                            @Override
                                            public void actionPerformed(ActionEvent e) {
                                                x = x + velX;
                                                repaint();
                                            }
                                        });
            setBackground(Color.CYAN);
        }
    
        public void start() {
            timer.start();
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            g2d.drawRect(100, 10, 30, 40);
            g2d.fillRect(x, 10, 20, 10);
            g2d.dispose();
        }
    
    }
    
    好的,
    FrogPane
    是非常基本的,它绘制了一个青蛙的表示,并通过使用
    定时器更新位置。请注意,
    paintComponent
    中没有启动
    计时器,可以出于多种原因调用
    paintComponent
    ,其中许多原因是您无法控制的,因此不要在计时器中执行任何可能会改变组件状态或依赖于执行某些次要任务的操作

    我们需要做的下一件事是显示它,并有一些方法来启动它

    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    FrogPane frogPane = new FrogPane();
    
                    JTextField t = new JTextField("Frog is hungry", 10);
                    JButton button = new JButton("Hungry");
    
                    JPanel actionPane = new JPanel();
                    actionPane.setBackground(Color.GREEN);
                    actionPane.add(t);
                    actionPane.add(button);
                    button.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            t.setText("Run frog run");
                            frogPane.start();
                        }
                    });
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(frogPane);
                    frame.add(actionPane, BorderLayout.PAGE_END);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    所以,你的下一个问题是如何管理不同类之间的状态,这向我建议你需要离开,做更多的研究,更好地理解职责分离的概念。基本答案是,您使用的是一个模型。

    欢迎使用堆栈溢出!它是罗