框没有出现或移动JPanel .. Java

时间:2017-03-12 09:09:20

标签: java arrays swing animation jpanel

我正在尝试在我的Java面板1上创建此框,但屏幕上没有显示任何内容:/有什么问题?对不起,我是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();
    }

}

2 个答案:

答案 0 :(得分:2)

让我们停一会儿,看看你做了些什么。

您已经创建了一个从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

使用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非常基本,它描绘了青蛙的表现形式并通过使用Timer来更新位置。请注意,Timer未启动paintComponentpaintComponent可以出于多种原因调用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); } }); } } ,其中许多原因是您无法控制的,所以不要在其中做任何可能改变组件状态或您依赖执行某些辅助任务的事情

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

    foreach (TabPage tp in tabControl1.TabPages)
    {
        ObjectQuery<tblProduct> filteredProduct = new ObjectQuery<tblProduct>("SELECT VALUE P FROM tblProducts AS P", ((IObjectContextAdapter)cse).ObjectContext);
    }

所以,你的下一个问题是如何管理不同类之间的状态,这告诉我你需要离开并对Model-View-Controller做更多的研究,并更好地理解分离的概念。责任。基本答案是,你使用的是模型。

答案 1 :(得分:0)

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

你应该:

  1. 删除行

    JPanel panel=new JPanel();
    
  2. 而不是

    panel.setBackground(Color.CYAN);
    

    使用

    this.setBackground(Color.CYAN);
    
  3. 而不是

    frame.add(panel,BorderLayout.CENTER);
    

    使用

    frame.add(this,BorderLayout.CENTER);
    
  4. 现在第一个面板将是当前创建的frog,您应该能够看到动画。

    说明:

    • 请注意Java语言约定。类名应以大写字母开头(Frog而不是frog)。
    • 请注意,计时器和按钮正在使用actionPerformed。你确定这是你想要的吗?此外,我认为每次重新绘制面板时,您都不太可能想要启动计时器。