public static void main(String[] args) throws Exception {        final JFrame jf = new JFrame();
        final JButton jb3 = new JButton("dd3");        final JPanel jj=new JPanel();
        final JPanel j=new JPanel(){
            public void paint(Graphics g) {
                try {
                    Graphics2D gd = (Graphics2D) g;
                    Line2D l=new Line2D.Float(-0.5f,-0.5f,80.0f,30.0f);
                    gd.draw(l);
                } catch (Exception ex) {
                }
            }
        };        Image iiii = javax.imageio.ImageIO.read(new File("jt.gif"));
        final NewJPanel jdf=new NewJPanel(iiii);
        j.setBackground(Color.RED);       final  javax.swing.JButton jButton1 = new javax.swing.JButton("不正常添加");        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jf.invalidate();
                jj.add(jb3, BorderLayout.CENTER);
                //jf.add(jb3, BorderLayout.WEST);
                jf.validate();
                System.out.println("sdfsd");
            }
        });        final JButton jb2 = new JButton("添加正常");
        jb2.setIcon(new javax.swing.ImageIcon("t.png"));
        jb2.setOpaque(false);
        jb2.setBorder(null);
        jb2.setBorderPainted(false);
        jb2.setFocusPainted(false);
        jb2.setContentAreaFilled(false);
        jb2.setRolloverIcon(new javax.swing.ImageIcon("m.png"));        jb2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jf.invalidate();
                jf.add(jb3, BorderLayout.EAST);
                jf.validate();
                System.out.println("sdfsd");
            }        });        jf.add(jButton1, BorderLayout.NORTH);
        jf.add(jb2, BorderLayout.SOUTH);
        jj.setOpaque(false);
        jj.setBorder(null);
        //jj.setBorderPainted(false);
        //jj.setFocusPainted(false);
        //jj.setContentAreaFilled(false);
        j.add(jj);
        jf.add(j,BorderLayout.CENTER);
        jf.setVisible(true);
        jf.setSize(800, 600);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

解决方案 »

  1.   

    问题就是在一个画了背景图的panel上,动态添加按钮,不能立即显示,只有鼠标挪到按钮的位置上才显示;
    这个按钮如果设置了imageIcon,并且设置背景透明的时候,按钮怎么也显示不出来。
      

  2.   

    问题就是在一个画了背景图的panel上,动态添加按钮,不能立即显示,只有鼠标挪到按钮的位置上才显示; 
    这个按钮如果设置了imageIcon,并且设置背景透明的时候,按钮怎么也显示不出来。这段话能看明白么?
      

  3.   

    你试试,在每次添加后repaint()一下
      

  4.   

    java中事件存放在EventQueue中有EDT(Event Dispatch Thread)派发 
    而Swing的绘制也因此分为 异步重绘请求 和 同步绘制请求 
    异步绘制请求 
    1、 Component.repaint(); 
    2、 Component.repaint(int x ,int y ,int width ,int height); 
    同步绘制请求 
    1、JComponent.paintImmediately(int x ,int y ,int w ,int h); 
    2、Component.paint(Graphics); 
    有时用repaint()无法更新界面时,就是由于异步绘制请求不能马上被执行 
    所以这时就可以考虑使用同步绘制请求