Minggu, 15 Desember 2019

Java GUI

Dalam program GUI ini, casenya adalah untuk mengedit foto dan menampilkannya.

ImageViewer :


 import java.awt.*; 
 import java.awt.event.*; 
 import java.awt.image.*; 
 import javax.swing.*; 
 import java.io.File; 
 /** 
  * ImageViewer is the main class of the image viewer application. It builds and 
  * displays the application GUI and initialises all other components. 
  *  
  * To start the application, create an object of this class. 
  *  
  * @author Michael Kolling and David J Barnes  
  * @version 1.0 
  */ 
 public class ImageViewer 
 { 
   // static fields: 
   private static final String VERSION = "Version 1.0"; 
   private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir")); 
   // fields: 
   private JFrame frame; 
   private ImagePanel imagePanel; 
   private JLabel filenameLabel; 
   private JLabel statusLabel; 
   private OFImage currentImage; 
   /** 
    * Create an ImageViewer show it on screen. 
    */ 
   public ImageViewer() 
   { 
     currentImage = null; 
     makeFrame(); 
   } 
   /** 
    * Open function: open a file chooser to select a new image file. 
    */ 
   private void openFile() 
   { 
     int returnVal = fileChooser.showOpenDialog(frame); 
     if(returnVal != JFileChooser.APPROVE_OPTION) { 
       return; // cancelled 
     } 
     File selectedFile = fileChooser.getSelectedFile(); 
     currentImage = ImageFileManager.loadImage(selectedFile); 
     if(currentImage == null) {  // image file was not a valid image 
       JOptionPane.showMessageDialog(frame, 
           "The file was not in a recognized image file format.", 
           "Image Load Error", 
           JOptionPane.ERROR_MESSAGE); 
       return; 
     } 
     imagePanel.setImage(currentImage); 
     showFilename(selectedFile.getPath()); 
     showStatus("File loaded."); 
     frame.pack(); 
   } 
   /** 
    * Close function: close the current image. 
    */ 
   private void close() 
   { 
     currentImage = null; 
     imagePanel.clearImage(); 
     showFilename(null); 
   } 
   /** 
    * Quit function: quit the application. 
    */ 
   private void quit() 
   { 
     System.exit(0); 
   } 
   /** 
    * 'Darker' function: make the picture darker. 
    */ 
   private void makeDarker() 
   { 
     if(currentImage != null) { 
       currentImage.darker(); 
       frame.repaint(); 
       showStatus("Applied: darker"); 
     } 
     else { 
       showStatus("No image loaded."); 
     } 
   } 
   /** 
    * 'Lighter' function: make the picture lighter 
    */ 
   private void makeLighter() 
   { 
     if(currentImage != null) { 
       currentImage.lighter(); 
       frame.repaint(); 
       showStatus("Applied: lighter"); 
     } 
     else { 
       showStatus("No image loaded."); 
     } 
   } 
   /** 
    * 'threshold' function: apply the threshold filter 
    */ 
   private void threshold() 
   { 
     if(currentImage != null) { 
       currentImage.threshold(); 
       frame.repaint(); 
       showStatus("Applied: threshold"); 
     } 
     else { 
       showStatus("No image loaded."); 
     } 
   } 
   /** 
    * 'Lighter' function: make the picture lighter 
    */ 
   private void showAbout() 
   { 
     JOptionPane.showMessageDialog(frame,  
           "ImageViewer\n" + VERSION, 
           "About ImageViewer",  
           JOptionPane.INFORMATION_MESSAGE); 
   } 
   // ---- support methods ---- 
   /** 
    * Display a file name on the appropriate label. 
    * @param filename The file name to be displayed. 
    */ 
   private void showFilename(String filename) 
   { 
     if(filename == null) { 
       filenameLabel.setText("No file displayed."); 
     } 
     else { 
       filenameLabel.setText("File: " + filename); 
     } 
   } 
   /** 
    * Display a status message in the frame's status bar. 
    * @param text The status message to be displayed. 
    */ 
   private void showStatus(String text) 
   { 
     statusLabel.setText(text); 
   } 
   // ---- swing stuff to build the frame and all its components ---- 
   /** 
    * Create the Swing frame and its content. 
    */ 
   private void makeFrame() 
   { 
     frame = new JFrame("ImageViewer"); 
     makeMenuBar(frame); 
     Container contentPane = frame.getContentPane(); 
     // Specify the layout manager with nice spacing 
     contentPane.setLayout(new BorderLayout(6, 6)); 
     filenameLabel = new JLabel(); 
     contentPane.add(filenameLabel, BorderLayout.NORTH); 
     imagePanel = new ImagePanel(); 
     contentPane.add(imagePanel, BorderLayout.CENTER); 
     statusLabel = new JLabel(VERSION); 
     contentPane.add(statusLabel, BorderLayout.SOUTH); 
     // building is done - arrange the components and show     
     showFilename(null); 
     frame.pack(); 
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2); 
     frame.setVisible(true); 
   } 
   /** 
    * Create the main frame's menu bar. 
    * @param frame  The frame that the menu bar should be added to. 
    */ 
   private void makeMenuBar(JFrame frame) 
   { 
     final int SHORTCUT_MASK = 
       Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); 
     JMenuBar menubar = new JMenuBar(); 
     frame.setJMenuBar(menubar); 
     JMenu menu; 
     JMenuItem item; 
     // create the File menu 
     menu = new JMenu("File"); 
     menubar.add(menu); 
     item = new JMenuItem("Open"); 
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK)); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { openFile(); } 
               }); 
     menu.add(item); 
     item = new JMenuItem("Close"); 
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK)); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { close(); } 
               }); 
     menu.add(item); 
     menu.addSeparator(); 
     item = new JMenuItem("Quit"); 
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK)); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { quit(); } 
               }); 
     menu.add(item); 
     // create the Filter menu 
     menu = new JMenu("Filter"); 
     menubar.add(menu); 
     item = new JMenuItem("Darker"); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { makeDarker(); } 
               }); 
     menu.add(item); 
     item = new JMenuItem("Lighter"); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { makeLighter(); } 
               }); 
     menu.add(item); 
     item = new JMenuItem("Threshold"); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { threshold(); } 
               }); 
     menu.add(item); 
     // create the Help menu 
     menu = new JMenu("Help"); 
     menubar.add(menu); 
     item = new JMenuItem("About ImageViewer..."); 
       item.addActionListener(new ActionListener() { 
                 public void actionPerformed(ActionEvent e) { showAbout(); } 
               }); 
     menu.add(item); 
   } 
 } 



untuk ImagePanel :



 import java.awt.*; 
 import javax.swing.*; 
 import java.awt.image.*;
public class ImagePanel extends JComponent 
 { 
   // The current width and height of this panel 
   private int width, height; 
   // An internal image buffer that is used for painting. For 
   // actual display, this image buffer is then copied to screen. 
   private OFImage panelImage; 
   /** 
    * Create a new, empty ImagePanel. 
    */ 
   public ImagePanel() 
   { 
     width = 360;  // arbitrary size for empty panel 
     height = 240; 
     panelImage = null; 
   } 
   /** 
    * Set the image that this panel should show. 
    *  
    * @param image The image to be displayed. 
    */ 
   public void setImage(OFImage image) 
   { 
     if(image != null) { 
       width = image.getWidth(); 
       height = image.getHeight(); 
       panelImage = image; 
       repaint(); 
     } 
   } 
   /** 
    * Clear the image on this panel. 
    */ 
   public void clearImage() 
   { 
     Graphics imageGraphics = panelImage.getGraphics(); 
     imageGraphics.setColor(Color.LIGHT_GRAY); 
     imageGraphics.fillRect(0, 0, width, height); 
     repaint(); 
   } 
   // The following methods are redefinitions of methods 
   // inherited from superclasses. 
   /** 
    * Tell the layout manager how big we would like to be. 
    * (This method gets called by layout managers for placing 
    * the components.) 
    *  
    * @return The preferred dimension for this component. 
    */ 
   public Dimension getPreferredSize() 
   { 
     return new Dimension(width, height); 
   } 
   /** 
    * This component needs to be redisplayed. Copy the internal image  
    * to screen. (This method gets called by the Swing screen painter  
    * every time it want this component displayed.) 
    *  
    * @param g The graphics context that can be used to draw on this component. 
    */ 
   public void paintComponent(Graphics g) 
   { 
     Dimension size = getSize(); 
     g.clearRect(0, 0, size.width, size.height); 
     if(panelImage != null) { 
       g.drawImage(panelImage, 0, 0, null); 
     } 
   } 
 } 




untuk ImageFileManager :



 import java.awt.image.*; 
 import javax.imageio.*; 
 import java.io.*; 
public class ImageFileManager 
 { 
   // A constant for the image format that this writer uses for writing. 
   // Available formats are "jpg" and "png". 
   private static final String IMAGE_FORMAT = "jpg"; 
   /** 
    * Read an image file from disk and return it as an image. This method 
    * can read JPG and PNG file formats. In case of any problem (e.g the file  
    * does not exist, is in an undecodable format, or any other read error)  
    * this method returns null. 
    *  
    * @param imageFile The image file to be loaded. 
    * @return      The image object or null is it could not be read. 
    */ 
   public static OFImage loadImage(File imageFile) 
   { 
     try { 
       BufferedImage image = ImageIO.read(imageFile); 
       if(image == null || (image.getWidth(null) < 0)) { 
         // we could not load the image - probably invalid file format 
         return null; 
       } 
       return new OFImage(image); 
     } 
     catch(IOException exc) { 
       return null; 
     } 
   } 
   /** 
    * Write an image file to disk. The file format is JPG. In case of any  
    * problem the method just silently returns. 
    *  
    * @param image The image to be saved. 
    * @param file  The file to save to. 
    */ 
   public static void saveImage(OFImage image, File file) 
   { 
     try { 
       ImageIO.write(image, IMAGE_FORMAT, file); 
     } 
     catch(IOException exc) { 
       return; 
     } 
   } 
 }
 



untuk OFImage :



import java.awt.*; 
import java.awt.image.*; 
import javax.swing.*;
public class OFImage extends BufferedImage 
 { 
   /** 
    * Create an OFImage copied from a BufferedImage. 
    * @param image The image to copy. 
    */ 
   public OFImage(BufferedImage image) 
   { 
      super(image.getColorModel(), image.copyData(null),  
         image.isAlphaPremultiplied(), null); 
   } 
   /** 
    * Create an OFImage with specified size and unspecified content. 
    * @param width The width of the image. 
    * @param height The height of the image. 
    */ 
   public OFImage(int width, int height) 
   { 
     super(width, height, TYPE_INT_RGB); 
   } 
   /** 
    * Set a given pixel of this image to a specified color. The 
    * color is represented as an (r,g,b) value. 
    * @param x The x position of the pixel. 
    * @param y The y position of the pixel. 
    * @param col The color of the pixel. 
    */ 
   public void setPixel(int x, int y, Color col) 
   { 
     int pixel = col.getRGB(); 
     setRGB(x, y, pixel); 
   } 
   /** 
    * Get the color value at a specified pixel position. 
    * @param x The x position of the pixel. 
    * @param y The y position of the pixel. 
    * @return The color of the pixel at the given position. 
    */ 
   public Color getPixel(int x, int y) 
   { 
     int pixel = getRGB(x, y); 
     return new Color(pixel); 
   } 
   /** 
    * Make this image a bit darker. 
    */ 
   public void darker() 
   { 
     int height = getHeight(); 
     int width = getWidth(); 
     for(int y = 0; y < height; y++) { 
       for(int x = 0; x < width; x++) { 
         setPixel(x, y, getPixel(x, y).darker()); 
       } 
     } 
   } 
   /** 
    * Make this image a bit lighter. 
    */ 
   public void lighter() 
   { 
     int height = getHeight(); 
     int width = getWidth(); 
     for(int y = 0; y < height; y++) { 
       for(int x = 0; x < width; x++) { 
         setPixel(x, y, getPixel(x, y).brighter()); 
       } 
     } 
   } 
   /** 
    * Perform a three level threshold operation. 
    * That is: repaint the image with only three color values: 
    *     white, gray, and black. 
    */ 
   public void threshold() 
   { 
     int height = getHeight(); 
     int width = getWidth(); 
     for(int y = 0; y < height; y++) { 
       for(int x = 0; x < width; x++) { 
         Color pixel = getPixel(x, y); 
         int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3; 
         if(brightness <= 85) { 
           setPixel(x, y, Color.BLACK); 
         } 
         else if(brightness <= 170) { 
           setPixel(x, y, Color.GRAY); 
         } 
         else { 
           setPixel(x, y, Color.WHITE); 
         } 
       } 
     } 
   } 
 } 

Latihan Inheritance (Pewarisan)

Dalam latihan ini, study casenya adalah membuat class untuk menyimpan CD dan DVD dalam Class yang berbeda. Karena adanya properti yang sama dan berbeda di masing-masing item, maka dibuat suatu class "orangtua" (Item).

Kode :
1. Item.java
 
public class item
{
   
    private String title;
    private int playingTime;
    private boolean gotlt;
    private String comment;
    public item(String theTitle, int time)
    {
        title = theTitle;
        playingTime = time;
        gotlt = false;
        comment = "";
    }
    public void setComment(String comment)
    {
        this.comment=comment;
    }
    public String getComment()
    {
        return comment;
    }
    public void setOwn(boolean ownlt)
    {
        gotlt=ownlt;
    }
    public boolean getOwn()
    {
        return gotlt;
    }
    public void print()
    {
        System.out.print("title:"+title+"(" + playingTime + "mins)");
        if(gotlt)
        {
            System.out.println("*");
        }
        else
        {
            System.out.println(" " + comment);
        }
    }
}


2. CD.java

/**
 * kelas fungsi cd yang tidak ada di item
 */
public class cd extends item
{
    private String artist;
    private int numberOfTracks;

    public cd(String theTitle, String theArtist, int tracks, int time)
    {
        super(theTitle,time);
        artist = theArtist;
        numberOfTracks = tracks;
    }
    public String getArtist()
    {
        return artist;
    }
    public int getNumberOfTracks()
    {
        return numberOfTracks;
    }
}


3. DVD.java

/**
 * kelas fungsi dvd yang tidak ada di item
 * @version 1.0.1
 */
public class dvd extends item
{
    private String director;
    public dvd(String theTitle, String theDirector, int time)
    {
        super(theTitle,time);
        director=theDirector;
    }
    public String getDirector()
    {
        return director;
    }
   
}


4. Database.java

/**
 * @author abdi teh Alberto
 */
import java.util.ArrayList;
public class Database
{
    // instance variables - replace the example below with your own
    private ArrayList<item>items ;
    public Database()
    {
        items=new ArrayList<item>();
    }
    public void additem(item theItem)
    {
        items.add(theItem);
    }
    public void list()
    {
        for(item item:items)
        {
            item.print();
            System.out.println();
        }
    }
}



 

Java Applet dan JavaFX

Java Applet adalah sebuah program kecil yang ditulis dengan menggunakan
bahasa pemrograman Java, yang diakses melalui halaman Web dan dapat
didownload ke dalam mesin klien yang kemudian menjalankannya di dalam
jendela penjelajah Web. Java applet dapat secara dinamis menambahkan
beberapa fungsi kepada halaman-halaman Web yang bersifat statis. Akan
tetapi, untuk menjalankannya sebuah komputer harus memiliki program
penjelajah web yang dapat menjalankan Java, seperti Microsoft Internet
Explorer 4.0 ke atas, Netscape Navigator, Mozilla Firefox, dan Opera.

Kode :
import java.awt.*;
public class TesApplet extends java.applet.Applet{
    public void paint(Graphics g){
        Font f = new Font("SansSerif", Font.BOLD, 20);
        g.setFont(f);
        g.setColor(Color.BLUE);
        int xPusat = this.getSize().width/2;
        int yPusat = this.getSize().height/2;
        String s = "Selamat Belajar Java Applet";
        FontMetrics fm = this.getFontMetrics(f);
        int posisiX = xPusat - (fm.stringWidth(s)/2);
        g.drawString("Selamat Belajar java Applet", posisiX, yPusat);
    }
}

Tampilan :




JavaFX adalah platform perangkat lunak untuk membuat dan mengirim aplikasi dekstop , serta aplikasi internet yang dapat dijalankan di berbagai perangkat. JavaFX dimaksudkan untuk menggantikan Swing sebagai pustaka GUI standar untuk Java SE , tetapi keduanya akan dimasukkan untuk masa yang akan datang. JavaFX memiliki dukungan untuk komputer dekstop dan browser web di Microsoft Windows, Linux, dan macOS. Sejak rilis JDK 11 pada tahun 2018, JavaFX adalah bagian dari OpenJDK open-source, di bawah proyek OpenJFX. Oracle 'Dukungan Premier' untuk JavaFX juga tersedia, untuk versi jangka panjang saat ini (Java JDK 8) hingga Maret 2022.

Kode :
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.Random;

/**
 * JavaFX application that tells your fortune.
 *
 * @version 1.0
 */
public class FortuneTeller extends Application
{
    Text fortune = new Text("");
    String[] fortunes = {"Anda akan beruntung",
        "Anda akan hoki",
        "Anda akan kaya","Anda akan susah", "Anda akan sial"};

    @Override
    public void start(Stage stage) throws Exception
    {
        VBox box = new VBox();
        box.setPadding(new Insets(20));
        box.setSpacing(20);
        box.setAlignment(Pos.CENTER);
      
        Text title = new Text("Fortune Teller");
        title.setFont(Font.font("SanSerif", 36));
      
        box.getChildren().add(title);
      
        fortune.setFont(Font.font("SanSerif", 18));
      
        box.getChildren().add(fortune);
      
        Button button = new Button("New Fortune");
        box.getChildren().add(button);
      
        button.setOnAction(this::buttonClick);
      
        Scene scene = new Scene(box, 500, 250);
        stage.setTitle("Fortune Teller");
        stage.setScene(scene);
        stage.show();
    }

    private void buttonClick(ActionEvent event)
    {
        Random rand = new Random();
        fortune.setText(fortunes[rand.nextInt(fortunes.length)]);
    }
}


Tampilan :

Rabu, 11 Desember 2019

Final Project - Point of Sales


Nama : Ammar Alifian F
NRP : 05111840000007
Mata Kuliah : Pemrograman Berorientasi Objek - A

Untuk model POS, saya menggunakan versi sederhana dari Chromis POS (https://www.capterra.com/p/176624/Chromis-POS/). Chromis POS memiliki fitur :
a.       Menghitung total harga barang
b.      Mengambil properti barang dari ID (Barcode)
c.       Mencetak report
d.      Manajemen barang
Aplikasi Java yang saya buat memiliki alur sebagai berikut :

Screenshot aplikasi :








Source code untuk aplikasi Java tersebut bisa dilihat di GitHub (https://github.com/kerupuksambel/java-pos)