package jp.gr.java_conf.skrb.util.photoframe; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseMotionAdapter; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.util.Date; import java.util.Timer; import java.util.prefs.Preferences; import java.util.prefs.BackingStoreException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JSlider; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import jp.gr.java_conf.skrb.gui.swing.transframe.JTransFrame; public class PhotoFrame { private Preferences prefs; private final static String LOCATION_X = "x"; private final static String LOCATION_Y = "y"; private final static String ALPHA = "alpha"; private JFrame frame; private JLabel label; private JPopupMenu popup; private JSlider alphaSlider; private JSpinner alphaField; private AlphaComposite ac; private volatile int locationX; private volatile int locationY; private volatile double alpha; public PhotoFrame(String filename) throws IOException { prefs = Preferences.userNodeForPackage(this.getClass()); frame = new JTransFrame("PhotoFrame"); frame.setUndecorated(true); frame.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if (event.getButton() == MouseEvent.BUTTON1) { Point p = frame.getLocationOnScreen(); locationX = p.x - event.getX(); locationY = p.y - event.getY(); frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); } } public void mouseReleased(MouseEvent event) { if (event.isPopupTrigger()) { showPopupMenu(event.getComponent(), event.getX(), event.getY()); } else { int x = locationX + event.getX(); int y = locationY + event.getY(); prefs.putInt(LOCATION_X, x); prefs.putInt(LOCATION_Y, y); try { prefs.flush(); } catch (BackingStoreException ex) { ex.printStackTrace(); } frame.setLocation(x, y); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } }); alpha = prefs.getDouble(ALPHA, 1.0); ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)alpha); ImageComponent icomp = new ImageComponent(filename); popup = initPopupMenu(); frame.getContentPane().add(icomp); int x = prefs.getInt(LOCATION_X, 0); int y = prefs.getInt(LOCATION_Y, 0); frame.setLocation(x, y); frame.pack(); frame.setVisible(true); } private JPopupMenu initPopupMenu() { JPopupMenu menu = new JPopupMenu(); JMenuItem item = new JMenuItem("アルファの設定..."); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { changeAlpha(); } }); menu.add(item); item = new JMenuItem("終了"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); menu.add(item); return menu; } private void changeAlpha() { JPanel panel = new JPanel(); JLabel l = new JLabel("Alpha"); panel.add(l); alphaSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, (int)(alpha*255.0)); alphaSlider.setMajorTickSpacing( 85 ); alphaSlider.setMinorTickSpacing( 17 ); alphaSlider.setPaintTicks( true ); alphaSlider.setPaintLabels( true ); alphaSlider.addChangeListener(new ChangeListener() { public void stateChanged( ChangeEvent e ) { alpha = alphaSlider.getValue()/255.0 ; alphaField.setValue(new Integer(alphaSlider.getValue())); setAlpha(alpha); frame.repaint(); } }); l.setLabelFor(alphaSlider); panel.add(alphaSlider); alphaField = new JSpinner( new SpinnerNumberModel((int)(alpha*255.0), 0, 255, 1)); JPanel alphaFieldHolder = new JPanel(new FlowLayout()); alphaField.addChangeListener(new ChangeListener() { public void stateChanged( ChangeEvent e ) { alpha = ((Integer)alphaField.getValue()).intValue()/255.0; alphaSlider.setValue(((Integer)alphaField.getValue()).intValue()); setAlpha(alpha); frame.repaint(); } }); alphaFieldHolder.add(alphaField); panel.add(alphaFieldHolder); JOptionPane.showMessageDialog(frame, panel, "アルファの設定", JOptionPane.PLAIN_MESSAGE, null); } private void setAlpha(double alpha) { this.alpha = alpha; ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)alpha); prefs.putDouble(ALPHA, alpha); } private void showPopupMenu(Component comp, int x, int y) { popup.show(comp, x, y); } class ImageComponent extends JComponent { private Image image; public ImageComponent(String filename) throws IOException { image = ImageIO.read(new File(filename)); } public Dimension getPreferredSize() { return new Dimension(image.getWidth(this), image.getHeight(this)); } public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setComposite(ac); g2d.drawImage(image, 0, 0, this); } } public static void main(String[] args) { if (args.length < 1) { System.out.println("java PhotoFrame [filename or URL]"); return; } try { new PhotoFrame(args[0]); } catch (IOException ex) { System.out.println("ファイルが存在しません"); } } }