缩放效果未显示在框架中 [英] Zooming effect not shown in the frame

查看:78
本文介绍了缩放效果未显示在框架中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我下面的代码.我正在尝试通过移动滑块来实现缩放. 但是,效果没有显示.请帮我.我搞不清楚了.我是Java的新手,为此我正在使用Netbeans.

Here is my code below. I am trying to implement zooming by moving the slider. However, the effect does'nt show. Please help me on this. I am lost. I am new to java and I am using Netbeans for this.

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

I further need to click on the zoomed image and display the corresponding points in the actual image. How can I make this possible?

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                   
}

推荐答案

首先,从一个能够管理图像和缩放比例的组件开始.这应该是您自己可以做到的.这使您可以取消程序的耦合,并专注于应用程序的各个职责.

First, start with a component that is capable of managing the image and scaling. This should be as self contained as you can make it. This allows you to decouple your program and focus on individual responsibilities of the application.

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

Next, you need to maintain a list of normalised points. The reason for normalising them is to ensure that the points will continue to be rendered at the right locations when the image scaled...

有关更多详细信息,请参见执行自定义绘画

Take a look at Performing Custom Painting for more details

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();
            }
        }
    }
}

这篇关于缩放效果未显示在框架中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆