2016-04-25 15 views
-1

Ich habe es geschafft, ein Bild zu speichern, aber ich kann es nicht aus einer ausgewählten Datei laden und dann auf meinem Grafik-Panel anzeigen lassen. Ich möchte auch, dass der Benutzer aufgefordert wird, die aktuelle Datei zuerst zu speichern, aber ich bin mir nicht sicher, wie ich das angehen soll.Wie lade ich mein gepuffertes Bild und male es auf mein GraphicsPanel

Ich habe drei Klassen wie folgt:

Treiberklasse

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 

public class guiDriver { 

    private GUIPanel panel; 
    JFileChooser fileFinder; 
    JFrame frame; 
    JMenuBar menuBar; 
    JMenu fileMenu, helpMenu; 
    JMenuItem item1, item2, item3, item4, about; 
    JOptionPane optionPane = new JOptionPane("Are you sure you want to exit?", JOptionPane.QUESTION_MESSAGE, 
      JOptionPane.YES_NO_OPTION); 

    public static void main(String[] args) { 
     guiDriver app = new guiDriver(); 
    } 

    public guiDriver() { 
     frame = new JFrame("Pen Simulator"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     panel = new GUIPanel(); 
     frame.add(panel); 
     // there is a method to set minimum size 
     frame.setMinimumSize(new Dimension(600, 400)); 

     menuBar = new JMenuBar(); 

     fileFinder = new JFileChooser(); 

     // File Menu 
     fileMenu = new JMenu("File"); 
     helpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(helpMenu); 

     item1 = new JMenuItem("New"); 
     item1.addActionListener(new itemListener()); 
     item2 = new JMenuItem("Load"); 
     item2.addActionListener(new itemListener()); 
     item3 = new JMenuItem("Save"); 
     item3.addActionListener(new itemListener()); 
     item4 = new JMenuItem("Exit"); 
     item4.addActionListener(new itemListener()); 

     fileMenu.add(item1); 
     fileMenu.add(item2); 
     fileMenu.add(item3); 
     fileMenu.add(item4); 

     // Help Menu 

     about = new JMenuItem("About"); 
     helpMenu.add(about); 

     frame.setJMenuBar(menuBar); // setting the Frames menubar as the newly 
            // created menubar 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    class itemListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JMenuItem source = (JMenuItem) (e.getSource()); 

      if (source.getText().equalsIgnoreCase("new")) { 
       panel.clearGraphics(); 
      } 

      if (source.getText().equalsIgnoreCase("save")) { 

       BufferedImage img = panel.grabGraphics(); 
       File f = new File("savedimage.jpg"); 
       JFileChooser chooser = new JFileChooser(); 
       chooser.setSelectedFile(f); 
       int rval = chooser.showSaveDialog(source); 
       if (rval == JFileChooser.APPROVE_OPTION) { 
        f = chooser.getSelectedFile(); 
        try { 
         ImageIO.write(img, "JPEG", f); 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 

        // int returnVal = fileFinder.showSaveDialog(null); 

       } 
       if (source.getText().equalsIgnoreCase("load")) { 

        BufferedImage img2 = panel.grabGraphics(); 
        JFileChooser chooser2 = new JFileChooser(); 
        File fileLoad = new File(chooser2.getSelectedFile().getName()); 
        chooser2.setSelectedFile(fileLoad); 
        int rval2 = chooser2.showOpenDialog(source); 
        if (rval2 == JFileChooser.APPROVE_OPTION) { 

         fileLoad = chooser2.getSelectedFile(); 
         try { 

          img2 = ImageIO.read(fileLoad); 

          panel.setGraphics(img2); 

         } catch (IOException e1) { 
          e1.printStackTrace(); 
         } 

         if (source.getText().equalsIgnoreCase("exit")) { 
          Object[] options = { "Yes", "No" }; 
          int choice = JOptionPane.showOptionDialog(frame, "Are you sure you want to exit?", 
            "Graphics Application", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, 
            UIManager.getIcon("OptionPane.errorIcon"), options, options[0]); 
          if (choice == JOptionPane.YES_OPTION) { 
           System.exit(0); 
          } 
          if (choice == JOptionPane.NO_OPTION) { 

          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

GUIPANEL

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class GUIPanel extends JPanel { 

    private JTextField userCommand; 
    private JLabel instruction1; 
    private JButton instruct, clear; 
    private GraphicsPanel graphics; 
    private int penX, penY, angle; 
    private int currentDirection = 0; 

    private boolean penIsUp = false; 
    private Color penColour; 

    public GUIPanel() { 

     graphics = new GraphicsPanel(); 

     setLayout(new BorderLayout()); 

     // SOUTH PANEL CONSTRUCTOR 
     JPanel command = new JPanel(); 
     command.setLayout(new BoxLayout(command, BoxLayout.LINE_AXIS)); 
     instruction1 = new JLabel("Enter Command:"); 

     // BUTTO 
     instruct = new JButton("Execute"); 
     instruct.addActionListener(new ButtonListener()); 
     clear = new JButton("Clear Graphics"); 

     // TEXT FIELD 
     userCommand = new JTextField(10); 

     command.add(instruction1); 
     command.add(Box.createRigidArea(new Dimension(4, 0))); 
     command.add(userCommand); 
     command.add(Box.createRigidArea(new Dimension(2, 0))); 
     command.add(instruct); 
     command.add(Box.createRigidArea(new Dimension(2, 0))); 
     command.add(clear); 

     add(command, BorderLayout.SOUTH); 
     add(graphics, BorderLayout.CENTER); 

     init(); 

    } 

    public void init() { 

     penX = graphics.getWidth()/2; 
     penY = graphics.getHeight()/2; 
    } 

    public void moveForward() { 

     String command = userCommand.getText().toLowerCase(); 
     int distance = Integer.parseInt(command.replace("forward ", "")); 

     userCommand.setText(""); 

     if (penIsUp == false) { 
      if (currentDirection == 0) { 
       graphics.drawLine(penColour, penX, penY, penX, (penY - distance)); 
       penY = penY - distance; 
      } 
      if (currentDirection == 1) { 
       graphics.drawLine(penColour, penX, penY, penX + distance, penY); 
       penX = penX + distance; 
      } 
      if (currentDirection == 2) { 
       graphics.drawLine(penColour, penX, penY, penX, (penY + distance)); 
       penY = penY + distance; 
      } 
      if (currentDirection == 3) { 
       graphics.drawLine(penColour, penX, penY, penX - distance, penY); 
       penX = penX - distance; 
      } 
      graphics.repaint(); 

     } else if (penIsUp == true) { 
      penY = penY - distance; 

     } 
    } 

    public void moveBackward() { 

     String command = userCommand.getText().toLowerCase(); 
     int distance = Integer.parseInt(command.replace("backward ", "")); 

     userCommand.setText(""); 

     if (penIsUp == false) { 
      graphics.drawLine(penColour, penX, penY, penX, (penY + distance)); 
      graphics.repaint(); 
      penY = penY + distance; 

     } else if (penIsUp == true) { 
      penX = penX + distance; 
     } 

    } 

    public void penUp() { 
     penIsUp = true; 
     userCommand.setText(""); 
    } 

    public void penDown() { 
     penIsUp = false; 
     userCommand.setText(""); 
    } 

    public void clearGraphics() { 

     graphics.clear(); 
     graphics.repaint(); 

    } 

    public void saveFile() { 

     graphics.saveFile(); 
    } 

    public BufferedImage grabGraphics() { 

     return graphics.grabImage(); 
    } 

    public void setGraphics(BufferedImage img2) { 

     graphics.grabImage(); 
     graphics.repaint(); 
    } 

    class ButtonListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      if (userCommand.getText().equalsIgnoreCase("something")) { 

       System.out.println("you typed something"); 
       userCommand.setText(""); 
      } 

      else if (userCommand.getText().equalsIgnoreCase("turnleft")) { 
       currentDirection = currentDirection - 1; 
       if (currentDirection == -1) { 
        currentDirection = 3; 
       } 
       userCommand.setText(""); 

      } 

      else if (userCommand.getText().equalsIgnoreCase("turnright")) { 
       currentDirection = currentDirection + 1; 
       if (currentDirection == 4) { 
        currentDirection = 0; 
       } 
       userCommand.setText(""); 
      } 

      else if (userCommand.getText().startsWith("forward ")) { 

       try { 
        moveForward(); 

       } catch (NumberFormatException e1) { 
        System.out.println("Invalid command"); 
       } 
      } 

      else if (userCommand.getText().startsWith("backward ")) { 

       try { 
        moveBackward(); 
       } 

       catch (NumberFormatException e1) { 
        System.out.println("Invalid command"); 
       } 
      } 

      else if (userCommand.getText().equalsIgnoreCase("black")) { 

       penColour = Color.BLACK; 
       userCommand.setText(""); 
      } 

      else if (userCommand.getText().equalsIgnoreCase("green")) { 

       penColour = Color.GREEN; 
       userCommand.setText(""); 

      } 

      else if (userCommand.getText().equalsIgnoreCase("red")) { 

       penColour = Color.RED; 
       userCommand.setText(""); 
      } 

      else if (userCommand.getText().equalsIgnoreCase("reset")) { 

       graphics.clear(); 
       penX = 0; 
       penY = 0; 
       userCommand.setText(""); 
       graphics.repaint(); 

      } 

      else if (userCommand.getText().equalsIgnoreCase("penUp")) { 
       penUp(); 
       userCommand.setText(""); 
      } 

      else if (userCommand.getText().equalsIgnoreCase("penDown")) { 
       penDown(); 
       userCommand.setText(""); 
      } 

     } 
    } 
} 

GraphicsPanel

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class GraphicsPanel extends JPanel { 

    /** 
    * The default BG colour of the image. 
    */ 
    private final static Color BACKGROUND_COL = Color.DARK_GRAY; 

    /** 
    * The underlying image used for drawing. This is required so any previous 
    * drawing activity is persistent on the panel. 
    */ 
    private BufferedImage image; 
    int w, h; 

    public GraphicsPanel() { 

     Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize(); 

     int width = (int) resolution.getWidth(); // casting the screen width to 
                // integer 
     int height = (int) resolution.getHeight(); // casting the scren height 
                // to integer 

     image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
     // Set max size of the panel, so that is matches the max size of the 
     // image. 
     setMaximumSize(new Dimension(image.getWidth(), image.getHeight())); 

     clear(); 

    } 

    public BufferedImage grabImage() { 
     return image; 
    } 

    public void drawLine(Color color, int x1, int y1, int x2, int y2) { 

     Graphics g = image.getGraphics(); 
     g.setColor(color); 
     g.translate(getWidth()/2, getHeight()/2); 

     g.drawLine(x1, y1, x2, y2); 
    } 

    /** 
    * Clears the image contents. 
    */ 
    public void clear() { 

     Graphics g = image.getGraphics(); 

     g.setColor(BACKGROUND_COL); 

     g.fillRect(0, 0, image.getWidth(), image.getHeight()); 

    } 

    @Override 
    public void paint(Graphics g) { 

     // render the image on the panel. 
     g.drawImage(image, 0, 0, null); 
    } 

    public void saveFile() { 
     try { 
      image = ImageIO.read(new File("Test.jpg")); 
      w = image.getWidth(null); 
      h = image.getHeight(null); 
      if (image.getType() != BufferedImage.TYPE_INT_RGB) { 
       BufferedImage image2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
       Graphics big = image2.getGraphics(); 
       big.drawImage(image, 0, 0, null); 
      } 
     } catch (IOException e) { 
      System.out.println("Invalid Image"); 

     } 

    } 

} 

Danke

+1

Die 'setGraphics' Methode der GuiPanel Klasse doesn Verwenden Sie das 'img2'-Methodenargument in keiner Weise. – VGR

Antwort

2

ein Verfahren zu Ihren GraphicsPanel hinzufügen wie folgt: -

public void setImage(BufferedImage image) 
{ 
    this.image = image 
    repaint(); 
} 

und im Lastbereich:

fileLoad = chooser2.getSelectedFile(); 
try 
{ 
     img2 = ImageIO.read(fileLoad); 
     panel.setImage(img2); 
} 
catch (IOException e1) 
{ 
    e1.printStackTrace(); 
} 
+0

Vielen Dank. Wenn Sie die Post upvote, so dass ich nicht rep verlieren, das wäre großartig. Ich weiß nicht, warum es abgelehnt wurde. – SkyPlus