缩放效果未在框架中显示

时间:2013-10-30 04:46:51

标签: java swing netbeans

以下是我的代码。我试图通过移动滑块来实现缩放。 然而,效果并没有表现出来。请帮帮我。我搞不清楚了。我是java新手,我正在使用Netbeans。

我还需要单击缩放的图像并在实际图像中显示相应的点。我怎样才能做到这一点?

public class TrialZoom extends javax.swing.JFrame {

/**
 * Creates new form TrialZoom
 */
private float scaleX, scaleY;
Point p = new Point();
Point q = new Point();
Vector<Point> v = new Vector();
Vector<Float> v_scale = new Vector();

public TrialZoom() {
    initComponents();
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jButton1 = new javax.swing.JButton();
    jPanel2 = new javax.swing.JPanel();
    jPanel3 = new javax.swing.JPanel();
    jSlider2 = new javax.swing.JSlider();
    jPanel4 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jPanel1.setLayout(new java.awt.GridLayout(1, 0));

    jButton1.setText("Done");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });
    jPanel1.add(jButton1);

    getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END);

    jPanel2.setLayout(new java.awt.BorderLayout());

    jPanel3.setLayout(new java.awt.GridLayout(1, 0));

    jSlider2.addChangeListener(new javax.swing.event.ChangeListener() {
        public void stateChanged(javax.swing.event.ChangeEvent evt) {
            jSlider2StateChanged(evt);
        }
    });
    jPanel3.add(jSlider2);

    jPanel2.add(jPanel3, java.awt.BorderLayout.PAGE_END);

    jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jLabel1MouseClicked(evt);
        }
    });

    javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
    jPanel4.setLayout(jPanel4Layout);
    jPanel4Layout.setHorizontalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addGap(0, 200, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(0, 200, Short.MAX_VALUE)))
    );
    jPanel4Layout.setVerticalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 251, Short.MAX_VALUE)
        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addGap(0, 125, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(0, 126, Short.MAX_VALUE)))
    );

    jPanel2.add(jPanel4, java.awt.BorderLayout.CENTER);

    getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

    pack();
}// </editor-fold>                        

private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) {                                      
    // TODO add your handling code here:
    int val = ((JSlider) evt.getSource()).getValue();
    setScale(val * .01f, val * .01f);
}                                     

private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
 setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.CROSSHAIR_CURSOR));
    p = evt.getPoint();
    q = SwingUtilities.convertPoint(evt.getComponent(), p, this);

    v.add(p);
    v_scale.add(scaleX);
    v_scale.add(scaleY);



    double c = q.getX();
    double d = q.getY();

    String x1 = Double.toString(p.getX());
    String x2 = Double.toString(p.getY());


    Graphics g = this.getGraphics();
    paint(g, (int) c, (int) d);        // TODO add your handling code here:
}                                    

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
System.out.println(p.getX() + "  " + p.getY() + "  " + q.getX() + "  " + q.getY());
    float sx=v_scale.remove(0);
    float sy=v_scale.remove(0);

    System.out.println(sx+" "+sy);

    dispose();
    // TODO add your handling code here:
}                                        

 public Vector<Point> first(ImageIcon icon) {

     jLabel1.setIcon(icon);
 return return_vector();
 }


public void paint(Graphics g, int a, int b) {
    g.setColor(Color.RED);
    g.drawRect(a - 1, b - 1, 3, 3);
    g.fillRect(a, b, 2, 2);
}


@Override
public Dimension getPreferredSize() {

    int prefWidth;
    prefWidth = (int) (jLabel1 == null ? 0 : jPanel4.getWidth() * scaleX);
    int prefHeight;
    prefHeight = (int) (jLabel1 == null ? 0 : jPanel4.getHeight() * scaleY);

    return new Dimension(prefWidth, prefHeight);
}

    public void paintComponent(Graphics g) {
    if (jLabel1 == null) {
        return;
    }

    int w = (int) (jLabel1.getWidth() * scaleX);
    int h = (int) (jLabel1.getHeight() * scaleY);

    int x = (getWidth() - w) / 2;
    int y = (getHeight() - h) / 2;
    ImageIcon img_icon=(ImageIcon) jLabel1.getIcon();
    g.drawImage(img_icon.getImage(), x, y, w, h, null);
}

public void setScale(float x, float y) {
    this.scaleX = x;
    this.scaleY = y;
    jLabel1.revalidate();
    jLabel1.repaint();
}

 public Vector<Point> return_vector() {
    return this.v;
}

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(TrialZoom.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TrialZoom.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(TrialZoom.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TrialZoom.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TrialZoom().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JSlider jSlider2;
// End of variables declaration                   
}

1 个答案:

答案 0 :(得分:1)

首先,从能够管理图像和缩放的组件开始。这应该是你可以做到的自包含。这使您可以解耦程序并专注于应用程序的个人职责。

接下来,您需要维护一个标准化点列表。对它们进行标准化的原因是为了确保在缩放图像时,点将继续在正确的位置渲染...

请查看Performing Custom Painting了解详情

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ZoomExample {

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

    public ZoomExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ZoomPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ZoomPane extends JPanel {

        private JSlider slider;
        private ZoomImagePane zoomImagePane;

        public ZoomPane() {
            zoomImagePane = new ZoomImagePane();
            slider = new JSlider(1, 200);
            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    zoomImagePane.setScale((float) slider.getValue() / 100f);
                }
            });

            setLayout(new BorderLayout());
            add(slider, BorderLayout.SOUTH);
            add(zoomImagePane);

            slider.setValue(100);

        }

    }

    public class ZoomImagePane extends JPanel {

        private float scale = 0f;
        private BufferedImage master;
        private Image scaled;

        private List<Point2D> clickPoints;

        public ZoomImagePane() {
            clickPoints = new ArrayList<>(25);
            try {
                master = ImageIO.read(new File("/path/to/image"));
                setScale(1f);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    Point p = e.getPoint();
                    Point2D scaledPoint = new Point2D.Float();

                    int xOffset = (getWidth() - scaled.getWidth(null)) / 2;
                    int yOffset = (getHeight() - scaled.getHeight(null)) / 2;

                    float x = (float)(p.x - xOffset) / (float)scaled.getWidth(null);
                    float y = (float)(p.y - yOffset) / (float)scaled.getHeight(null);

                    scaledPoint.setLocation(x, y);
                    clickPoints.add(scaledPoint);
                    repaint();
                }

            });
        }

        protected void setScale(float value) {

            if (scale != value) {

                scale = value;
                scaled = master.getScaledInstance((int) ((float) master.getWidth() * scale), -1, Image.SCALE_SMOOTH);
                revalidate();
                repaint();

            }

        }

        @Override
        public Dimension getPreferredSize() {

            Dimension size = new Dimension(200, 200);
            if (scaled != null) {

                size = new Dimension(scaled.getWidth(this), scaled.getHeight(this));

            }

            return size;

        }

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);
            if (scaled != null) {

                int x = (getWidth() - scaled.getWidth(this)) / 2;
                int y = (getHeight() - scaled.getHeight(this)) / 2;

                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(scaled, x, y, this);

                g2d.setColor(Color.RED);
                for (Point2D p : clickPoints) {
                    int xPos = x + ((int)(p.getX() * scaled.getWidth(this)) - 5);
                    int yPos = y + ((int)(p.getY() * scaled.getHeight(this)) - 5);

                    g2d.fillOval(xPos, yPos, 10, 10);
                }

                g2d.dispose();
            }
        }
    }
}