作成 2010.01.11
更新 2010.01.11
Java - ウィンドウをリサイズしても描画が消えないようにするメモ
コンパイルバージョンは javac 1.6.0_17 です。
ウィンドウのリサイズは ComponentListener で取得する。
Graphics で描画する内容は BufferedImage で保持する。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

class Oresen implements ActionListener,Runnable{
  static final String STR_TITLE = "test";
  static final String STR_END = "End";
  static final String STR_FILE = "File";
  static final String STR_SAVE = "Save";
  static final String STR_OPEN = "Open";
  Oresen(){
  }
  public void run(){
    JFrame f = new JFrame(STR_TITLE);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new BorderLayout());
    f.setSize(400,300);
    JMenuBar mb = new JMenuBar();
    JMenu m = null;
    JMenuItem mi = null;
    m = new JMenu(STR_FILE);
    m.setMnemonic(KeyEvent.VK_F);
    mi = new JMenuItem(STR_OPEN, KeyEvent.VK_O);
    mi.setMnemonic(KeyEvent.VK_O);
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
    mi.setActionCommand(STR_OPEN);
    mi.addActionListener(this);
    m.add(mi);
    mi = new JMenuItem(STR_SAVE, KeyEvent.VK_S);
    mi.setMnemonic(KeyEvent.VK_S);
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
    mi.setActionCommand(STR_SAVE);
    mi.addActionListener(this);
    m.add(mi);
    m.addSeparator();
    mi = new JMenuItem(STR_END, KeyEvent.VK_E);
    mi.setMnemonic(KeyEvent.VK_E);
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
    mi.setActionCommand(STR_END);
    mi.addActionListener(this);
    m.add(mi);
    mb.add(m);
    f.setJMenuBar(mb);
    OresenCanvas oc = new OresenCanvas();
    oc.addComponentListener(oc);
    oc.addMouseListener(oc);
    f.add(oc, BorderLayout.CENTER);
    f.setVisible(true);
  }
  public void actionPerformed(ActionEvent e){
    if(STR_END.equals(e.getActionCommand())){
      System.exit(0);
    }
  }
  public static void main(String args[]){
    Oresen o = new Oresen();
    SwingUtilities.invokeLater(o);
  }
}

class OresenCanvas extends Canvas implements ComponentListener,MouseListener{
  public static final long serialVersionUID = 1111L;
  BufferedImage bi = null;
  Graphics2D g2d = null;
  Point pp = null;
  OresenCanvas(){
    setBackground(Color.WHITE);
  }
  public void mouseClicked(MouseEvent e){
    Point p = e.getPoint();
    if(pp == null){
      g2d.fillOval(p.x, p.y, 1, 1);
    }else{
      g2d.drawLine(pp.x, pp.y, p.x, p.y);
    }
    pp = p;
    paint(getGraphics());
  }
  public void paint(Graphics g){
    g.drawImage(bi, 0, 0, this);
  }
  public void mouseEntered(MouseEvent e){}
  public void mouseExited(MouseEvent e){}
  public void mousePressed(MouseEvent e){}
  public void mouseReleased(MouseEvent e){}
  public void componentHidden(ComponentEvent e){}
  public void componentMoved(ComponentEvent e){}
  public void componentResized(ComponentEvent e){
    int w = getWidth();
    int h = getHeight();
    boolean isChange = false;
    if(bi == null){
      isChange = true;
    }else{
      if(w > bi.getWidth()){
        isChange = true;
      }else{
        w = bi.getWidth();
      }
      if(h > bi.getHeight()){
        isChange = true;
      }else{
        h = bi.getHeight();
      }
    }
    if(isChange){
      BufferedImage nbi = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
      g2d = nbi.createGraphics();
      g2d.setBackground(Color.WHITE);
      g2d.setColor(Color.WHITE);
      g2d.fill(new Rectangle(0, 0, w, h));
      g2d.setColor(Color.RED);
      if(bi != null){
        g2d.drawImage(bi, 0, 0, this);
      }
      bi = nbi;
    }
  }
  public void componentShown(ComponentEvent e){}
}
タグ: Java

©2004-2017 UPKEN IPv4