{"id":25488,"date":"2024-09-07T03:46:29","date_gmt":"2024-09-06T18:46:29","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25488"},"modified":"2024-09-07T03:46:31","modified_gmt":"2024-09-06T18:46:31","slug":"java-%e3%83%9a%e3%82%a4%e3%83%b3%e3%83%88%e3%82%bd%e3%83%95%e3%83%88","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25488","title":{"rendered":"Java \u30da\u30a4\u30f3\u30c8\u30bd\u30d5\u30c8"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.*;\nimport java.awt.image.BufferedImage;\nimport java.util.Stack;\nimport javax.imageio.ImageIO;\nimport java.io.File;\n\npublic class AdvancedPaintAppWithUndoRedo extends JFrame {\n\n    private DrawPanel drawPanel;\n    private Color currentColor = Color.BLACK;\n    private int brushSize = 4;\n    private String currentTool = \"Brush\";\n    private Stack&lt;BufferedImage> undoStack = new Stack&lt;>();\n    private Stack&lt;BufferedImage> redoStack = new Stack&lt;>();\n\n    public AdvancedPaintAppWithUndoRedo() {\n        setTitle(\"Advanced Paint Application with Undo\/Redo\");\n        setSize(800, 600);\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n\n        drawPanel = new DrawPanel();\n        add(drawPanel, BorderLayout.CENTER);\n\n        \/\/ \u30e1\u30cb\u30e5\u30fc\u30d0\u30fc\u306e\u4f5c\u6210\n        JMenuBar menuBar = new JMenuBar();\n        JMenu fileMenu = new JMenu(\"File\");\n        JMenuItem saveItem = new JMenuItem(\"Save\");\n        JMenuItem openItem = new JMenuItem(\"Open\");\n        JMenuItem clearItem = new JMenuItem(\"Clear\");\n        saveItem.addActionListener(e -> saveImage());\n        openItem.addActionListener(e -> openImage());\n        clearItem.addActionListener(e -> drawPanel.clearCanvas());\n        fileMenu.add(saveItem);\n        fileMenu.add(openItem);\n        fileMenu.add(clearItem);\n        menuBar.add(fileMenu);\n\n        JMenu toolMenu = new JMenu(\"Tools\");\n        JMenuItem colorItem = new JMenuItem(\"Choose Color\");\n        JMenuItem brushItem = new JMenuItem(\"Brush Size\");\n        JMenuItem toolBrush = new JMenuItem(\"Brush\");\n        JMenuItem toolLine = new JMenuItem(\"Line\");\n        JMenuItem toolRect = new JMenuItem(\"Rectangle\");\n        JMenuItem toolOval = new JMenuItem(\"Oval\");\n        JMenuItem toolText = new JMenuItem(\"Text\");\n\n        colorItem.addActionListener(e -> chooseColor());\n        brushItem.addActionListener(e -> chooseBrushSize());\n        toolBrush.addActionListener(e -> currentTool = \"Brush\");\n        toolLine.addActionListener(e -> currentTool = \"Line\");\n        toolRect.addActionListener(e -> currentTool = \"Rectangle\");\n        toolOval.addActionListener(e -> currentTool = \"Oval\");\n        toolText.addActionListener(e -> currentTool = \"Text\");\n\n        toolMenu.add(colorItem);\n        toolMenu.add(brushItem);\n        toolMenu.add(toolBrush);\n        toolMenu.add(toolLine);\n        toolMenu.add(toolRect);\n        toolMenu.add(toolOval);\n        toolMenu.add(toolText);\n        menuBar.add(toolMenu);\n\n        JMenu editMenu = new JMenu(\"Edit\");\n        JMenuItem undoItem = new JMenuItem(\"Undo\");\n        JMenuItem redoItem = new JMenuItem(\"Redo\");\n        undoItem.addActionListener(e -> drawPanel.undo());\n        redoItem.addActionListener(e -> drawPanel.redo());\n        editMenu.add(undoItem);\n        editMenu.add(redoItem);\n        menuBar.add(editMenu);\n\n        setJMenuBar(menuBar);\n    }\n\n    \/\/ \u30e1\u30a4\u30f3\u30e1\u30bd\u30c3\u30c9\n    public static void main(String&#91;] args) {\n        SwingUtilities.invokeLater(() -> {\n            AdvancedPaintAppWithUndoRedo app = new AdvancedPaintAppWithUndoRedo();\n            app.setVisible(true);\n        });\n    }\n\n    \/\/ \u8272\u3092\u9078\u629e\u3059\u308b\n    private void chooseColor() {\n        Color color = JColorChooser.showDialog(null, \"Choose a Color\", currentColor);\n        if (color != null) {\n            currentColor = color;\n            drawPanel.setColor(color);\n        }\n    }\n\n    \/\/ \u30d6\u30e9\u30b7\u30b5\u30a4\u30ba\u3092\u9078\u629e\u3059\u308b\n    private void chooseBrushSize() {\n        String sizeStr = JOptionPane.showInputDialog(this, \"Enter brush size:\", brushSize);\n        if (sizeStr != null) {\n            try {\n                int size = Integer.parseInt(sizeStr);\n                if (size > 0) {\n                    brushSize = size;\n                    drawPanel.setBrushSize(size);\n                }\n            } catch (NumberFormatException e) {\n                JOptionPane.showMessageDialog(this, \"Invalid size entered.\");\n            }\n        }\n    }\n\n    \/\/ \u753b\u50cf\u3092\u4fdd\u5b58\u3059\u308b\n    private void saveImage() {\n        JFileChooser fileChooser = new JFileChooser();\n        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {\n            File file = fileChooser.getSelectedFile();\n            try {\n                ImageIO.write(drawPanel.getImage(), \"png\", file);\n            } catch (Exception ex) {\n                ex.printStackTrace();\n            }\n        }\n    }\n\n    \/\/ \u753b\u50cf\u3092\u958b\u304f\n    private void openImage() {\n        JFileChooser fileChooser = new JFileChooser();\n        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {\n            File file = fileChooser.getSelectedFile();\n            try {\n                BufferedImage image = ImageIO.read(file);\n                drawPanel.setImage(image);\n            } catch (Exception ex) {\n                ex.printStackTrace();\n            }\n        }\n    }\n\n    \/\/ \u63cf\u753b\u7528\u306e\u30d1\u30cd\u30eb\n    class DrawPanel extends JPanel {\n\n        private BufferedImage image;\n        private Graphics2D g2;\n        private int startX, startY, endX, endY;\n\n        public DrawPanel() {\n            setPreferredSize(new Dimension(800, 600));\n            setDoubleBuffered(false);\n            addMouseListener(new MouseAdapter() {\n                @Override\n                public void mousePressed(MouseEvent e) {\n                    startX = e.getX();\n                    startY = e.getY();\n                    if (g2 != null) {\n                        if (currentTool.equals(\"Brush\")) {\n                            g2.fillOval(startX, startY, brushSize, brushSize);\n                        }\n                        saveToUndoStack();\n                    }\n                    repaint();\n                }\n\n                @Override\n                public void mouseReleased(MouseEvent e) {\n                    endX = e.getX();\n                    endY = e.getY();\n                    if (g2 != null) {\n                        switch (currentTool) {\n                            case \"Line\":\n                                g2.drawLine(startX, startY, endX, endY);\n                                break;\n                            case \"Rectangle\":\n                                g2.drawRect(Math.min(startX, endX), Math.min(startY, endY),\n                                        Math.abs(startX - endX), Math.abs(startY - endY));\n                                break;\n                            case \"Oval\":\n                                g2.drawOval(Math.min(startX, endX), Math.min(startY, endY),\n                                        Math.abs(startX - endX), Math.abs(startY - endY));\n                                break;\n                            case \"Text\":\n                                String text = JOptionPane.showInputDialog(\"Enter text:\");\n                                if (text != null) {\n                                    g2.drawString(text, startX, startY);\n                                }\n                                break;\n                        }\n                    }\n                    saveToUndoStack();\n                    repaint();\n                }\n            });\n\n            addMouseMotionListener(new MouseMotionAdapter() {\n                @Override\n                public void mouseDragged(MouseEvent e) {\n                    if (currentTool.equals(\"Brush\")) {\n                        g2.fillOval(e.getX(), e.getY(), brushSize, brushSize);\n                    }\n                    repaint();\n                }\n            });\n\n            clearCanvas();\n        }\n\n        \/\/ Undo\u30b9\u30bf\u30c3\u30af\u306b\u73fe\u5728\u306e\u72b6\u614b\u3092\u4fdd\u5b58\n        private void saveToUndoStack() {\n            BufferedImage undoImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());\n            Graphics2D g = undoImage.createGraphics();\n            g.drawImage(image, 0, 0, null);\n            g.dispose();\n            undoStack.push(undoImage);\n            redoStack.clear();  \/\/ \u65b0\u3057\u3044\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u5f8c\u3001Redo\u3092\u30af\u30ea\u30a2\n        }\n\n        \/\/ Undo\u6a5f\u80fd\n        public void undo() {\n            if (!undoStack.isEmpty()) {\n                redoStack.push(image);\n                image = undoStack.pop();\n                g2 = image.createGraphics();\n                repaint();\n            }\n        }\n\n        \/\/ Redo\u6a5f\u80fd\n        public void redo() {\n            if (!redoStack.isEmpty()) {\n                undoStack.push(image);\n                image = redoStack.pop();\n                g2 = image.createGraphics();\n                repaint();\n            }\n        }\n\n        \/\/ \u8272\u3092\u8a2d\u5b9a\n        public void setColor(Color color) {\n            if (g2 != null) {\n                g2.setColor(color);\n            }\n        }\n\n        \/\/ \u30d6\u30e9\u30b7\u30b5\u30a4\u30ba\u3092\u8a2d\u5b9a\n        public void setBrushSize(int size) {\n            brushSize = size;\n        }\n\n        \/\/ \u30ad\u30e3\u30f3\u30d0\u30b9\u3092\u30af\u30ea\u30a2\n        public void clearCanvas() {\n            image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);\n            g2 = image.createGraphics();\n            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n            g2.setPaint(Color.WHITE);\n            g2.fillRect(0, 0, image.getWidth(), image.getHeight());\n            g2.setPaint(Color.BLACK);\n            repaint();\n        }\n\n        \/\/ \u63cf\u753b\u30a4\u30e1\u30fc\u30b8\u3092\u53d6\u5f97\n        public BufferedImage getImage() {\n            return image;\n        }\n\n        \/\/ \u63cf\u753b\u30a4\u30e1\u30fc\u30b8\u3092\u30bb\u30c3\u30c8\n        public void setImage(BufferedImage img) {\n            image = img;\n            g2 = image.createGraphics();\n            repaint();\n        }\n\n        @Override\n        protected void paintComponent(Graphics g) {\n            super.paintComponent(g);\n            if (image != null) {\n                g.drawImage(image, 0, 0, null);\n            }\n        }\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[76,4],"tags":[75,3],"class_list":["post-25488","post","type-post","status-publish","format-standard","hentry","category-java","category-programming","tag-java","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25488"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25488\/revisions"}],"predecessor-version":[{"id":25489,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25488\/revisions\/25489"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25488"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}