0

下面是我的代码。我正在尝试通过移动滑块来实现缩放。但是,效果不显示。请帮助我。我搞不清楚了。我是 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                   
}
4

1 回答 1

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();
            }
        }
    }
}
于 2013-10-30T05:46:18.130 回答