タグ
  ANSI (1)
  ASP.NET (10)
  Active Directory (55)
  BAT (16)
  Backup (2)
  CSharp (11)
  CentOS (4)
  C言語 (4)
  DNS (4)
  Excel (3)
  FFmpeg (1)
  Fedora (4)
  FreeBSD (6)
  IPv6 (3)
  Java (11)
  JavaScript (8)
  LAN (1)
  Link (4)
  Linux (15)
  Mac (1)
  Mail (2)
  Microsoft (3)
  NIS (1)
  Node.js (6)
  OpenIndiana (1)
  OpenLDAP (2)
  OpenSSL (1)
  OpenSolaris (4)
  PHP (2)
  Perl (2)
  Postfix (1)
  PostgreSQL (2)
  PowerShell (34)
  RFC (3)
  SQL Server (5)
  Solaris (10)
  Ubuntu (9)
  VBScript (73)
  VCpp (2)
  VMware (3)
  Visual Basic (1)
  WMI (17)
  WSF (5)
  WSH (10)
  Windows (19)
  bash (1)
  bind (1)
  iSCSI (1)
  おまけ (3)
  作成中 (8)
  慣用句 (3)
  正規表現 (6)
  運用 (8)
作成 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-2012 UPKEN IPv4