[Note]SelectionDemo


import javax.swing.event.MouseInputAdapter;
import java.awt.event.MouseEvent;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.BoxLayout;

public class SelectionDemo {

    JFrame frame = new JFrame("SelectionDemo");
    JButton Get = new JButton("Get it");
    JButton finish = new JButton("Ok");
    JButton cancel = new JButton("Cancel");
    boolean iscut = false;
    Rectangle2D rectsave = new Rectangle2D.Double(0.0, 0.0, 0.0, 0.0);
    Rectangle2D orgrect = new Rectangle2D.Double(0.0, 0.0, 0.0, 0.0);
    private SelectEndingHandler handler;
    static ImageIcon imgicon = null;
    JLabel label;
    JPanel bigpanel = new JPanel();
    JPanel panel = new JPanel();
    JPanel buttonpanel = new JPanel();

    SelectionDemo() {
    }

    public void show(SelectEndingHandler handler, String starFile) {
        this.handler = handler;
        finish.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (iscut == true) {
                    frame.dispose();
                } else {
                    JOptionPane.showMessageDialog(null, "u have not cut already");
                }
            }
        });

        cancel.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                saveAs sve = new saveAs("./images/selectsave.JPG", imgicon.getImage(), orgrect);
                sve.save();
                frame.dispose();
                dispose();
            }
        });

        Get.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if ((rectsave.getWidth() >= 150) && (rectsave.getHeight() >= 150)) {
                    saveAs sve = new saveAs("./images/selectsave.JPG", imgicon.getImage(), rectsave);
                    sve.save();
                    dispose();
                    iscut = true;
                } else {
                    JOptionPane.showMessageDialog(null, "Size of the image is too small");
                }
            }
        });

        label = new JLabel("Drag within the image.");
        imgicon = createImageIcon(starFile);
        orgrect = new Rectangle2D.Double(0.0, 0.0, (double) imgicon.getIconWidth(), (double) imgicon.getIconHeight());
        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
        SelectionArea area = new SelectionArea(imgicon, this);
        panel.add(area);
        label.setLabelFor(area);
        panel.add(label);
        buttonpanel.add(Get);
        buttonpanel.add(finish);
        buttonpanel.add(cancel);
        area.setAlignmentX(Component.LEFT_ALIGNMENT);
        label.setAlignmentX(Component.LEFT_ALIGNMENT);
        bigpanel.add(panel);
        bigpanel.add(buttonpanel);
        frame.setLocation(80, 80);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(false);
        frame.add(bigpanel);
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public void dispose() {
        handler.selectEnded(this);
    }

    public void updateLabel(Rectangle rect) {
        int width = rect.width;
        int height = rect.height;

        //Make the coordinates look OK if a dimension is 0.
        if (width == 0) {
            width = 1;
        }
        if (height == 0) {
            height = 1;
        }

        label.setText("size=(" + rect.width + "X" + rect.height + ")");

    }

    protected static ImageIcon createImageIcon(String path) {
        if (path != null) {
            return new ImageIcon(path);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    private class SelectionArea extends JLabel {

        Rectangle currentRect = null;
        Rectangle rectToDraw = null;
        Rectangle previousRectDrawn = new Rectangle();
        SelectionDemo controller;

        public SelectionArea(ImageIcon image, SelectionDemo controller) {
            super(image); //This component displays an image.
            this.controller = controller;
            setOpaque(true);
            setMinimumSize(new Dimension(10, 10)); //don't hog space

            MyListener myListener = new MyListener();
            addMouseListener(myListener);
            addMouseMotionListener(myListener);
        }

        private class MyListener extends MouseInputAdapter {

            public void mousePressed(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                currentRect = new Rectangle(x, y, 0, 0);
                updateDrawableRect(getWidth(), getHeight());
                repaint();
            }

            public void mouseDragged(MouseEvent e) {
                updateSize(e);
            }

            public void mouseReleased(MouseEvent e) {
                updateSize(e);
            }

            void updateSize(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                currentRect.setSize(x - currentRect.x,
                        y - currentRect.y);
                updateDrawableRect(getWidth(), getHeight());
                Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
                repaint(totalRepaint.x, totalRepaint.y,
                        totalRepaint.width, totalRepaint.height);
            }
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //paints the background and image

            //If currentRect exists, paint a box on top.
            if (currentRect != null) {
                //Draw a rectangle on top of the image.
                g.setXORMode(Color.white); //Color of line varies
                //depending on image colors
                g.drawRect(rectToDraw.x, rectToDraw.y,
                        rectToDraw.width - 1, rectToDraw.height - 1);

                controller.updateLabel(rectToDraw);
                rectsave = rectToDraw;
            }
        }

        private void updateDrawableRect(int compWidth, int compHeight) {
            int x = currentRect.x;
            int y = currentRect.y;
            int width = currentRect.width;
            int height = currentRect.height;

            //Make the width and height positive, if necessary.
            if (width < 0) {
                width = 0 - width;
                x = x - width + 1;
                if (x < 0) {
                    width += x;
                    x = 0;
                }
            }
            if (height < 0) {
                height = 0 - height;
                y = y - height + 1;
                if (y < 0) {
                    height += y;
                    y = 0;
                }
            }

            //The rectangle shouldn't extend past the drawing area.
            if ((x + width) > compWidth) {
                width = compWidth - x;
            }
            if ((y + height) > compHeight) {
                height = compHeight - y;
            }

            //Update rectToDraw after saving old value.
            if (rectToDraw != null) {
                previousRectDrawn.setBounds(
                        rectToDraw.x, rectToDraw.y,
                        rectToDraw.width, rectToDraw.height);
                rectToDraw.setBounds(x, y, width, height);
            } else {
                rectToDraw = new Rectangle(x, y, width, height);
            }
        }
    }
}

你可能感兴趣的:(swing)