我用2D绘图,绘制一张背景在容器上,但是在向容器添加组件,组件不能显示出来,是什么原因啊?

解决方案 »

  1.   

    代码是怎么样的?还有是不是awt组建跟swing组建混合使用了?
      

  2.   

    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.*;import Player.Welcome.CanvasPanel;public class Main extends JFrame {
    private Container container;
    private MyButton playbutton,stopbutton,nextbutton,prebutton;
    private Image img;
    private CanvasPanel c_p;
    JPanel j;
    public Main() {
    container = getContentPane();
    container.setLayout(null);
    setVisible(true);
    setSize(new Dimension(290, 160));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    init();
    j = new JPanel();
    j.setLayout(null);
    c_p = new CanvasPanel();
    c_p.setBounds(0,0,290,160);
    j.add(c_p);
    j.setBounds(0,0,290,160);
    container.add(j);
    }
    public void init(){
    button();
    addbutton();
    }

    public void button(){

    prebutton = new MyButton(new ImageIcon("image/pre1.png"));
    playbutton = new MyButton(new ImageIcon("image/play1.png"));
    stopbutton = new MyButton(new ImageIcon("image/stop1.png"));
    nextbutton = new MyButton(new ImageIcon("image/next1.png"));

    prebutton.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent e) {
    prebutton.setIcon(new ImageIcon("image/pre2.png")); } public void mouseExited(MouseEvent e) {
    prebutton.setIcon(new ImageIcon("image/pre1.png")); }
    });

    playbutton.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent e) {
    playbutton.setIcon(new ImageIcon("image/play2.png")); } public void mouseExited(MouseEvent e) {
    playbutton.setIcon(new ImageIcon("image/play1.png")); }
    });

    stopbutton.addMouseListener(new MouseAdapter(){
    public void mouseEntered(MouseEvent e) {
    stopbutton.setIcon(new ImageIcon("image/stop2.png")); } public void mouseExited(MouseEvent e) {
    stopbutton.setIcon(new ImageIcon("image/stop1.png")); }
    });

    nextbutton.addMouseListener(new MouseAdapter(){
    public void mouseEntered(MouseEvent e) {
    nextbutton.setIcon(new ImageIcon("image/next2.png")); } public void mouseExited(MouseEvent e) {
    nextbutton.setIcon(new ImageIcon("image/next1.png")); }
    }); }
    public void addbutton(){

    prebutton.setBounds(135,80,40,40);
    playbutton.setBounds(165, 80, 40, 40);
    stopbutton.setBounds(195,80,40,40);
    nextbutton.setBounds(225,80,40,40);


    container.add(prebutton);
    container.add(playbutton);
    container.add(stopbutton);
    container.add(nextbutton);

    } public static void main(String[] args) {
    new Main();
    }

    class CanvasPanel extends Canvas {
    public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g1 = (Graphics2D) g;
    img = Toolkit.getDefaultToolkit().getImage("image/m.png");
    g1.drawImage(img, 0, 0, this);
    }
    }}
      

  3.   

    你的按钮是 swing 软件包的组件:JButton类的。 swing 组件是轻量级(lightweit)的。 画 paint(Graphics g) 是awt 软件包的组件、类 或方法,属重量级(heavyweit)。两者混用,重量级的内容将覆盖轻量级的组件。解决方法有二:
    1.将按钮放到另一个容器中, 或,
    2.将按钮改成awt的Buttonl类。很遗憾,这样的按钮中无法按装图标了。
      

  4.   

    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.*;import Player.Welcome.CanvasPanel;public class Main extends JFrame {
    private Container container;
    private MyButton playbutton,stopbutton,nextbutton,prebutton;
    private Image img;
    private CanvasPanel c_p;
    private JPanel j;
    public Main() {
    container = getContentPane();
    container.setLayout(null);
    setVisible(true);
    setSize(new Dimension(290, 160));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    init();
    j = new JPanel();
    j.setLayout(null);
    c_p = new CanvasPanel();
    c_p.setBounds(0,0,290,160);
    j.add(c_p);
    j.setBounds(105,40,160,160);
    j.add(prebutton);
    j.add(playbutton);
    j.add(stopbutton);
    j.add(nextbutton);
    container.add(c_p);
    container.add(j);
    }
    public void init(){
    button();
    addbutton();
    }

    public void button(){

    prebutton = new MyButton(new ImageIcon("image/pre1.png"));
    playbutton = new MyButton(new ImageIcon("image/play1.png"));
    stopbutton = new MyButton(new ImageIcon("image/stop1.png"));
    nextbutton = new MyButton(new ImageIcon("image/next1.png"));

    prebutton.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent e) {
    prebutton.setIcon(new ImageIcon("image/pre2.png")); } public void mouseExited(MouseEvent e) {
    prebutton.setIcon(new ImageIcon("image/pre1.png")); }
    });

    playbutton.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent e) {
    playbutton.setIcon(new ImageIcon("image/play2.png")); } public void mouseExited(MouseEvent e) {
    playbutton.setIcon(new ImageIcon("image/play1.png")); }
    });

    stopbutton.addMouseListener(new MouseAdapter(){
    public void mouseEntered(MouseEvent e) {
    stopbutton.setIcon(new ImageIcon("image/stop2.png")); } public void mouseExited(MouseEvent e) {
    stopbutton.setIcon(new ImageIcon("image/stop1.png")); }
    });

    nextbutton.addMouseListener(new MouseAdapter(){
    public void mouseEntered(MouseEvent e) {
    nextbutton.setIcon(new ImageIcon("image/next2.png")); } public void mouseExited(MouseEvent e) {
    nextbutton.setIcon(new ImageIcon("image/next1.png")); }
    }); }
    public void addbutton(){

    prebutton.setBounds(135,80,40,40);
    playbutton.setBounds(165, 80, 40, 40);
    stopbutton.setBounds(195,80,40,40);
    nextbutton.setBounds(225,80,40,40);





    } public static void main(String[] args) {
    new Main();
    }

    class CanvasPanel extends Canvas {
    public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g1 = (Graphics2D) g;
    img = Toolkit.getDefaultToolkit().getImage("image/m.png");
    g1.drawImage(img, 0, 0, this);
    }
    }}变成这样还是不行啊
      

  5.   


    package untitled3;import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import java.io.File;public class Main
        extends JFrame {
      private Container container;
      private JButton playbutton, stopbutton, nextbutton, prebutton;
      private Image img;
      private CanvasPanel c_p;  public Main() {
        container = getContentPane();
        container.setLayout(null);
        setVisible(true);
        setSize(new Dimension(290, 160));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        c_p = new CanvasPanel();
        c_p.setBounds(0, 0, 290, 160);
        container.add(c_p);
        c_p.add(prebutton);
        c_p.add(playbutton);
        c_p.add(stopbutton);
        c_p.add(nextbutton);  }  public void init() {
        button();
        addbutton();
      }  public void button() {
        prebutton = new JButton(new ImageIcon("image/pre1.png"));
        playbutton = new JButton(new ImageIcon("image/play1.png"));
        stopbutton = new JButton(new ImageIcon("image/stop1.png"));
        nextbutton = new JButton(new ImageIcon("image/next1.png"));
    //....
      }  public void addbutton() {    prebutton.setBounds(135, 80, 40, 40);
        playbutton.setBounds(165, 80, 40, 40);
        stopbutton.setBounds(195, 80, 40, 40);
        nextbutton.setBounds(225, 80, 40, 40);  }  public static void main(String[] args) {
        new Main();
      }  class CanvasPanel
          extends JPanel {
        public void paint(Graphics g) {      Graphics2D g1 = (Graphics2D) g;
          try {
            img = ImageIO.read(ClassLoader.getSystemResource("image/m.jpg"));
          }
          catch (Exception e) {
            System.out.print(e);
          }
          g1.drawImage(img, 0, 0, this);
          super.paintComponents(g);
        }
      }}我这样就行了,楼主自己试试看
      

  6.   

    楼主想做播放器吧,canvaspanel感觉用jpanel就行了,不需要用canvas
    重写paint()方法要注意一下,我怀疑是super.paint()那里错了,所以我改了一下
      

  7.   

     我想要的是背景图片(m.png)能显示出来 而且按钮还是能在上面显示出来
      

  8.   

    问题出在这里
    class CanvasPanel extends Canvas { 
    public void paint(Graphics g) { 
    super.paint(g); // 这里绘制组件自己已经在上面添加的button等
    Graphics2D g1 = (Graphics2D) g; 
    img = Toolkit.getDefaultToolkit().getImage("image/m.png"); 
    g1.drawImage(img, 0, 0, this); //这里又在上面绘图,所以把组件冲刷掉了。


    调下绘制顺序
    最好是用paintComponent方法,不用调顺序:class CanvasPanel extends Canvas { 
        public void paintComponent(Graphics g) { 
            super.paint(g);
             Graphics2D g1 = (Graphics2D) g; 
            img = Toolkit.getDefaultToolkit().getImage("image/m.png"); 
            g1.drawImage(img, 0, 0, this);
        } 

      

  9.   

    用你说的连M.PNG 图也不能绘制出来 是不是 你哪里写错了啊?
      

  10.   

    解决楼主问题的完美方式,用ui:public class SkinedUI extends ComponentUI {
    private Image skinImg;
    public SkinedUI(Image skinImg) {
    this.skinImg = skinImg;
    }
            public void paint(Graphics g, JComponent c) {
    g.drawImage(skinImg, 0, 0, null);
            }
    }把Canvas换成JPanel,Canvas 是awt里的,最好别跟swing混用    Image img = Toolkit.getDefaultToolkit().getImage("image/m.png");
        JPanel panel = new JPanel();
        panel.setUI(new SkinedUI(img));//这里设置ui
        panel.setBounds(0, 0, 290, 160);
        container.add(panel);
        panel.add(prebutton);
    ......
    下一个问题,public void mouseEntered(MouseEvent e) { 
        prebutton.setIcon(new ImageIcon("image/pre2.png")); 

    public void mouseExited(MouseEvent e) { 
        prebutton.setIcon(new ImageIcon("image/pre1.png")); 

    }); 楼主的意思是想鼠标进入和离开的时候分别显示不同的外观吧,API里有现成的,这样就行了:JButton prebutton = new JButton(new ImageIcon("image/pre1.png"));
    prebutton.setRolloverIcon(new ImageIcon(("image/pre2.png"));//这里设置鼠标进入后的外观图片
      

  11.   

    lasfrost 您好 ·· 你能把全部代码 一起附上吗 UI 我没有用过
      

  12.   

    刚才没注意看,你不能显示图片的最主要原因应该是在container 中添加了两个位置重叠的panel。
    这样改应该可以了,我没图片,你试下吧:import java.awt.*;
    import javax.swing.*;public class Main extends JFrame {
    private static final long serialVersionUID = 6255547924567748039L;
    public Main() {
    Container container = getContentPane();
    container.setLayout(null);
    setSize(new Dimension(290, 160));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponents(container);
    setVisible(true);
    } public void initComponents(Container c) {
    JPanel panel = new JPanel() {
    Image img = Toolkit.getDefaultToolkit().getImage("image/m.png");
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 0, 0, null);
    }
    };
    panel.setBounds(0, 0, 290, 160);

    JButton prebutton = new JButton(new ImageIcon("image/pre1.png"));
    prebutton.setRolloverIcon(new ImageIcon("image/pre2.png"));
    prebutton.setBounds(135, 80, 40, 40);
    panel.add(prebutton);

    JButton playbutton = new JButton(new ImageIcon("image/play1.png"));
    playbutton.setRolloverIcon(new ImageIcon("image/play2.png"));
    playbutton.setBounds(165, 80, 40, 40);
    panel.add(playbutton);

    JButton stopbutton = new JButton(new ImageIcon("image/stop1.png"));
    stopbutton.setRolloverIcon(new ImageIcon("image/stop2.png"));
    stopbutton.setBounds(195, 80, 40, 40);
    panel.add(stopbutton);

    JButton nextbutton = new JButton(new ImageIcon("image/next1.png"));
    nextbutton.setRolloverIcon(new ImageIcon("image/next2.png"));
    nextbutton.setBounds(225, 80, 40, 40);
    panel.add(nextbutton);

    c.add(panel);
    } public static void main(String[] args) {
    new Main();
    }
    }
      

  13.   

    lasfrost 按钮放在图片的上面 而不是在下面啊
      

  14.   

    不用ui也行,什么方便用什么吧。
    很久没用swing了,setUI好像是protected的,panel.setUI(new SkinedUI(img));在外部设置ui是错的,额,我发现我的错误还不少,汗
      

  15.   

     解决了 按钮可以放下来了 你的QQ是多少啊  
    lasfrost