2015-01-22 11 views
0

프로그램에서 페인팅을 허용 한 다음 파일> 내보내기를 클릭하면 DrawingBoard의 내용이 바탕 화면에 저장된 JPEG 형식으로 내보내집니다. 그러나 저장할 때 이미지는 흰색이어야한다고 명시된 경우에도 & 배경이 검정색 (문제)으로 나타납니다.Java : File Chooser를 사용하여 DrawingBoard (JComponent)의 이미지 저장.

또한 사용자가 이미지를 저장할 위치를 물어 본 다음 이미지가 저장되기를 원합니다.

해결할 수 있습니까? FileChooser 을 추가하는 데 도움이됩니다. 나는 그것을 어디에 둘지 모른다.

이것은 내 코드입니다. 도와주세요.

import javax.swing.*; 
 
import javax.swing.event.ChangeEvent; 
 
import javax.swing.event.ChangeListener; 
 
import java.awt.event.ActionEvent; 
 
import java.awt.event.ActionListener; 
 
import java.awt.event.KeyListener; 
 
import java.awt.event.*; 
 
import java.awt.*; 
 
import java.awt.geom.*; 
 
import java.text.DecimalFormat; 
 
import javax.swing.ImageIcon; 
 
import javax.swing.JFrame; 
 
import javax.swing.JMenu; 
 
import javax.swing.JMenuBar; 
 
import javax.swing.JMenuItem; 
 
import javax.swing.JPanel; 
 
import java.awt.event.ActionEvent; 
 
import java.awt.event.ActionListener; 
 
import java.awt.image.BufferedImage; 
 
import java.io.File; 
 
import javax.swing.ButtonGroup; 
 
import javax.swing.JCheckBoxMenuItem; 
 
import javax.swing.JFrame; 
 
import javax.swing.JMenu; 
 
import javax.swing.JMenuBar; 
 
import javax.swing.JMenuItem; 
 
import javax.swing.JRadioButtonMenuItem; 
 
import java.util.*; 
 
import javax.imageio.ImageIO; 
 
import javax.swing.event.MenuListener; 
 
import java.awt.image.BufferedImage; 
 

 
@SuppressWarnings("serial") 
 
public class Lesson49_1 extends JFrame 
 
{ 
 
\t JMenuBar menubar; 
 
     JMenu File, Exit; 
 
     JMenuItem New,Open; 
 
     JComponent DrawingBoard; 
 
     
 
\t \t JButton brushBut, lineBut, ellipseBut, rectBut, strokeBut, fillBut; 
 
\t \t 
 
\t \t // Slider used to change the transparency 
 
\t \t 
 
\t \t JSlider transSlider; 
 
\t \t 
 
\t \t JLabel transLabel; 
 
\t \t 
 
\t \t // Makes sure the float for transparency only shows 2 digits 
 
\t \t 
 
\t \t DecimalFormat dec = new DecimalFormat("#.##"); 
 
\t \t 
 
\t \t // Contains all of the rules for drawing 
 
\t \t 
 
\t \t Graphics2D graphSettings; 
 
\t \t 
 
\t \t // Homework use graphSettings.setStroke(new BasicStroke(5F)); 
 
\t \t // To change the stroke dynamically with a component 
 
\t \t 
 
\t \t // Going to be used to monitor what shape to draw next 
 
\t \t 
 
\t \t int currentAction = 1; 
 
\t \t 
 
\t \t // Transparency of the shape 
 
\t \t 
 
\t \t float transparentVal = 1.0f; 
 
\t \t 
 
\t \t // Default stroke and fill colors 
 
\t \t 
 
\t \t Color strokeColor=Color.RED, fillColor=Color.WHITE; 
 
\t 
 
     public static void main(String [] args) 
 
     { 
 
       new Lesson49_1(); 
 
     } 
 

 
     public Lesson49_1() 
 
     { 
 
     \t // Define the defaults for the JFrame 
 
     \t 
 
      this.setSize(800, 600); 
 
      this.setTitle("Java Paint"); 
 
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
      this.setJMenuBar(menubar); 
 
         
 
      JMenuBar menuBar = new JMenuBar(); 
 
     
 
     // Add the menubar to the frame 
 
     setJMenuBar(menuBar); 
 
     
 
     // Define and add two drop down menu to the menubar 
 
     JMenu fileMenu = new JMenu("File"); 
 
     JMenu editMenu = new JMenu("Edit"); 
 
     JMenu dbMenu = new JMenu("Database"); 
 
     JMenu ToolsMenu = new JMenu("Tools"); 
 
     JMenu HelpMenu = new JMenu("Help"); 
 
     menuBar.add(fileMenu); 
 
     menuBar.add(editMenu); 
 
      menuBar.add(dbMenu); 
 
      menuBar.add(ToolsMenu); 
 
      menuBar.add(HelpMenu); 
 
     // Create and add simple menu item to one of the drop down menu 
 
     JMenuItem newAction = new JMenuItem("New Project"); 
 
     JMenuItem openAction = new JMenuItem("Open File"); 
 
     JMenuItem exitAction = new JMenuItem("Quit"); 
 
     JMenuItem cutAction = new JMenuItem("Cut"); 
 
     JMenuItem copyAction = new JMenuItem("Copy"); 
 
     JMenuItem pasteAction = new JMenuItem("Paste"); 
 
     JMenuItem UndoAction = new JMenuItem("Undo"); 
 
     JMenuItem RedoAction = new JMenuItem("Redo"); 
 
     JMenuItem clearAction = new JMenuItem("Clear"); 
 
     JMenuItem saveAction = new JMenuItem("Save"); 
 
     JMenuItem exportAction = new JMenuItem("Export"); 
 
     JMenuItem printAction = new JMenuItem("Print"); 
 
     JMenuItem ConvertAction = new JMenuItem("Convert To Tables"); 
 
     JMenuItem ColorAction = new JMenuItem("Color Picker"); 
 
     JMenuItem ZoomAction = new JMenuItem("Zoom"); 
 
     JMenuItem EntityAction = new JMenuItem("Entity & Attributes"); 
 
     JMenuItem RelationshipAction = new JMenuItem("Relationship Attributes"); 
 
     JMenuItem HelpAction = new JMenuItem("Help"); 
 
     JMenuItem AboutAction = new JMenuItem("About"); 
 
     
 
     fileMenu.add(newAction); 
 
     fileMenu.addSeparator(); 
 
     fileMenu.add(openAction); 
 
     fileMenu.addSeparator(); 
 
     fileMenu.add(saveAction); 
 
     fileMenu.addSeparator(); 
 
     fileMenu.add(exportAction); 
 
     fileMenu.addSeparator(); 
 
     fileMenu.add(printAction); 
 
     fileMenu.addSeparator(); 
 
     fileMenu.add(exitAction); 
 
     
 
     
 
     editMenu.add(UndoAction); 
 
     editMenu.addSeparator(); 
 
     editMenu.add(RedoAction); 
 
     editMenu.addSeparator(); 
 
     editMenu.add(cutAction); 
 
     editMenu.addSeparator(); 
 
     editMenu.add(copyAction); 
 
     editMenu.addSeparator(); 
 
     editMenu.add(pasteAction); 
 
     editMenu.addSeparator(); 
 
     editMenu.add(clearAction); 
 
     
 
     dbMenu.add(ConvertAction); 
 
     
 
     ToolsMenu.add(ColorAction); 
 
     ToolsMenu.addSeparator(); 
 
     ToolsMenu.add(ZoomAction); 
 
     ToolsMenu.addSeparator(); 
 
     ToolsMenu.add(EntityAction); 
 
     ToolsMenu.addSeparator(); 
 
     ToolsMenu.add(RelationshipAction); 
 
     
 
     HelpMenu.add(HelpAction); 
 
     HelpMenu.addSeparator();   
 
     HelpMenu.add(AboutAction); 
 
     
 
       
 
      
 
      
 
      
 
     newAction.addActionListener(new ActionListener() { 
 
      public void actionPerformed(ActionEvent arg0) { 
 
             
 
       new Lesson49_1().setVisible(true);   
 
      } 
 
     }); 
 
      
 
      
 
      
 
      
 
      JPanel buttonPanel = new JPanel(); 
 
      
 
      // Swing box that will hold all the buttons 
 
      
 
      Box theBox = Box.createVerticalBox(); 
 
      
 
      // Make all the buttons in makeMeButtons by passing the 
 
      // button icon. 
 
      
 
      brushBut = makeMeButtons("./src/brush.png", 1); 
 
      lineBut = makeMeButtons("./src/line.png", 2); 
 
      ellipseBut = makeMeButtons("./src/ellipse.png", 3); 
 
      rectBut = makeMeButtons("./src/rectangle.png", 4); 
 
      
 
      // Make all the buttons in makeMeColorButton by passing the 
 
      // button icon and true for stroke color or false for fill 
 
      
 
      strokeBut = makeMeColorButton("./src/stroke.png", 5, true); 
 
      fillBut = makeMeColorButton("./src/fill.png", 6, false); 
 
      
 
      // Add the buttons to the box 
 
      
 
      theBox.add(brushBut); 
 
      theBox.add(lineBut); 
 
      theBox.add(ellipseBut); 
 
      theBox.add(rectBut); 
 
      theBox.add(strokeBut); 
 
      theBox.add(fillBut); 
 
      
 
      // Add the transparent label and slider 
 
      
 
      transLabel = new JLabel("Transparent: 1"); 
 
      
 
      // Min value, Max value and starting value for slider 
 
      
 
      transSlider = new JSlider(1, 99, 99); 
 
      
 
      // Create an instance of ListenForEvents to handle events 
 
      
 
      ListenForSlider lForSlider = new ListenForSlider(); 
 
      
 
      // Tell Java that you want to be alerted when an event 
 
      // occurs on the slider 
 
      
 
      transSlider.addChangeListener(lForSlider); 
 

 
      theBox.add(transLabel); 
 
      theBox.add(transSlider); 
 

 
      buttonPanel.add(theBox); 
 
      
 
      this.add(buttonPanel, BorderLayout.WEST); 
 
      
 
      // Make the drawing area take up the rest of the frame 
 
      
 
      // this.add(new DrawingBoard(), BorderLayout.CENTER); 
 
      DrawingBoard drawPanel = new DrawingBoard(); 
 
      this.add(drawPanel,BorderLayout.CENTER); 
 
      this.getContentPane().setBackground(Color.WHITE); 
 
      
 
      exportAction.addActionListener(new ActionListener() { 
 

 
      public void actionPerformed(ActionEvent arg0) { 
 
       BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), 
 
    BufferedImage.TYPE_INT_RGB); 
 
Graphics2D g = image.createGraphics(); 
 
drawPanel.paint(g); 
 
       try{ 
 
        ImageIO.write(image,"png", new File("C:\\Users\\Wenda\\Desktop\\Image.png")); 
 
        JOptionPane.showMessageDialog(null,"Image Saved to desktop"); 
 
        } 
 
       catch(Exception ex){ 
 
         ex.printStackTrace(); 
 
        } 
 

 

 
       
 
      } 
 
     }); 
 
      
 
      // Show the frame 
 
      
 
      this.setVisible(true); 
 
      
 
      
 
     } 
 
     
 
     // Spits out buttons based on the image supplied 
 
     // actionNum represents each shape to be drawn 
 
     
 
     public JButton makeMeButtons(String iconFile, final int actionNum){ 
 
     \t JButton theBut = new JButton(); 
 
      Icon butIcon = new ImageIcon(iconFile); 
 
      theBut.setIcon(butIcon); 
 
      
 
      // Make the proper actionPerformed method execute when the 
 
      // specific button is pressed 
 
      
 
      theBut.addActionListener(new ActionListener() { 
 

 
\t \t \t \t public void actionPerformed(ActionEvent e) { 
 
\t \t \t \t \t currentAction = actionNum; 
 
\t \t \t \t \t 
 
\t \t \t \t } 
 
      }); 
 
      
 
      return theBut; 
 
     } 
 
     
 
     // Spits out buttons based on the image supplied and 
 
     // whether a stroke or fill is to be defined 
 
     
 
     public JButton makeMeColorButton(String iconFile, final int actionNum, final boolean stroke){ 
 
     \t JButton theBut = new JButton(); 
 
      Icon butIcon = new ImageIcon(iconFile); 
 
      theBut.setIcon(butIcon); 
 
      
 
      theBut.addActionListener(new ActionListener() { 
 

 
\t \t \t \t public void actionPerformed(ActionEvent e) { 
 
\t \t \t \t \t 
 
\t \t \t \t \t if(stroke){ 
 
\t \t \t \t \t \t 
 
\t \t \t \t \t \t // JColorChooser is a popup that lets you pick a color 
 
\t \t \t \t \t \t 
 
\t \t \t \t \t \t strokeColor = JColorChooser.showDialog(null, "Pick a Stroke", Color.BLACK); 
 
\t \t \t \t \t } else { 
 
\t \t \t \t \t \t fillColor = JColorChooser.showDialog(null, "Pick a Fill", Color.WHITE); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t 
 
\t \t \t \t } 
 
      }); 
 
      
 
      return theBut; 
 
     } 
 

 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     public class DrawingBoard extends JComponent 
 
     { 
 
     \t 
 
     \t // ArrayLists that contain each shape drawn along with 
 
     \t // that shapes stroke and fill 
 
     \t 
 
       ArrayList<Shape> shapes = new ArrayList<Shape>(); 
 
       ArrayList<Color> shapeFill = new ArrayList<Color>(); 
 
       ArrayList<Color> shapeStroke = new ArrayList<Color>(); 
 
       ArrayList<Float> transPercent = new ArrayList<Float>(); 
 
       
 
       Point drawStart, drawEnd; 
 

 
       // Monitors events on the drawing area of the frame 
 
       
 
       public DrawingBoard() 
 
       { 
 
       \t 
 
         this.addMouseListener(new MouseAdapter() 
 
          { 
 
         \t 
 
          public void mousePressed(MouseEvent e) 
 
          { 
 
          \t 
 
          \t if(currentAction != 1){ 
 
          \t 
 
          \t // When the mouse is pressed get x & y position 
 
          \t 
 
          \t drawStart = new Point(e.getX(), e.getY()); 
 
          \t drawEnd = drawStart; 
 
           repaint(); 
 
           
 
          \t } 
 
          \t 
 
           
 
           } 
 

 
          public void mouseReleased(MouseEvent e) 
 
           { 
 
          \t 
 
          \t if(currentAction != 1){ 
 
          \t 
 
          \t // Create a shape using the starting x & y 
 
          \t // and finishing x & y positions 
 
          \t 
 
          \t Shape aShape = null; 
 
          \t 
 
          \t if (currentAction == 2){ 
 
          \t \t aShape = drawLine(drawStart.x, drawStart.y, 
 
          \t \t \t \t e.getX(), e.getY()); 
 
          \t } else 
 
          \t 
 
          \t if (currentAction == 3){ 
 
          \t \t aShape = drawEllipse(drawStart.x, drawStart.y, 
 
          \t \t \t \t e.getX(), e.getY()); 
 
          \t } else 
 
          \t 
 
          \t if (currentAction == 4) { 
 
          \t \t 
 
          \t \t // Create a new rectangle using x & y coordinates 
 
          \t \t 
 
            aShape = drawRectangle(drawStart.x, drawStart.y, 
 
            \t \t e.getX(), e.getY()); 
 
          \t } 
 
          \t 
 
            
 
            // Add shapes, fills and colors to there ArrayLists 
 
            
 
            shapes.add(aShape); 
 
            shapeFill.add(fillColor); 
 
            shapeStroke.add(strokeColor); 
 
            
 
            // Add transparency value to ArrayList 
 
            
 
            transPercent.add(transparentVal); 
 
            
 
            drawStart = null; 
 
            drawEnd = null; 
 
            
 
            // repaint the drawing area 
 
            
 
            repaint(); 
 
            
 
          \t } 
 
            
 
           } 
 
          }); 
 

 
         this.addMouseMotionListener(new MouseMotionAdapter() 
 
         { 
 
         \t 
 
          public void mouseDragged(MouseEvent e) 
 
          { 
 
         \t 
 
         \t // If this is a brush have shapes go on the screen quickly 
 
         \t 
 
         \t if(currentAction == 1){ 
 
         \t \t \t 
 
         \t \t \t int x = e.getX(); 
 
         \t \t \t int y = e.getY(); 
 
         \t \t \t 
 
         \t \t \t Shape aShape = null; 
 
         \t \t \t 
 
         \t \t \t // Make stroke and fill equal to eliminate the fact that this is an ellipse 
 
         \t \t \t 
 
         \t \t \t strokeColor = fillColor; 
 
         \t \t \t 
 
         \t \t \t aShape = drawBrush(x,y,5,5); 
 
         \t \t \t 
 
         \t \t \t shapes.add(aShape); 
 
            shapeFill.add(fillColor); 
 
            shapeStroke.add(strokeColor); 
 
            
 
            // Add the transparency value 
 
            
 
            transPercent.add(transparentVal); 
 
         \t \t } 
 
         \t 
 
         \t // Get the final x & y position after the mouse is dragged 
 
         \t 
 
         \t drawEnd = new Point(e.getX(), e.getY()); 
 
          repaint(); 
 
          } 
 
         }); 
 
       } 
 
       
 

 
       public void paint(Graphics g) 
 
       { 
 
       \t \t // Class used to define the shapes to be drawn 
 
       \t 
 
         graphSettings = (Graphics2D)g; 
 

 
         // Antialiasing cleans up the jagged lines and defines rendering rules 
 
         
 
         graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
 
           RenderingHints.VALUE_ANTIALIAS_ON); 
 
         
 
         // Defines the line width of the stroke 
 
         
 
         graphSettings.setStroke(new BasicStroke(4)); 
 

 
         // Iterators created to cycle through strokes and fills 
 
         Iterator<Color> strokeCounter = shapeStroke.iterator(); 
 
         Iterator<Color> fillCounter = shapeFill.iterator(); 
 
         
 
         // Iterator for transparency 
 
         
 
         Iterator<Float> transCounter = transPercent.iterator(); 
 
         
 
         for (Shape s : shapes) 
 
         { 
 
         \t 
 
         \t // Sets the shapes transparency value 
 
          
 
          graphSettings.setComposite(AlphaComposite.getInstance(
 
            AlphaComposite.SRC_OVER, transCounter.next())); 
 
         \t 
 
         \t // Grabs the next stroke from the color arraylist 
 
         \t graphSettings.setPaint(strokeCounter.next()); 
 
         \t 
 
         \t graphSettings.draw(s); 
 
         \t 
 
         \t // Grabs the next fill from the color arraylist 
 
         \t graphSettings.setPaint(fillCounter.next()); 
 
         \t 
 
         \t graphSettings.fill(s); 
 
         } 
 

 
         // Guide shape used for drawing 
 
         if (drawStart != null && drawEnd != null) 
 
         { 
 
         \t // Makes the guide shape transparent 
 
          
 
          graphSettings.setComposite(AlphaComposite.getInstance(
 
            AlphaComposite.SRC_OVER, 0.40f)); 
 
         \t 
 
          // Make guide shape gray for professional look 
 
          
 
         \t graphSettings.setPaint(Color.LIGHT_GRAY); 
 
         \t 
 
         \t Shape aShape = null; 
 
         \t 
 
         \t if (currentAction == 2){ 
 
         \t \t aShape = drawLine(drawStart.x, drawStart.y, 
 
           \t \t drawEnd.x, drawEnd.y); 
 
         \t } else 
 
         \t 
 
         \t if (currentAction == 3){ 
 
         \t \t aShape = drawEllipse(drawStart.x, drawStart.y, 
 
           \t \t drawEnd.x, drawEnd.y); 
 
         \t } else 
 
         \t 
 
         \t if (currentAction == 4) { 
 
         \t \t 
 
         \t \t // Create a new rectangle using x & y coordinates 
 
         \t \t 
 
           aShape = drawRectangle(drawStart.x, drawStart.y, 
 
           \t \t drawEnd.x, drawEnd.y); 
 
         \t } 
 
           
 
           
 
           graphSettings.draw(aShape); 
 
         } 
 
       } 
 

 
       private Rectangle2D.Float drawRectangle(
 
         int x1, int y1, int x2, int y2) 
 
       { 
 
       \t // Get the top left hand corner for the shape 
 
       \t // Math.min returns the points closest to 0 
 
       \t 
 
         int x = Math.min(x1, x2); 
 
         int y = Math.min(y1, y2); 
 
         
 
         // Gets the difference between the coordinates and 
 
         
 
         int width = Math.abs(x1 - x2); 
 
         int height = Math.abs(y1 - y2); 
 

 
         return new Rectangle2D.Float(
 
           x, y, width, height); 
 
       } 
 
       
 
       // The other shapes will work similarly 
 
       // More on this in the next tutorial 
 
       
 
       private Ellipse2D.Float drawEllipse(
 
         int x1, int y1, int x2, int y2) 
 
       { 
 
         int x = Math.min(x1, x2); 
 
         int y = Math.min(y1, y2); 
 
         int width = Math.abs(x1 - x2); 
 
         int height = Math.abs(y1 - y2); 
 

 
         return new Ellipse2D.Float(
 
           x, y, width, height); 
 
       } 
 
       
 
       private Line2D.Float drawLine(
 
         int x1, int y1, int x2, int y2) 
 
       { 
 

 
         return new Line2D.Float(
 
           x1, y1, x2, y2); 
 
       } 
 
       
 
       private Ellipse2D.Float drawBrush(
 
         int x1, int y1, int brushStrokeWidth, int brushStrokeHeight) 
 
       { 
 
       \t 
 
       \t return new Ellipse2D.Float(
 
          x1, y1, brushStrokeWidth, brushStrokeHeight); 
 
       \t 
 
       } 
 

 
     } 
 
     
 
    // Implements ActionListener so it can react to events on components 
 
     
 
     private class ListenForSlider implements ChangeListener{ 
 
     \t 
 
     \t // Called when the spinner is changed 
 
     \t 
 
     \t public void stateChanged(ChangeEvent e) { 
 
     \t 
 
     \t \t // Check if the source of the event was the button 
 
     \t 
 
     \t \t if(e.getSource() == transSlider){ 
 
     \t 
 
     \t \t \t // Change the value for the label next to the spinner 
 
     \t \t \t // Use decimal format to make sure only 2 decimals are ever displayed 
 
     \t 
 
     \t \t \t transLabel.setText("Transparent: " + dec.format(transSlider.getValue() * .01)); 
 
     \t \t \t 
 
     \t \t \t // Set the value for transparency for every shape drawn after 
 
     \t \t \t 
 
     \t \t \t transparentVal = (float) (transSlider.getValue() * .01); 
 
     \t \t \t 
 
     \t \t } 
 
     \t 
 
     \t } 
 
     \t 
 
     } 
 
}

+0

는 drawPanel.paint를 사용 drawPanel.print 또는 drawPanel.printAll – MadProgrammer

답변

0

당신은 내가 해결했다 1 컴파일 오류가 있었다. 내가 가지고 있지 않은 여러 개의 입력 PNG 이미지가 있습니다.

내보내기 작업 수신기에 JFileChooser를 추가했습니다. Java 애플리케이션도 포맷했습니다.

JPanel에 페인트하고 paintComponent 메서드를 재정의해야합니다. ARGB BufferedImage를 작성하여 검정색 배경을 수정했습니다.

다음은 코드입니다.

package com.ggl.fse; 

import java.awt.AlphaComposite; 
import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.text.DecimalFormat; 
import java.util.ArrayList; 
import java.util.Iterator; 

import javax.imageio.ImageIO; 
import javax.swing.Box; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JComponent; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class Lesson49_1 extends JFrame { 

    private static final long serialVersionUID = -140274271716086522L; 

    JMenuBar menubar; 
    JMenu File, Exit; 
    JMenuItem New, Open; 
    JComponent DrawingBoard; 

    JButton brushBut, lineBut, ellipseBut, rectBut, strokeBut, fillBut; 

    // Slider used to change the transparency 

    JSlider transSlider; 

    JLabel transLabel; 

    // Makes sure the float for transparency only shows 2 digits 

    DecimalFormat dec = new DecimalFormat("#.##"); 

    // Contains all of the rules for drawing 

    Graphics2D graphSettings; 

    // Homework use graphSettings.setStroke(new BasicStroke(5F)); 
    // To change the stroke dynamically with a component 

    // Going to be used to monitor what shape to draw next 

    int currentAction = 1; 

    // Transparency of the shape 

    float transparentVal = 1.0f; 

    // Default stroke and fill colors 

    Color strokeColor = Color.RED, fillColor = Color.WHITE; 

    public static void main(String[] args) { 
     new Lesson49_1(); 
    } 

    public Lesson49_1() { 
     // Define the defaults for the JFrame 

     this.setSize(800, 600); 
     this.setTitle("Java Paint"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setJMenuBar(menubar); 

     JMenuBar menuBar = new JMenuBar(); 

     // Add the menubar to the frame 
     setJMenuBar(menuBar); 

     // Define and add two drop down menu to the menubar 
     JMenu fileMenu = new JMenu("File"); 
     JMenu editMenu = new JMenu("Edit"); 
     JMenu dbMenu = new JMenu("Database"); 
     JMenu ToolsMenu = new JMenu("Tools"); 
     JMenu HelpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(editMenu); 
     menuBar.add(dbMenu); 
     menuBar.add(ToolsMenu); 
     menuBar.add(HelpMenu); 
     // Create and add simple menu item to one of the drop down menu 
     JMenuItem newAction = new JMenuItem("New Project"); 
     JMenuItem openAction = new JMenuItem("Open File"); 
     JMenuItem exitAction = new JMenuItem("Quit"); 
     JMenuItem cutAction = new JMenuItem("Cut"); 
     JMenuItem copyAction = new JMenuItem("Copy"); 
     JMenuItem pasteAction = new JMenuItem("Paste"); 
     JMenuItem UndoAction = new JMenuItem("Undo"); 
     JMenuItem RedoAction = new JMenuItem("Redo"); 
     JMenuItem clearAction = new JMenuItem("Clear"); 
     JMenuItem saveAction = new JMenuItem("Save"); 
     JMenuItem exportAction = new JMenuItem("Export"); 
     JMenuItem printAction = new JMenuItem("Print"); 
     JMenuItem ConvertAction = new JMenuItem("Convert To Tables"); 
     JMenuItem ColorAction = new JMenuItem("Color Picker"); 
     JMenuItem ZoomAction = new JMenuItem("Zoom"); 
     JMenuItem EntityAction = new JMenuItem("Entity & Attributes"); 
     JMenuItem RelationshipAction = new JMenuItem("Relationship Attributes"); 
     JMenuItem HelpAction = new JMenuItem("Help"); 
     JMenuItem AboutAction = new JMenuItem("About"); 

     fileMenu.add(newAction); 
     fileMenu.addSeparator(); 
     fileMenu.add(openAction); 
     fileMenu.addSeparator(); 
     fileMenu.add(saveAction); 
     fileMenu.addSeparator(); 
     fileMenu.add(exportAction); 
     fileMenu.addSeparator(); 
     fileMenu.add(printAction); 
     fileMenu.addSeparator(); 
     fileMenu.add(exitAction); 

     editMenu.add(UndoAction); 
     editMenu.addSeparator(); 
     editMenu.add(RedoAction); 
     editMenu.addSeparator(); 
     editMenu.add(cutAction); 
     editMenu.addSeparator(); 
     editMenu.add(copyAction); 
     editMenu.addSeparator(); 
     editMenu.add(pasteAction); 
     editMenu.addSeparator(); 
     editMenu.add(clearAction); 

     dbMenu.add(ConvertAction); 

     ToolsMenu.add(ColorAction); 
     ToolsMenu.addSeparator(); 
     ToolsMenu.add(ZoomAction); 
     ToolsMenu.addSeparator(); 
     ToolsMenu.add(EntityAction); 
     ToolsMenu.addSeparator(); 
     ToolsMenu.add(RelationshipAction); 

     HelpMenu.add(HelpAction); 
     HelpMenu.addSeparator(); 
     HelpMenu.add(AboutAction); 

     newAction.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 

       new Lesson49_1().setVisible(true); 
      } 
     }); 

     JPanel buttonPanel = new JPanel(); 

     // Swing box that will hold all the buttons 

     Box theBox = Box.createVerticalBox(); 

     // Make all the buttons in makeMeButtons by passing the 
     // button icon. 

     brushBut = makeMeButtons("./src/brush.png", 1); 
     lineBut = makeMeButtons("./src/line.png", 2); 
     ellipseBut = makeMeButtons("./src/ellipse.png", 3); 
     rectBut = makeMeButtons("./src/rectangle.png", 4); 

     // Make all the buttons in makeMeColorButton by passing the 
     // button icon and true for stroke color or false for fill 

     strokeBut = makeMeColorButton("./src/stroke.png", 5, true); 
     fillBut = makeMeColorButton("./src/fill.png", 6, false); 

     // Add the buttons to the box 

     theBox.add(brushBut); 
     theBox.add(lineBut); 
     theBox.add(ellipseBut); 
     theBox.add(rectBut); 
     theBox.add(strokeBut); 
     theBox.add(fillBut); 

     // Add the transparent label and slider 

     transLabel = new JLabel("Transparent: 1"); 

     // Min value, Max value and starting value for slider 

     transSlider = new JSlider(1, 99, 99); 

     // Create an instance of ListenForEvents to handle events 

     ListenForSlider lForSlider = new ListenForSlider(); 

     // Tell Java that you want to be alerted when an event 
     // occurs on the slider 

     transSlider.addChangeListener(lForSlider); 

     theBox.add(transLabel); 
     theBox.add(transSlider); 

     buttonPanel.add(theBox); 

     this.add(buttonPanel, BorderLayout.WEST); 

     // Make the drawing area take up the rest of the frame 

     // this.add(new DrawingBoard(), BorderLayout.CENTER); 
     final DrawingBoard drawPanel = new DrawingBoard(); 
     this.add(drawPanel, BorderLayout.CENTER); 
     this.getContentPane().setBackground(Color.WHITE); 

     exportAction.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       BufferedImage image = new BufferedImage(drawPanel.getWidth(), 
         drawPanel.getHeight(), BufferedImage.TYPE_INT_ARGB); 
       Graphics2D g = image.createGraphics(); 
       drawPanel.paint(g); 
       g.dispose(); 

       JFileChooser fileChooser = new JFileChooser(); 
       File theDirectory = new File("C:/Users/Wenda/Desktop"); 
       fileChooser.setCurrentDirectory(theDirectory); 
       FileNameExtensionFilter pngFilter = new FileNameExtensionFilter(
         "PNG file (*.png)", "png"); 
       fileChooser.addChoosableFileFilter(pngFilter); 
       fileChooser.setFileFilter(pngFilter); 

       int status = fileChooser.showSaveDialog(Lesson49_1.this); 

       if (status == JFileChooser.APPROVE_OPTION) { 
        try { 
         ImageIO.write(image, "png", 
           fileChooser.getSelectedFile()); 
         JOptionPane.showMessageDialog(null, "Image saved to " 
           + fileChooser.getSelectedFile().getName()); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 

      } 
     }); 

     // Show the frame 

     this.setVisible(true); 

    } 

    // Spits out buttons based on the image supplied 
    // actionNum represents each shape to be drawn 

    public JButton makeMeButtons(String iconFile, final int actionNum) { 
     JButton theBut = new JButton(); 
     Icon butIcon = new ImageIcon(iconFile); 
     theBut.setIcon(butIcon); 

     // Make the proper actionPerformed method execute when the 
     // specific button is pressed 

     theBut.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       currentAction = actionNum; 

      } 
     }); 

     return theBut; 
    } 

    // Spits out buttons based on the image supplied and 
    // whether a stroke or fill is to be defined 

    public JButton makeMeColorButton(String iconFile, final int actionNum, 
      final boolean stroke) { 
     JButton theBut = new JButton(); 
     Icon butIcon = new ImageIcon(iconFile); 
     theBut.setIcon(butIcon); 

     theBut.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 

       if (stroke) { 

        // JColorChooser is a popup that lets you pick a color 

        strokeColor = JColorChooser.showDialog(null, 
          "Pick a Stroke", Color.BLACK); 
       } else { 
        fillColor = JColorChooser.showDialog(null, "Pick a Fill", 
          Color.WHITE); 
       } 

      } 
     }); 

     return theBut; 
    } 

    public class DrawingBoard extends JComponent { 

     private static final long serialVersionUID = -4431176095451940075L; 

     // ArrayLists that contain each shape drawn along with 
     // that shapes stroke and fill 
     ArrayList<Shape> shapes = new ArrayList<Shape>(); 
     ArrayList<Color> shapeFill = new ArrayList<Color>(); 
     ArrayList<Color> shapeStroke = new ArrayList<Color>(); 
     ArrayList<Float> transPercent = new ArrayList<Float>(); 

     Point drawStart, drawEnd; 

     // Monitors events on the drawing area of the frame 

     public DrawingBoard() { 

      this.addMouseListener(new MouseAdapter() { 

       public void mousePressed(MouseEvent e) { 

        if (currentAction != 1) { 

         // When the mouse is pressed get x & y position 

         drawStart = new Point(e.getX(), e.getY()); 
         drawEnd = drawStart; 
         repaint(); 

        } 

       } 

       public void mouseReleased(MouseEvent e) { 

        if (currentAction != 1) { 

         // Create a shape using the starting x & y 
         // and finishing x & y positions 

         Shape aShape = null; 

         if (currentAction == 2) { 
          aShape = drawLine(drawStart.x, drawStart.y, 
            e.getX(), e.getY()); 
         } else 

         if (currentAction == 3) { 
          aShape = drawEllipse(drawStart.x, drawStart.y, 
            e.getX(), e.getY()); 
         } else 

         if (currentAction == 4) { 

          // Create a new rectangle using x & y coordinates 

          aShape = drawRectangle(drawStart.x, drawStart.y, 
            e.getX(), e.getY()); 
         } 

         // Add shapes, fills and colors to there ArrayLists 

         shapes.add(aShape); 
         shapeFill.add(fillColor); 
         shapeStroke.add(strokeColor); 

         // Add transparency value to ArrayList 

         transPercent.add(transparentVal); 

         drawStart = null; 
         drawEnd = null; 

         // repaint the drawing area 

         repaint(); 

        } 

       } 
      }); 

      this.addMouseMotionListener(new MouseMotionAdapter() { 

       public void mouseDragged(MouseEvent e) { 

        // If this is a brush have shapes go on the screen quickly 

        if (currentAction == 1) { 

         int x = e.getX(); 
         int y = e.getY(); 

         Shape aShape = null; 

         // Make stroke and fill equal to eliminate the fact that 
         // this is an ellipse 

         strokeColor = fillColor; 

         aShape = drawBrush(x, y, 5, 5); 

         shapes.add(aShape); 
         shapeFill.add(fillColor); 
         shapeStroke.add(strokeColor); 

         // Add the transparency value 

         transPercent.add(transparentVal); 
        } 

        // Get the final x & y position after the mouse is dragged 

        drawEnd = new Point(e.getX(), e.getY()); 
        repaint(); 
       } 
      }); 
     } 

     public void paint(Graphics g) { 
      // Class used to define the shapes to be drawn 

      graphSettings = (Graphics2D) g; 

      // Antialiasing cleans up the jagged lines and defines rendering 
      // rules 

      graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 

      // Defines the line width of the stroke 

      graphSettings.setStroke(new BasicStroke(4)); 

      // Iterators created to cycle through strokes and fills 
      Iterator<Color> strokeCounter = shapeStroke.iterator(); 
      Iterator<Color> fillCounter = shapeFill.iterator(); 

      // Iterator for transparency 

      Iterator<Float> transCounter = transPercent.iterator(); 

      for (Shape s : shapes) { 

       // Sets the shapes transparency value 

       graphSettings.setComposite(AlphaComposite.getInstance(
         AlphaComposite.SRC_OVER, transCounter.next())); 

       // Grabs the next stroke from the color arraylist 
       graphSettings.setPaint(strokeCounter.next()); 

       graphSettings.draw(s); 

       // Grabs the next fill from the color arraylist 
       graphSettings.setPaint(fillCounter.next()); 

       graphSettings.fill(s); 
      } 

      // Guide shape used for drawing 
      if (drawStart != null && drawEnd != null) { 
       // Makes the guide shape transparent 

       graphSettings.setComposite(AlphaComposite.getInstance(
         AlphaComposite.SRC_OVER, 0.40f)); 

       // Make guide shape gray for professional look 

       graphSettings.setPaint(Color.LIGHT_GRAY); 

       Shape aShape = null; 

       if (currentAction == 2) { 
        aShape = drawLine(drawStart.x, drawStart.y, drawEnd.x, 
          drawEnd.y); 
       } else 

       if (currentAction == 3) { 
        aShape = drawEllipse(drawStart.x, drawStart.y, drawEnd.x, 
          drawEnd.y); 
       } else 

       if (currentAction == 4) { 

        // Create a new rectangle using x & y coordinates 

        aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x, 
          drawEnd.y); 
       } 

       graphSettings.draw(aShape); 
      } 
     } 

     private Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) { 
      // Get the top left hand corner for the shape 
      // Math.min returns the points closest to 0 

      int x = Math.min(x1, x2); 
      int y = Math.min(y1, y2); 

      // Gets the difference between the coordinates and 

      int width = Math.abs(x1 - x2); 
      int height = Math.abs(y1 - y2); 

      return new Rectangle2D.Float(x, y, width, height); 
     } 

     // The other shapes will work similarly 
     // More on this in the next tutorial 

     private Ellipse2D.Float drawEllipse(int x1, int y1, int x2, int y2) { 
      int x = Math.min(x1, x2); 
      int y = Math.min(y1, y2); 
      int width = Math.abs(x1 - x2); 
      int height = Math.abs(y1 - y2); 

      return new Ellipse2D.Float(x, y, width, height); 
     } 

     private Line2D.Float drawLine(int x1, int y1, int x2, int y2) { 

      return new Line2D.Float(x1, y1, x2, y2); 
     } 

     private Ellipse2D.Float drawBrush(int x1, int y1, int brushStrokeWidth, 
       int brushStrokeHeight) { 

      return new Ellipse2D.Float(x1, y1, brushStrokeWidth, 
        brushStrokeHeight); 

     } 

    } 

    // Implements ActionListener so it can react to events on components 

    private class ListenForSlider implements ChangeListener { 

     // Called when the spinner is changed 

     public void stateChanged(ChangeEvent e) { 

      // Check if the source of the event was the button 

      if (e.getSource() == transSlider) { 

       // Change the value for the label next to the spinner 
       // Use decimal format to make sure only 2 decimals are ever 
       // displayed 

       transLabel.setText("Transparent: " 
         + dec.format(transSlider.getValue() * .01)); 

       // Set the value for transparency for every shape drawn after 

       transparentVal = (float) (transSlider.getValue() * .01); 

      } 

     } 

    } 
} 
+0

Woooooooooooooow의 superrrrrrbeee를 사용하지 마십시오! 정말 고마워. IT가 완벽하게 작동합니다 : D – Lana

+0

마우스를 사용할 때 구성 요소를 움직일 수있게 도와 주시겠습니까? – Lana

+0

@WJCM : 애플리케이션에서 데이터를 조작하여 모델 클래스로 추출해야합니다. 일반적으로 복잡한 GUI를 만들 때 [모델/뷰/컨트롤러 패턴] (http://en.wikipedia.org/wiki/Model%E2%80view%E2%80%93controller)을 사용하여 파트를 구분합니다. GUI를 사용하면 한 번에 한 부분 만 집중할 수 있습니다. –