解决方案 »

  1.   

    重载Jpanel的paintComponent(Graphics g)方法就好了import java.awt.Graphics;import javax.swing.JFrame;
    import javax.swing.JPanel;class DemoPanel extends JPanel {
        public DemoPanel() {
        }
        @Override
        protected void paintComponent(Graphics g) {
            g.drawLine(0, 0, 100, 200);
        }
        
    }
    public class Test extends JFrame{
        Test(){
            setSize(300, 300);
            add(new DemoPanel());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public static void main(String[] args) {
            new Test().setVisible(true);
        }
    }
      

  2.   

    查了下资料,用java.awt.robot这个类的createScreenCapture可以截屏,然后用ImageIO.write成文件。
    但截屏的坐标和大小需要自己算,有点不好弄。
      

  3.   

    自己写了一个示例,备忘public class Demo extends JFrame {
        private JButton btn1 = new JButton("截屏");    Demo() {
            setTitle("截屏demo");
            setSize(300, 300);
            add(btn1, BorderLayout.SOUTH);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        btn1.addActionListener(new ActionListener() {            @Override
                public void actionPerformed(ActionEvent e) {
                    new Thread(new Runnable() {                    @Override
                        public void run() {
                            Robot robot;
                            try {
                                robot = new Robot();
                                Rectangle rect = Demo.this.getBounds();
                                BufferedImage img = robot.createScreenCapture(rect);
                                ImageIO.write(img, "jpg", new File("a.jpg"));
                            } catch (Exception e) {
                                e.printStackTrace();
                            }                    }
                    }).start();
                }
            });
        }    public static void main(String[] args) {
            new Demo().setVisible(true);
        }
    }
      

  4.   

    我试了一下,我发现createScreenCapture方法截的是电脑的显示屏,不是截当前panel中的图像。
      

  5.   

    这个问题我已经解决了,代码如下:
    public void drawPathShowImage(){ 
     
      Image pathImage = Toolkit.getDefaultToolkit().getImage("./source/THU_2Dmap.jpg");
            //首先创建一个BufferedImage变量,
            BufferedImage bi = new BufferedImage((int)map2Dimension.getWidth(), (int)map2Dimension.getHeight(),
             BufferedImage.TYPE_3BYTE_BGR);         //再创建一个Graphics变量,用来画出来要保持的图片 
            Graphics2D g = (Graphics2D) bi.getGraphics(); 
            try { 
                g.drawImage(pathImage, 0, 0, null);
                g.setColor(Color.RED);
                g.setStroke(new BasicStroke(8.0f));
                g.drawLine(0, 0, 5000, 4000);
                
                //将BufferedImage变量写入文件中。 
                ImageIO.write(bi,"jpg",new File("d:\\test.jpg")); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        }
      

  6.   

    可是有个问题,我的面板里的图片可以切换。
    如果当前面板里显示的不是“./source/THU_2Dmap.jpg"这个图片,保存的就是一张有红线的黑底图片。如果当前显示的就是这个图片,保存的在这个图片上画了红线的图片。
      

  7.   

    写了一个可以随机切换的demo,备忘先随机加载一幅图,截图以后存传文件,然后再随机换图。
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.Random;import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;class DPanel extends JPanel{
        private ImageIcon[] images = null;
        private JLabel lbl = null;
        
        private void initImages() {
            images = new ImageIcon[] { new ImageIcon("a.jpg"),
                    new ImageIcon("b.jpg"), new ImageIcon("c.jpg") };
            lbl = new JLabel(images[new Random().nextInt(images.length)]);
        }
        
        DPanel(){
            initImages();
            add(lbl);
            setBorder(BorderFactory.createLineBorder(Color.BLUE));
        }
        
        JLabel getLbl(){
            return this.lbl;
        }
        
        ImageIcon[] getImgs(){
            return this.images;
        }
    }public class Demo extends JFrame {
        private JButton btn1 = new JButton("截屏");
        private DPanel panel = new DPanel();    Demo() {
            setTitle("截屏demo");
            setSize(300, 300);
            add(panel, BorderLayout.CENTER);
            add(btn1, BorderLayout.SOUTH);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        btn1.addActionListener(new ActionListener() {            @Override
                public void actionPerformed(ActionEvent e) {
                    new Thread(new Runnable() {                    @Override
                        public void run() {
                            try {
                                BufferedImage img = new BufferedImage(
                                        panel.getLbl().getIcon().getIconWidth(),
                                        panel.getLbl().getIcon().getIconHeight(),
                                        BufferedImage.TYPE_3BYTE_BGR);
                                Graphics2D g2 = img.createGraphics();
                                g2.drawImage(((ImageIcon)panel.getLbl().getIcon()).getImage(), 
                                        0, 0, null);
                                g2.setColor(Color.BLUE);
                                g2.setStroke(new BasicStroke(8.0f));
                                g2.drawLine(0, 0, 500, 500);
                                ImageIO.write(img, "jpg", new File("screenshot.jpg"));
                                
                                // 截屏以后随机选一幅图新加载到JLabel中
                                ImageIcon[] images = panel.getImgs();
                                JLabel lbl = panel.getLbl();
                                int n = new Random().nextInt(images.length);
                                lbl.setIcon(images[n]);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }                    }
                    }).start();
                }
            });
        }    public static void main(String[] args) {
            new Demo().setVisible(true);
        }
    }