本帖最后由 songhu987 于 2011-05-16 16:06:08 编辑

解决方案 »

  1.   

    你的错误原因,见我添加上去的三行注释import java.awt.Color;
    import java.awt.Container;
    import java.awt.Graphics;import javax.swing.JFrame;
    import javax.swing.JPanel;public class drawPolygon {    public static void main(String[] args) {        // 测试坐标数据,将x、y轴坐标分别存储   
            int xpoints[] = {25, 145, 25, 145, 275, 478, 345};
            int ypoints[] = {25, 25, 145, 145, 165, 223, 267};
            int npoints = 7;
            //你帖出来的程序是错误的,你PolygonFrame的构造函数的contentPane.add(panel);
            //你哪来的panel
            //我改了一个,把panel作为参数传递进去
            myPolygonPanel panel = new myPolygonPanel();
            PolygonFrame frame = new PolygonFrame(panel);
            panel.setPoints(xpoints, ypoints, npoints);
    //  Container contentPane = getContentPane();   
    //  contentPane.add(panel);    
            frame.show();
        }
    }class PolygonFrame extends JFrame {    public PolygonFrame(JPanel panel) {
            setTitle(" Polygon ");
            setResizable(false);
            setSize(600, 400);
            Container contentPane = getContentPane();
            contentPane.add(panel);
        }
    }class myPolygonPanel extends JPanel {    int[] xpoints;
        int[] ypoints;
        int npoints;    // 设置坐标参数   
        public void setPoints(int[] x, int[] y, int n) {
            this.xpoints = x;
            this.ypoints = y;
            this.npoints = n;
        }    // 画多边形   
        public void paint(Graphics g) {
            g.setColor(Color.red);
            g.drawPolygon(xpoints, ypoints, npoints); // 首尾相接   
            // g.drawPolyline(xpoints, ypoints, npoints); //首尾未相接   
        }
    }  
      

  2.   

    当时确实是没看出来,也没有想到是这个原因,谢谢wenbodong。第二个小问题是,怎样才能想把先后画出的两个文件的图形同时显示出来? 以及图形的缩放?能给个简单小例子最好
      

  3.   

    什么是先后画出的两个“文件”图形同时显示?不太清楚你的意思。
    至于缩放变换,就是对BufferedImage进行变换嘛。不知道你是否熟悉BufferedImage,用getRGB可以获取它的一个数组,这就是它图像的内容,对此进行操作。不过,Java已经为你提供了强大的图形变换类,不用自己设计了。
    下面是一个演示,程序运行时点击菜单打开一个图片文件,调节滑块可进行缩放。作为一个示例程序,稍微长了一点,你主要是看change2这个函数,再看看pan中的paint就可以了。/*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     *//**
     *
     * @author Administrator
     */
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.*;
    import javax.imageio.ImageIO;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    public class ZoomInAndZoomOut {
        JFrame frame;
        JPanel pan;
        JPanel contentPane;
        JMenuBar menuBar;
        JMenu fileMenu;
        JMenuItem openMenuItem;
        JScrollPane jsp;
        BufferedImage buffer,paintBuffer;
        JSlider opaqueSlider;
        double opaqueValue;
        public ZoomInAndZoomOut(){
            //takePhoto();
            frame=new JFrame();
            pan=new JPanel(){
                public void paint(Graphics g){
                    int width=pan.getWidth();
                    int height=pan.getHeight();
                    g.setColor(Color.WHITE);
                    g.fillRect(0, 0, width, height);
                    if(paintBuffer!=null){
                        g.drawImage(paintBuffer, 0, 0, null);
                    }
                }
            };
            pan.addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                    int x=e.getX();
                    int y=e.getY();
                    System.out.println("["+x+","+y+"]");
                }
            });
            pan.setPreferredSize(new Dimension(800,600));
            contentPane=new JPanel();
            contentPane.setLayout(new BorderLayout());
            setMenu();
            jsp=new JScrollPane(pan);
            jsp.setPreferredSize(new Dimension(800,600));
            contentPane.add(jsp,BorderLayout.CENTER);
            setSlider();
            frame.setContentPane(contentPane);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
        public void setMenu(){
            menuBar=new JMenuBar();
            contentPane.add(menuBar,BorderLayout.NORTH);
            fileMenu=new JMenu("文件");
            menuBar.add(fileMenu);
            openMenuItem=new JMenuItem("打开");
            openMenuItem.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   JFileChooser jfc=new JFileChooser();
                   jfc.setCurrentDirectory(new File("."));
                   jfc.setApproveButtonText("确定");
                   int result=jfc.showOpenDialog(frame);
                   if(result==JFileChooser.APPROVE_OPTION){
                       File f=jfc.getSelectedFile();
                        try {
                            buffer = ImageIO.read(f);
                            paintBuffer = ImageIO.read(f);
                            frame.repaint();
                        } catch (IOException ex) {
                            Logger.getLogger(ZoomInAndZoomOut.class.getName()).log(Level.SEVERE, null, ex);
                        }
                   }
               }
            });
            fileMenu.add(openMenuItem);
        }
        public void setSlider(){
            opaqueSlider=new JSlider();
            opaqueSlider.setMinimum(0);
            opaqueSlider.setMaximum(200);
            opaqueSlider.setMajorTickSpacing(10);
            opaqueSlider.setMinorTickSpacing(2);
            opaqueSlider.setPaintLabels(true);
            opaqueSlider.setPaintTrack(true);
            opaqueSlider.setPaintTicks(true);
            opaqueSlider.setValue(100);
            opaqueValue=1;
            opaqueSlider.addChangeListener(new ChangeListener(){
                public void stateChanged(ChangeEvent e){
                    opaqueValue=opaqueSlider.getValue()/100.0;
                    change2(opaqueValue);
                    int width=(int)(buffer.getWidth()*opaqueValue);
                    int height=(int)(buffer.getHeight()*opaqueValue);
                    pan.setPreferredSize(new Dimension(width,height));
                    jsp.updateUI();
                    frame.repaint();
                    System.out.println(opaqueValue);
                }
            });
            contentPane.add(opaqueSlider,BorderLayout.SOUTH);
        }
        public void change2(double rate){
            //生成一个缩放变换,两个参数分别是X轴、Y轴的缩放因子
            AffineTransform transform = AffineTransform.getScaleInstance(rate,rate);
            //构造线性映射
            AffineTransformOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
            //进行变换
            paintBuffer=op.filter(buffer, null);
        }
        public static void main(String args[]){
            new ZoomInAndZoomOut();
        }
    }对于同时显示两个图片的问题,可以加我QQ:815611030,备注说明:Java