- PR -

JSplitPaneでのペイント

1
投稿者投稿内容
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-10 03:13
どうも。
また質問させて頂きます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22893&forum=12&8

ここも私がした質問なのですが、
画面を2分割して左にペイント右にテキストミックス
と言う物を作っています。

前回の質問で右側にテキストミックスを表示させる事は出来たのですが、
今回は
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23176&forum=12&13
ここで出来たプログラムをそのまま左側に使いたいのです。

自分でやってみたら、前回の質問のプログラムのままでした。
ちゃんとSplitPaneの命令を出しているのに無視され、そのままだったのです。

コードは下なのですが、目星はおそらく
private JPanel createPanel1() {
の中身がないということなのだと思いますが、
その中にこの場合何を入れたらよいのか分からず質問させて頂きました。

コード:

import java.lang.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import java.awt.image.*;
import java.util.*;
import java.util.List;
import javax.imageio.stream.*;

public class POST{
public static void main(String[] args){
MyFrame mf = new MyFrame();
mf.setBounds( 0, 0, 1024, 768);
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mf.show();
}
}

class MyFrame extends JFrame {
private JMenuBar menuBar;
private JFileChooser fileChooser;
private BufferedImage[] images;
private static Set readerSuffixes = getReaderSuffixes();
private static Set writerFormats = getWriterFormats();
private final JPanel panel;
private Point2D.Double p1 = new Point2D.Double(); // 始点
private Point2D.Double p2 = new Point2D.Double(); // 終点
private Line2D.Double line = new Line2D.Double(); // 直線
private BufferedImage image = null;
private boolean flag = false;
private File[] files;
private static int imageCounter=0;

public MyFrame() {
super("PaintOpenSaveText");
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setLeftComponent(createPanel1());
splitPane.setRightComponent(createPanel2());
splitPane.setDividerSize(2);
splitPane.setDividerLocation(700);
Container content = this.getContentPane();
content.add(splitPane, BorderLayout.CENTER);

panel = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D)g).drawImage(image, 0, 0, this);
}
};

image = new BufferedImage(600,500,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D)image.getGraphics();
g.setColor(panel.getBackground());
g.fillRect(0,0,600,500);
g.dispose();

this.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER);
panel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
p1.setLocation(p2);
p2.setLocation((double)e.getX(), (double)e.getY());
if(image==null) {
Dimension d = panel.getSize();
int w = d.width;
int h = d.height;
image = (BufferedImage)panel.createImage(w,h);
}
Graphics2D imageGraphics = (Graphics2D)image.createGraphics();
imageGraphics.setStroke(new BasicStroke(3.0F));
imageGraphics.setPaint(Color.black);
if(flag) {
imageGraphics.drawImage(image, 0, 0, null);
flag = false;
}
if(!p1.equals(p2)) {
line.setLine(p1,p2);
imageGraphics.draw(line);
p1.setLocation(p2);
}
imageGraphics.dispose();
repaint();
}
});

panel.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
p1.setLocation((double)e.getX(), (double)e.getY());
p2.setLocation(p1);
}
});

JMenu fileMenu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open");
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
openFile();
}
});
fileMenu.add(openItem);

JMenu saveMenu = new JMenu("Save");
Iterator iter = writerFormats.iterator();
while (iter.hasNext()) {
final String formatName = (String)iter.next();
JMenuItem formatItem = new JMenuItem(formatName);
saveMenu.add(formatItem);
formatItem.addActionListener(new
ActionListener() {
public void actionPerformed(ActionEvent event) {
saveFile(formatName);
}
});
}
fileMenu.add(saveMenu);

JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
fileMenu.add(exitItem);

JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}

public void openFile() {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileFilter(new
javax.swing.filechooser.FileFilter() {
public boolean accept(File f) {
if (f.isDirectory()) return true;
String name = f.getName();
int p = name.lastIndexOf('.');
if (p == -1) return false;
String suffix
= name.substring(p + 1).toLowerCase();
return readerSuffixes.contains(suffix);
}
public String getDescription() {
return "Image files";
}
});
int r = chooser.showOpenDialog(this);
if (r != JFileChooser.APPROVE_OPTION) return;
File f = chooser.getSelectedFile();
try{
image = ImageIO.read(f.toURL());
panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
flag = true;
}catch(IOException exception) {
JOptionPane.showMessageDialog(this, exception);
}
panel.revalidate();
}

private class imageFileSaveListener implements ActionListener{
private BufferedImage images;
public void actionPerformed(ActionEvent evt){
JFileChooser chooser = new JFileChooser();
if(files[imageCounter-1]!=null){chooser.setCurrentDirectory(files[imageCounter-1]);}
final ExtensionFileFilter filter = new ExtensionFileFilter();
filter.addExtension("jpg");
filter.addExtension("jpeg");
filter.setDescription("jpg,jpeg");
int result= chooser.showSaveDialog(MyFrame.this);
if(result == JFileChooser.APPROVE_OPTION){
File f=chooser.getSelectedFile();
}
}
}

public void saveFile(final String formatName){
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
Iterator iter = ImageIO.getImageWritersByFormatName(formatName);
ImageWriter writer = (ImageWriter)iter.next();
chooser.setFileFilter(new
javax.swing.filechooser.FileFilter(){
public boolean accept(File f){
if (f.isDirectory()) return true;
String name = f.getName();
int p = name.lastIndexOf('.');
if (p == -1) return false;
String suffix = name.substring(p + 1).toLowerCase();
return writerFormats.contains(suffix);
}
public String getDescription() {
return "Image files";
}
});

int r = chooser.showSaveDialog(this);
if (r != JFileChooser.APPROVE_OPTION) return;
File f = chooser.getSelectedFile();
try {
ImageOutputStream imageOut = ImageIO.createImageOutputStream(f);
writer.setOutput(imageOut);
writer.write(image);
writer.dispose();
imageOut.close();
}catch (IOException exception) {
JOptionPane.showMessageDialog(this, exception);
}
}

public static Set getReaderSuffixes() {
TreeSet readerSuffixes = new TreeSet();
String[] informalNames = ImageIO.getReaderFormatNames();
for (int i = 0; i < informalNames.length; i++) {
Iterator iter = ImageIO.getImageReadersByFormatName(
informalNames[i]);
while (iter.hasNext()) {
ImageReader reader = (ImageReader)iter.next();
String[] s = reader.getOriginatingProvider()
.getFileSuffixes();
readerSuffixes.addAll(Arrays.asList(s));
}
}
return readerSuffixes;
}

public static Set getWriterFormats() {
TreeSet writerFormats = new TreeSet();
TreeSet formatNames = new TreeSet(Arrays.asList(
ImageIO.getWriterFormatNames()));
while (formatNames.size() > 0) {
String name = (String)formatNames.iterator().next();
Iterator iter = ImageIO.getImageWritersByFormatName(name);
ImageWriter writer = (ImageWriter)iter.next();
String[] names = writer.getOriginatingProvider().getFormatNames();
writerFormats.add(names[0]);
formatNames.removeAll(Arrays.asList(names));
}
return writerFormats;
}

private JPanel createPanel1() {
JPanel p = new JPanel();
p.setLayout(null);

return p;
}

private JPanel createPanel2() {
JPanel p = new JPanel();
p.setLayout(null);

labela = new JLabel("苗字");
labela.setLocation(10,10);
labela.setSize(100,25);
getContentPane().add(labela);

fielda = new JTextField();
fielda.setLocation(10,30);
fielda.setSize(150,25);
getContentPane().add(fielda);

labelb = new JLabel("ID");
labelb.setLocation(10,60);
labelb.setSize(100,25);
getContentPane().add(labelb);

fieldb = new JTextField();
fieldb.setLocation(10,80);
fieldb.setSize(150,25);
getContentPane().add(fieldb);

labelc = new JLabel("名前");
labelc.setLocation(10,110);
labelc.setSize(100,25);
getContentPane().add(labelc);

fieldc = new JTextField();
fieldc.setLocation(10,130);
fieldc.setSize(150,25);
getContentPane().add(fieldc);

labeld = new JLabel("コメント");
labeld.setLocation(10,160);
labeld.setSize(100,25);
getContentPane().add(labeld);

area = new JTextArea();
area.setLocation(10,180);
area.setSize(270,250);
area.setWrapStyleWord(true);
getContentPane().add(area);

return p;
}
}

class ExtensionFileFilter {
public void addExtension(String extension) {
if (!extension.startsWith("."))
extension = "." + extension;
extensions.add(extension.toLowerCase());
}
public void setDescription(String aDescription) {
description = aDescription;
}
public String getDescription() {
return description;
}
public boolean accept(File f){
if (f.isDirectory()) return true;
String name = f.getName().toLowerCase();
for (int i = 0; i < extensions.size(); i++)
if (name.endsWith((String)extensions.get(i)))
return true;
return false;
}
private String description = "";
private ArrayList extensions = new ArrayList();
}



[ メッセージ編集済み 編集者: KDS 編集日時 2005-08-10 06:05 ]

[ メッセージ編集済み 編集者: KDS 編集日時 2005-08-10 06:08 ]
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-08-10 09:18
ども前回、前々回にResつけました、いっきゅうです。

回答としては一言。
createPanel1()で返ってくるのがMyFrameのpanelになります。

つまり、MyFrameでpanel変数に加える処理をcreatePanel1()でするか、
splitPane.setLeftComponent(createPanel1());

splitPane.setLeftComponent(panel);
とすればいいだけのような気がします。
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-12 01:13
いっきゅうさん
毎回ありがとうございます。

ご指摘通りにプログラムを直して見たのですが、
結果は同じでした。。。

他に変える所があると思うのですが、
どこか分からず。。。

引き続きお願いしてもよろしいですか??
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-08-12 11:38
あまりきついことはいいたくありませんが
良くソースコード確認して下さい!!

私が指摘した以前のミスが多々あります。

まず1行1行のコードの意味とパネルなどのオブジェクトの構成は
しっかり把握しましょう。

あなたのコードでは
JFrameのContentPaneはですが
これにthis.getContentPane()でsplitPaneやJScrollPaneやJLabelやJButtonが配置されていますよ?
これはKDSさんが想定がどうかは知りませんがsplitPaneだけのはず、
で前回の私のResで
> createPanel1()で返ってくるのがMyFrameのpanelになります。
としてましたがnew JScrollPane(panel)の間違えでしたが
ようは
content.add(splitPane, BorderLayout.CENTER);としたあとに
this.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER);
と同じ場所に配置してるのはおかしいですよね?
createPanel2()のpですが空のままでは意味ないですよ。

気づいた限りはこんな感じです

KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-13 18:27
いっきゅうさん
ありがとうございます。

ご指摘どおりソースコードの確認や明らかなミスの訂正などをしました。
結果、自分の望んでいる物が形だけ出来ました。
本当にありがとうございます。

形だけと言うのは、
まだ少しエラーが出ると言う事なんですね。。
openFileをした際にNullPointerExceptionが出るのです。
しかし、あと少しで出来そうなので、
頑張ってみたいと思いますし、
分からなくなればここにまた質問をさせてもらうことも有るかもしれません。

では、いっきゅうさん並びに私のプログラムに指摘してくださった方々
本当にどうもありがとうございました。
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-15 04:54
すいません。また質問させて頂きます。
質問と言うのは上にも書いてあるとおりのことなのですが、
openFileをした際にNullPointerExceptionが出ると言う物です。
openFileに関するところのソースを確認してみたのですが、
何がおかしいのかチョット良く分かりませんでした。

少し具体的に言うとopenFileを選択しただけだと、
NullPointerExceptionは出ません。
画像を読み込んだ場合にのみNullPointerExceptionが出ます。
他のSaveやExitなどの場合はNullPointerExceptionが出る事はありませんでした。
一応コードを記載します。
コード:
        JMenuItem openItem = new JMenuItem("Open");
	    openItem.addActionListener(new ActionListener() {
           	public void actionPerformed(ActionEvent event) {
				openFile();
           	}
        });
        fileMenu.add(openItem);


コード:
    public void openFile() {
      JFileChooser chooser = new JFileChooser();
      chooser.setCurrentDirectory(new File("."));
      chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {  
            public boolean accept(File f) {  
               if (f.isDirectory()) return true;
               String name = f.getName();
               int p = name.lastIndexOf('.');
               if (p == -1) return false;
               String suffix = name.substring(p + 1).toLowerCase();
               return readerSuffixes.contains(suffix);
            }
            public String getDescription() {  
               return "Image files";
            }
         });
      int r = chooser.showOpenDialog(this);
      if (r != JFileChooser.APPROVE_OPTION) return;
      File f = chooser.getSelectedFile();
      try{
	  	image = ImageIO.read(f.toURL()); 
		panel.setPreferredSize(new Dimension(image.getWidth(), image.getHeight())); 
		flag = true; 
		}catch(IOException exception) { 
			JOptionPane.showMessageDialog(this, exception); 
		} 
      panel.revalidate();
   }

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-08-15 11:40
質問する前に、NPEのスタックトレースをご覧になって、
ソースのどの行でNPEが発生したかを確認するとよいですよ。

KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-15 13:13
シュンさん
レスありがとうございます。
NPE?スタックトレース?
って思ったんですがw
NPEはNullPointerException
スタックトレースはコマンドプロンプトのエラーの表示のことですね
やっと分かりましたw

あと、そのスタックトレースを確認して、
エラーを確認していったところ事故解決できました^^
皆さんありがとうございます。
ご迷惑をお掛けしてすいませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)