java初心者が座標取得と図形表示の問題を解決する方法

このQ&Aのポイント
  • java初心者がマウスクリックした座標を表示するプログラムを作成していますが、図形表示が一瞬だけになる問題があります。また、ウィンドウのサイズを変更すると図形が一瞬で消えてしまいます。どのように修正すればよいでしょうか?
  • 日本語の表示もうまくいっておらず、化けた文字が表示されます。この問題も解決方法を教えてください。
  • 現在のソースコードを確認しましたが、paintメソッド内の実装に問題があります。修正することで図形表示の問題と日本語表示の問題を解決できます。具体的な修正方法について詳しく説明します。
回答を見る
  • ベストアンサー

java初心者です。座標取得と図形表示について

マウスをクリックするとその座標を表示するプログラムです。 画面には常に二つの四角形が表示されていて、どこをクリックしたかによって表示が変わるというものです。 (オレンジの四角形内をクリックした場合、 X:100 オレンジ Y:100 オレンジ のように表示します。) ですが、私が組んでみたプログラムでは図形表示が一瞬だけになってしまいます。 また、ウインドウの大きさを動かしてみると一瞬移っては消えてしまうという状態です。 それから、「オレンジ」などの日本語表示がうまくいかず「□□□」のように表示されてしまいます。 これらの問題を解決するにはどこをどう修正したらよいでしょうか? 以下が初心者なりに組んでみたソースです。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.Toolkit; import java.awt.Graphics2D; import java.awt.Graphics; import java.awt.Font; import java.awt.Rectangle; import java.lang.String; import java.lang.System; import javax.swing.JFrame; import javax.swing.JPanel; public class kadai33 extends JFrame { private static final long serialVersionUID = 1L; public kadai33() { add(new DrawPanel()); } public static void main(String[] args) { Toolkit.getDefaultToolkit().setDynamicLayout(true); JFrame f = new kadai33(); f.setTitle("マウスの座標を表示"); f.setDefaultCloseOperation(EXIT_ON_CLOSE); f.setBackground(Color.WHITE); f.setSize(400, 750); f.setVisible(true); } class DrawPanel extends JPanel implements MouseListener { int x; int y; public DrawPanel() { setBackground(Color.white); addMouseListener(this); } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } public void paint(Graphics g) { Font font=new Font("Arial",Font.PLAIN,16); super.paintComponent(g); //super.paint(g); Graphics2D g1 = (Graphics2D)this.getGraphics(); Rectangle rect = new Rectangle(); rect.setRect(50,50,200,200); g1.setColor(Color.ORANGE); g1.fill(rect); Graphics2D g2 = (Graphics2D)this.getGraphics(); Rectangle rect2 = new Rectangle(); rect2.setRect(150,350,150,150); g2.setColor(Color.GREEN); g2.fill(rect2); Graphics2D g3 = (Graphics2D)this.getGraphics(); Rectangle rect3 = new Rectangle(); rect3.setRect(50,650,200,50); g3.setColor(Color.BLACK); g3.fill(rect3); if(x>=50 && x<=250 && y>=50 && y<=250){ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g4 = (Graphics2D)g; g4.setFont(font); g4.setColor(Color.WHITE); g4.drawString("オレンジ",120,670); g4.drawString("オレンジ",120,690); } if(x>=150 && x<=300 && y>=350 && y<=500){ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g5 = (Graphics2D)g; g5.setFont(font); g5.setColor(Color.WHITE); g5.drawString("グリーン",120,670); g5.drawString("グリーン",120,690); } else{ super.paintComponent(g); String sx = String.format("X:%d", x); String sy = String.format("Y :%d", y); g.setFont(font); g.setColor(Color.BLACK); g.drawString(sx, 65, 670); g.drawString(sy, 65, 690); Graphics2D g6 = (Graphics2D)g; g6.setFont(font); g6.setColor(Color.WHITE); g6.drawString("対象外",120,670); g6.drawString("対象外",120,690); } } } } 大変困っています。 どうかよろしくお願いいたしますm(__)m

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

豆腐になるのは文字コードの問題かな? 長方形を描くごとにいちいちグラフィックスコンテキストを取得するのはなぜだろう.

lana466
質問者

お礼

回答ありがとうございます! こういうことでしょうか? Graphics2D g1 = (Graphics2D)this.getGraphics(); Rectangle rect = new Rectangle(); rect.setRect(50,50,200,200); g1.setColor(Color.ORANGE); g1.fill(rect); Rectangle rect2 = new Rectangle(); rect2.setRect(150,350,150,150); g1.setColor(Color.GREEN); g1.fill(rect2); やはりこれだけでは治りませんでした。 文字はともかく、せめて図形を常に表示させたいのですが、 具体的にどこをどうすればよいのかまったくわかりません・・・

関連するQ&A

  • Java初心者ですが・・・

    Java初心者ですが・・・ こんにちは、さっそくですが質問させていただきます 以下のようなコードがあるとき、特定のキーを押したときに、 表示されている文字列を消去するには、どのようにすればよいのでしょうか 特定のキーコードのときに、str1に、"" を代入するだけではだめなのでしょうか お手数ですがよろしくお願いします import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class App25_2 extends Applet { char ch; FontMetrics fo; String st1 ="", st2; public void init() { setBackground(new Color(190,190,210)); setFont(new Font("Serif", Font.BOLD, 30)); fo = getFontMetrics(getFont()); addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { ch = e.getKeyChar(); st2 = String.valueOf(ch); st1 += st2; repaint(); } } ); } public void paint(Graphics g) { Dimension dim = getSize(); g.setColor(Color.red); ; int stwidth = fo.stringWidth(st1); g.drawString(st1, (dim.width/2) - stwidth/2, dim.height/2 ); } }

    • ベストアンサー
    • Java
  • javaでgraphicsの描画の件

    今日は javaでgraphicsの描画を行っていますが、CENTERのペインには、描画できますが、 それ以外のペイン(NORTH,WEST、EAST,、SOUTH)には、描画できないように思います。 Q1)この件について、コメント頂けますと大変助かります。 下記に、ソースコードを添付いたします。 =================== package pkg; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class SampleApp extends JFrame { public SampleApp(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600, 300); this.add(new GPanel(), BorderLayout.WEST); this.add(new GPanel(), BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); // int w = this.getWidth(); // int h = this.getHeight(); int w=200; int h=200; g.setColor(Color.RED); g.fillOval(0, 0, w/2, h/2); Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(40, 40, w,h)); g.setColor(Color.BLUE); g.setFont(new Font("Serif", Font.BOLD, 36)); g.drawString("Graphics draw!", 10, h - 50); // g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(8.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } }

    • ベストアンサー
    • Java
  • 画面のちらつきの原因が知りたいです

    JAVAの初心者です、宜しくお願いします。 下のようなプログラムを書きました。 「public void paint(Graphics g){ ~ repaint();」とすると、画像がちらつきます、しかし、「repaint();」を消すとちらつかなくなります、この原因が分かりません。 一体何故このような現象が起こるのでしょうか、宜しくお願いします。 ========================================================== import java.applet.Applet; import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Oval_Rec_1_071128 extends Applet implements MouseListener , ActionListener { int x1 ; int y1 ; int xh = 50 ; int yv = 50 ; Button bt1 ; Button bt2 ; public void actionPerformed(ActionEvent ae){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void init() { setBackground(Color.yellow); addMouseListener(this); bt1 = new Button("push"); bt1.setFont(new Font("SansSerif", Font.BOLD, 20)); bt1.setBackground(Color.black); bt1.setForeground(Color.lightGray); add(bt1); bt1.addActionListener(this); bt2 = new Button("change_circle"); add(bt2); bt2.addActionListener(this); } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); xh = e.getX(); yv = e.getY(); // repaint(); //comment out } public void paint(Graphics g) { g.setColor(Color.red); g.setFont(new Font("Serif",Font.BOLD,24)); g.drawString("Hello Applet World ! !" , 50 , 50); g.setColor(Color.blue); g.drawLine( 100 , 100 , 500 , 500); g.setColor(Color.cyan); g.fillOval( x1 , y1 , xh , yv); g.setColor(Color.magenta); g.fillRect( xh , yv, x1/10 , y1/10 ); repaint(); } }

    • ベストアンサー
    • Java
  • javaアプレットでのy=x^2のグラフ

    javaアプレットでy=x^2のグラフを描写したいのですが、現在の状態ではグラフの右側しか画面に現れません。軸の移動をすればよいと思うのですが、どのように修正すればよいのでしょうか? import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class test1 extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); int x,yp=100,xp=0; for(x=0;x<200;x++){ int y=(int)(x*x)*(-1)+100; g.drawLine(xp,yp,x,y); xp = x; yp = y; } } }

  • 【java applet】他のクラスを呼び出して図形を描写するには

    はじめまして。 非常に簡単なことで、申し訳ないのですが質問させていただきます。 アプレットをextendsしたAppクラスで 他のMakeImgクラスのインスタンス(mi)を 作成し、MakeImgクラスのペイントメソッドを 実行して、図形を描写したいのですが、 下記のプログラムではコンパイルできても 図形が描写されません。 ペイントメソッドは明示的に呼び出さなくても 呼ばれるはずなので図形を描いてくれてもよさそうなのですが。。。 どなたか詳しい方、同じような問題を経験した方がいらっしゃったらぜひ回答していただければと思います。 それではよろしくお願い致します。 ////////////////////////////////////////////// import java.applet.Applet; import java.awt.*; /* <applet code="App.class" width="300"height="300"> </applet> */ public class App extends Applet {  MakeImg mi;  public void init()  {   mi = new MakeImg();  } } class MakeImg {  public void paint(Graphics g)  {   g.setColor(Color.white);   g.fillRect(0 , 0 , 300 , 300);   g.setColor(Color.black);   g.drawString("test",40,30);  } }

  • 文字列の表示

    Graph2クラスで作った文字と直線をMainFrameクラスで作ったフレームに表示させたいのですが、フレームが作成されるだけで文字と直線が表示されません。どうすれば表示されるのか是非教えてください。お願いします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Graph1 { public static void main(String argv[]) { MainFrame MF = new MainFrame(); MF.setVisible(true); } } class MainFrame extends Frame { public MainFrame() { setLocation(500 , 200); setTitle("MainFrame"); setSize(500 , 300); setLayout(null); //Graph2 aGraph2 = new Graph2(); //aGraph2.show(); addWindowListener(new MyWinL()); } private class MyWinL extends WindowAdapter { public void windowClosing(WindowEvent e) { System.out.println("終了しました。\n"); System.exit(0); } } } class Graph2 extends JApplet { public void paint(Graphics g) { g.setColor(Color.GRAY); for (int i=0; i < 5; i++) { g.drawLine(0, 50*i, 400, 50*i); } for (int i=0; i < 9; i++) { g.drawLine(50*i, 0, 50*i, 200); } Font font1 = new Font("Serif" , Font.PLAIN,30); Font font2 = new Font("SansSerif" , Font.PLAIN,30); Font font3 = new Font("MS P明朝" , Font.PLAIN,30); Font font4 = new Font("MS Pゴシック" , Font.PLAIN,30); g.setColor(Color.RED); g.setFont(font1); g.drawString("Hello! Java world!", 50, 50); g.setFont(font2); g.drawString("Hello! Java world!", 50, 100); g.setColor(Color.BLUE); g.setFont(font3); g.drawString("Hello! Java world!", 50, 150); g.setFont(font4); g.drawString("Hello! Java world!", 50, 200); }; }

    • ベストアンサー
    • Java
  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • 初心者です。 コンパイルのエラー

    import java.awt.*; import javax.swing.*; public class R11Sample1 extends JFrame { Rect r1 = new Rect(Color.red, 100, 100, 80, 60); Rect r2 = new Rect(new Color (0.5f, 1f, 0f, 0.7f), 150, 120, 60, 90); Oval = new Oval(Color.blue, 60, 50, 10, 10); JPanel panel = new JPanel() { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; r1.draw(g2); r2.draw(g2); } }; public R11Sample1() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(panel); } public static void main(String[] args) { new R11Sample1().setVisible (true); } } class Rect { Paint pat; int xpos, ypos, width, height; public Rect(Paint p, int x, int y, int w, int h) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillRect(xpos-width/2, ypos-height/2, width, height); } } class Oval { Paint pat; int xpos, ypos, radius; public Oval(Paint p, int x, int y, int width, int height) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillOval(xpos-width/2, ypos-height/2, width, height); } } これでコンパイルすると、 Identifierがありません といわれました。 どこを直せばいいのでしょうか。 また、全体的に間違ったところがあったら教えてください。

    • ベストアンサー
    • Java
  • Javaのアプレットについて質問です。

    星型の図形をアプレットビューワ上でマウスを押した場所に移動させたいのですが・・・ import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.awt.Polygon; public class Enshu1_5 extends Applet implements MouseListener { int px []={100,80,10,70,40,100,160,130,190,120}; int py []={10,75,75,113,190,140,190,113,75,75}; private Polygon poly = new Polygon(px,py,10 ); public void init() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.setColor(Color.red); g.fillPolygon(poly); g.setFont(new Font("serif",Font.BOLD,24)); g.drawString("Star",100,200); } } こんな感じでつくってみたのですが現在位置とクリック位置との差分割り出し方をpublic void mouseClicked(MouseEvent e)の所に書きたいのですが普通にpoly.translate( e.getX(), e.getY() );をしてしまうと原点からの移動になってしまうため、フィールド上にint x=0,y=0をつくりmouseClickedのところで if(e.getX()>x&&e.getY()>y) { int dx=e.getX()-x; int dy=e.getY()-y; x=dx; y=dy; poly.translate(dx,dy); repaint(); }の様な感じで考えられる条件を条件分岐していこうと思ったのですがどうもうまくいきませんしかなりかさばったものになってしまうと思います。何かいい方法はないでしょうか? 教えて下さい><

    • ベストアンサー
    • Java
  • 任意の文字列をJAVAで画像化

    表題にある通り任意の文字列をJAVAで画像化したいと思い 下記サンプルを検索して見つけたのですが作成される画像は 真っ白な画像で文字列は表示されませんでした。 任意の文字列を画像として出力するにはどうすればよいでしょうか。 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class Test5 { public static void main(String[] args) { String str = "abc123"; new Test5().Create(str); System.out.println(str); } public void Create(String str) { int w=60; int h=17; try { //受け取った文字列を画像化 BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g2d=image.createGraphics(); g2d.setBackground(Color.WHITE); g2d.clearRect(0,0,w,h); g2d.setColor(Color.BLACK); g2d.drawString(str,0,0); ImageIO.write(image, "JPEG", new File("c:\\test.jpg")); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう