如何制作已在Java中拆分的图像?

时间:2016-10-06 13:28:36

标签: java image swing button jframe

程序允许用户选择图片,然后选择要制作的图片数量。目标(稍后)是在每件作品下面都有数学问题。因此,如果他们选择4个问题,那么图片将被分成4个部分,每个部分下面将是一个数学问题(当然总共4个)。我的问题是:我如何才能实现这一目标?我已经读过我需要一个鼠标监听器,但是我不确定这是否是正确的方法,在这种情况下我不太确定如何使用它们。

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;

public class Menu extends JFrame {
    JMenuBar menuBar;
    ButtonGroup pictureGroup, problemsGroup;
    BufferedImage picture1img, picture2img, picture3img;
    JMenu choiceOfThreePictures, numberOfProblems;
    JRadioButtonMenuItem picture1, picture2, picture3, fourProblems, nineProblems, sixteenProblems;
    private String picture1Address = "/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture1.jpg";
    private String picture2Address = "/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture2.jpg";
    private String picture3Address = "/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture3.jpg";
    KeyStroke picture1HotKey, picture2HotKey, picture3HotKey, fourProblemsHotKey, nineProblemsHotKey, sixteenProblemsHotKey;
    public Menu() {
        // Create the menu bar.
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        // Create Picture choices on Menu Bar and make Mnemonic 
        choiceOfThreePictures = new JMenu("Picture Choices");
        choiceOfThreePictures.setMnemonic(KeyEvent.VK_J);

        // Add Picture choices on Menu Bar
        menuBar.add(choiceOfThreePictures);

        // Create MenuItems onto Picture choices
        pictureGroup = new ButtonGroup();

        // Create button and accelerator for picture 1
        picture1 = new JRadioButtonMenuItem("Picture 1");
        picture1HotKey = KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_DOWN_MASK);
        picture1.setAccelerator(picture1HotKey);

        // Create button and accelerator for picture 2
        picture2 = new JRadioButtonMenuItem("Picture 2");
        picture2HotKey = KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_DOWN_MASK);
        picture2.setAccelerator(picture2HotKey);

        // Create button and accelerator for picture 3
        picture3 = new JRadioButtonMenuItem("Picture 3");
        picture3HotKey = KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.CTRL_DOWN_MASK);
        picture3.setAccelerator(picture3HotKey);

        // Add Picture Choices to Picutre choices menu
        choiceOfThreePictures.add(picture1);
        pictureGroup.add(picture1);
        choiceOfThreePictures.add(picture2);
        pictureGroup.add(picture2);
        choiceOfThreePictures.add(picture3);
        pictureGroup.add(picture3);

        // Create Number Of Problems on Menu Bar and make Mnemonic
        numberOfProblems = new JMenu("Number Of Problems");
        numberOfProblems.setMnemonic(KeyEvent.VK_T);

        // Add Number Of problems on Menu Bar
        menuBar.add(numberOfProblems);

        // Create Menu Items onto Number Of problems
        problemsGroup = new ButtonGroup();

        // Create button and accelerator for fourProblems 
        fourProblems = new JRadioButtonMenuItem("4");
        fourProblemsHotKey = KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK);
        fourProblems.setAccelerator(fourProblemsHotKey);

        // Create button and accelertor for nineProblems
        nineProblems = new JRadioButtonMenuItem("9");
        nineProblemsHotKey = KeyStroke.getKeyStroke(KeyEvent.VK_F9, KeyEvent.CTRL_DOWN_MASK);
        nineProblems.setAccelerator(nineProblemsHotKey);

        // Create button and accelerator for sixteenProblems
        sixteenProblems = new JRadioButtonMenuItem("16");
        sixteenProblemsHotKey = KeyStroke.getKeyStroke(KeyEvent.VK_F12, KeyEvent.CTRL_DOWN_MASK);
        sixteenProblems.setAccelerator(sixteenProblemsHotKey);

        // Add Number Of problems onto menu
        numberOfProblems.add(fourProblems);
        problemsGroup.add(fourProblems);
        numberOfProblems.add(nineProblems);
        problemsGroup.add(nineProblems);
        numberOfProblems.add(sixteenProblems);
        problemsGroup.add(sixteenProblems);

        // Start creating ActionListeners for pictures
        picture1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture1img = ImageIO.read(new File(picture1Address));
                    getContentPane().removeAll();
                    getContentPane().add(new JLabel(new ImageIcon(picture1img)));
                    revalidate();
                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
        picture2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture2img = ImageIO.read(new File(picture2Address));
                    getContentPane().removeAll();
                    getContentPane().add(new JLabel(new ImageIcon(picture2img)));
                    revalidate();
                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
        picture3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture3img = ImageIO.read(new File(picture3Address));
                    getContentPane().removeAll();
                    getContentPane().add(new JLabel(new ImageIcon(picture3img)));
                    revalidate();

                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
        // Create Action Listeners for problems
        fourProblems.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                if (picture1.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture1Address, 2);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture2.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture2Address, 2);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture3.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture3Address, 2);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        });
        nineProblems.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                if (picture1.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture1Address, 3);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture2.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture2Address, 3);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture3.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture3Address, 3);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        });
        sixteenProblems.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                if (picture1.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture1Address, 4);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture2.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture2Address, 4);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                } else if (picture3.isSelected()){
                    try {
                        getContentPane().removeAll();
                        imageSplitter(picture3Address, 4);
                        revalidate();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        });
    }
    // Image Splitter Method
        public void imageSplitter(String filename, int rowsandcolumns) throws IOException {
            getContentPane().setLayout(new GridLayout(rowsandcolumns, rowsandcolumns));
            // reads in file as an image
            BufferedImage image = ImageIO.read(new File(filename));
            int rows = rowsandcolumns; // You should decide the values for rows and cols
                            // variables
            int columns = rowsandcolumns;
            int chunks = rows * columns;
            int chunkWidth = image.getWidth() / columns; // determines the chunk
                                                            // width and height
            int chunkHeight = image.getHeight() / rows;
            int count = 0;
            // initialize array to store 4 new images
            BufferedImage images[] = new BufferedImage[chunks];

            // For loop for rows
            for (int x = 0; x < rows; x++) {
                // For loop for columns
                for (int y = 0; y < columns; y++) {

                    // Creates subimages of the main image and stores them in the
                    // order of Quadrant II, III, I, IV
                    images[count] = image.getSubimage((x * chunkWidth), (y * chunkHeight), chunkWidth, chunkHeight);
                    count++;
                }
            }
            // For Loop that writes the each of the 4 new images from the array.
            for (int i = 1; i < images.length + 1; i++) {
                // ImageIO.write(images[i - 1], "jpg", new File("image" + i +
                // ".jpg"));
                getContentPane().add(new JLabel(new ImageIcon(images[i - 1])));

            }
        }

    public static void main(String[] args) {
        Menu mb = new Menu();
        mb.setSize(900, 700);
        mb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mb.setVisible(true);

    }
}

1 个答案:

答案 0 :(得分:0)

这是一个类ImageButton,它是一个显示图像部分的按钮,当点击该按钮时它会显示问题。

public class ImageButton extends JButton{
    private String problem;
    private BufferedImage image;
    private Boolean status;//true -> image, false -> problem, null -> answered

    public ImageButton(String problem, BufferedImage image, int x, int y, int width, int height){
        this.image = image.subImage(x,y,width,height);
        this.problem = problem;
        this.setFocusPainted(false);
        this.setBorderPainted(false);
        this.setContentAreaFilled(false);
        this.addActionListener(new DefaultListener());
        this.status = true;
    }

    public void action(){
        if(status == true){
            status = false;
        }
    }

    public void answer(){
        if(status == false){
            status = null;
        }
    }

    public void paintComponent(Graphics g){
        if(status == null){
            // TODO what will happen after it is answered
        }else{
            g.drawImage(image, 0, 0, this);
            if(!status){
                printString(g, problem, 10);
            }
        }
    }

    public static void printString(Graphics g, String string, int height) {
        if (string != null) {
            int width = g.getFontMetrics().stringWidth(string);
            int length = string.length();
            if (width > getWidth() - 40) {
                length = cutString(g, string);
                g.drawString(string.substring(0, length), 20, height);
                printString(g, string.substring(length), height + 35);
            }
            g.drawString(string.substring(0, length), 20, height);
        }
    }

    public static int cutString(Graphics g, String string) {
        int count = 1;
        int space = 0;
        while (g.getFontMetrics().stringWidth(string.substring(0, count)) < getWidth() - 40) {
            if (string.charAt(count) == 32) {
                space = count;
            }
            count++;
        }
        return space;
    }
}

以下是ActionListener,我这样做的原因是因为这样更优雅,更容易在将来进行审核和维护。

public class DefaultListener implements ActionListener{

    @override
    public void actionPerformed(ActionEvent event){
        Object source = event.getSource();
        if(source instanceof ImageButton){
            (ImageButton)source.action();
        }
    }

}

最后,这是获取图像的方法:

public JPanel getPanel(BufferedImage image, int count){
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, 1));//0 is horizontal, 1 is vertical
    int columns = (int)Math.ceil(Math.sqrt(count));
    int rows = (int)Math.ceil((double)count / (double)columns);
    int imageHeight = image.getHeight();
    int imageWidth = image.getWidth();
    int buttonWidth = imageWidth / columns;
    int buttonHeight = imageHeight / rows;
    int index = 0;
    for(int row = 0; row < rows; row++){
        JPanel smallPanel = new JPanel();
        smallPanel.setLayout(new BoxLayout(panel, 0));
        for(int column = 0; column < columns; column++){
            if(index >= count){
                break;
            }
            int x = buttonWidth * column;
            int y = buttonHeight * row;
            int width = buttonWidth;
            int height = buttonHeight;
            ImageButton button = new ImageButton(--Insert Problem--,image, x,y,width,height);
            smallPanel.add(button);
        }
        panel.add(smallPanel);
        index++;
    }
    return panel;
}