从内部类调用paint方法

时间:2013-01-15 14:32:37

标签: java swing jpanel paintcomponent event-dispatching

我有一个示例代码,只是构建一个带有矩形和几个按钮的JFrame。我完成了矩形的构建,现在我要放置两个按钮,一个是开始 - 一个是顶部,另一个是底部。

我拥有一切,至少是它的科学。但是当我试图设置开始按钮来运行代码时没有任何反应。我试图通过创建JFrame来查看是否存在错误,并且代码成功。 JFrame应该打开一个启动按钮,启动paintComponent(),停止终止整个事情。

是否有人可以提供指导,我几天都没有睡觉试图弄明白这一点。

    public static void main (String[] args){
        TwoButtonsRandomRec two = new TwoButtonsRandomRec();
        two.go();
    }

    public void go(){

        JPanel pan = new JPanel(new GridBagLayout());

        START = new JButton("START");
        START.addActionListener(new StartListener());
        STOP = new JButton("STOP");
        STOP.addActionListener(new StopListener());

        pan.add(START);
        pan.add(STOP);

        frame = new JFrame();
        frame.getContentPane().add(BorderLayout.NORTH, START);
        frame.getContentPane().add(BorderLayout.SOUTH, STOP);
        frame.setSize(500,500);       
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void GUI(){
        JFrame frame2 = new JFrame();
        frame2.setSize(500,500);       
        frame2.setVisible(true);
    }
    class StartListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
                //frame.getContentPane().add(new DrawPanel());
                //System.exit(0);
                //
            DrawPanel panel = new DrawPanel();

         }
    }

    class StopListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
               System.exit(0);
        }
    }

    /*
     * Panel created
     * rectangle drawn to random sizes
     */
    class DrawPanel extends JPanel{
        public void paintComponent(Graphics g){
                ran = new Random();
                g.setColor(new Color(ran.nextInt(255),+
                ran.nextInt(255),ran.nextInt(255)));
                height = ran.nextInt(getHeight());
                width = ran.nextInt(getWidth());
                x = ran.nextInt(getWidth()-width);
                y = ran.nextInt(getHeight()-height);
                g.fillRect(x,y,width,height);
                //repaint();
            try{
                Thread.sleep(240);
            }catch(InterruptedException ie){
            }   
            repaint();
        }

    }
}

1 个答案:

答案 0 :(得分:2)

这个片段是杀手锏:

class DrawPanel extends JPanel{
        public void paintComponent(Graphics g){
                ran = new Random();
                g.setColor(new Color(ran.nextInt(255),+
                ran.nextInt(255),ran.nextInt(255)));
                height = ran.nextInt(getHeight());
                width = ran.nextInt(getWidth());
                x = ran.nextInt(getWidth()-width);
                y = ran.nextInt(getHeight()-height);
                g.fillRect(x,y,width,height);
                //repaint();
            try{
                Thread.sleep(240);
            }catch(InterruptedException ie){
            }   
            repaint();
        }

    }
  1. 永远不要在EDT中致电Thread.sleep(240);
  2. 永远不要在repaint();内拨打paintComponent,因为这会产生无限循环
  3. 启动ran一次就足够了,不要在paintComponent中反复重新实例化<{1}}
  4. 将组件添加到框架的方式不正确(Component, int)而不是相反
  5. 使用Java编码约定,即变量和方法是驼峰式的,并以小写字母开头。
  6. 如果您已将按钮添加到面板,则只需将该面板添加到框架而不是按钮。否则就意味着你的面板没用了。
  7. 当您覆盖super.paintComponent时,请不要忘记paintComponent
  8. 每当你需要再次绘制一个组件时(也就是说,你想要调用paintComponent()),在该组件上调用repaint()