代码之家  ›  专栏  ›  技术社区  ›  Rafael Rondon

将矩形向下移动到JFrame

  •  0
  • Rafael Rondon  · 技术社区  · 12 年前

    我正在尝试制作一个程序,将矩形向下移动到JFrame中,有人能解释为什么这不起作用吗?

    public class DrawingComponent extends JLabel {
    
    public static int x = 0;
    
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        Rectangle rect = new Rectangle(50,x,50,50);
        g2.draw(rect);
        x = x+100;
    }
    }
    
    public class GameL {
    
    javax.swing.JFrame frame = new javax.swing.JFrame();
    
    public static void main(String[] args) {
            GameL tetris = new GameL();
            tetris.start();     
    }
    
    public void start(){
        //setup frame
        frame.setSize(800,600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    
        TimerEH timereh = new TimerEH();
        Timer timer = new Timer(5000,timereh);
        timer.start();          
    }
    
    class TimerEH implements ActionListener{        
        public void actionPerformed(ActionEvent e){
            DrawingComponent dc = new DrawingComponent();
            frame.add(dc);
        }       
    }
    }
    
    1 回复  |  直到 12 年前
        1
  •  4
  •   MadProgrammer    12 年前

    你正在创建一个新的 DrawingComponent 并在每个刻度周期将其添加到帧中。太多了 DrawComponent s

    虽然可以通过移动零部件来为其设置动画,但您需要提供更多信息,说明为什么要这样做。首选的方法是使用类似 JPanel ,将其添加到使用 BorderLayout 并覆盖面板 paintComponent 方法

    尝试“移动”组件的问题是,组件有一个定义的空间,它们可以在其中渲染,从代码的外观来看,标签的大小可能是0x0,这根本没有太多的空间可以绘制。。。

    更新为示例

    因此,下面的示例演示了通过使用布局管理器在组件范围内绘制矩形,该布局管理器将尝试将组件大小调整到可用的可用空间。

    它还显示了用户 getPreferredSize 以向布局管理器提供有用的大小提示。

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class CreppyRectangle {
    
        public static void main(String[] args) {
            new CreppyRectangle();
        }
    
        public CreppyRectangle() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new GridLayout(0, 6));
                    frame.add(new TestPane(Color.RED));
                    frame.add(new TestPane(Color.GREEN));
                    frame.add(new TestPane(Color.BLUE));
                    frame.add(new TestPane(Color.ORANGE));
                    frame.add(new TestPane(Color.PINK));
                    frame.add(new TestPane(Color.MAGENTA));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private int yPos;
            private int size = 25 + (int)Math.round(Math.random() * 50);
            private int yDelta = 5 + (int)Math.round(Math.random() * 10);
    
            public TestPane(Color foreground) {
                setForeground(foreground);
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        yPos += yDelta;
                        if (yPos < 0) {
                            yPos = 0;
                            yDelta *= -1;
                            System.out.println(yDelta);
                        } else if (yPos + size > getHeight()) {
                            yPos = getHeight() - size;
                            yDelta *= -1;
                        }
                        repaint();
                    }
                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setColor(getForeground());
                g2d.drawRect(0, yPos, getWidth() - 1, size);
                g2d.dispose();
            }
        }
    
    }