• 締切済み

複数線を引くには?

最近プログラミングを習いだし、1つずつ色々独学で学んでいて、 本に載っている範囲で勉強しているます。 ここから下のプログラミングでは1つしか線を1つしか引けないのですが、これを何個も線を引くようにするにはどうすればいいか教えてください! mport java.awt.*; import java.awt.event.*; import javax.swing.*; public class Challnege13 extends JApplet { private static final long serialVersionUID = 1L; int Px=0,Py=0; // 直前の位置。 int Cx,Cy; // 現在の位置。 JPanel p; // initメソッドの定義。 public void init() { // アプレットからコンテンツペインを取得。 Container c = this.getContentPane(); // コンテンツペインのレイアウトマネージャをBorderLayoutに設定。 c.setLayout(new BorderLayout()); // パネルを定義(匿名クラス)。 p = new JPanel() { /** * */ private static final long serialVersionUID = 1L; public void paintComponent(Graphics g) { super.paintComponent(g); // 直線描画。 if( (Px == 0)&&(Py == 0) ) { Px = Cx; Py = Cy; } g.drawLine(Px,Py,Cx,Cy); // 直前の位置を更新。 Px = Cx; Py = Cy; } }; // コンテンツペインに追加。 c.add(p,BorderLayout.CENTER); // イベントリスナを定義(匿名クラス)。 MouseAdapter ma = new MouseAdapter() { // mouseClickedメソッドの定義。 public void mouseClicked(MouseEvent e) { Cx = e.getX(); // クリックした点のx座標を取得する。 Cy = e.getY(); // クリックした点のy座標を取得する。 p.repaint(); } }; // イベントリスナの登録。 this.addMouseListener(ma); } }

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

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

クリックした順につなぐだけでいいのでしたら ArrayListなどでクリックしたポイントを覚えておいて paintComponentでその順に描画すれば良いでしょう Challnege13 のメンバーに ArrayList<Point> myList = new ArrayList<Point>(); を追加 mouseClickedハンドラで Point pt = new Point( Cx, Cy ); myList.add( pt ); を追加 paintComponentのオーバーライドの中身を int nLen = myList.Size(); if ( nLen < 1 ) {   return; } Point[] pts = new Point[ nLen ]; myList.ToArray( pts ); for( int n = 1; n < nLen; n++ ) {   g.drawLine( pts[n-1].x, pts[n-1].y, pts[n].x, pts[n].y ); } といった具合でしょう

latd800
質問者

お礼

ありがとうございます! 今も邁進しておりますので、またわからないことがあったらよろしくお願いしますw

関連するQ&A

  •  型Containerのメソッドadd(String ,Compone

     型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。  今晩は、java初心者です、エラーの意味が理解出来ません、宜しくお願い致します。  《A》というプログラムと《B》というプログラムで、クラスを「class MyPanel extends JPanel」と「class JPanel」に変えただけで、「型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。」というエラーがでます。  一体何が原因でしょうか。  JPanelを継承したクラス(MyPanel)を呼び出すのか、そのまま、JPanelクラスを呼び出すのかの違いだけで、内容的には何も変わるところがないはずだと思うのですが。  意味が理解出来ません。 ======================================================================== 《A》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class MyPanel extends JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } ============================================================ 《B》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } =======================================================================

    • ベストアンサー
    • Java
  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ 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){} }

    • ベストアンサー
    • Java
  • サブウィンドウの動きを制御したい!

    親ウインドウのボタンをクリックすると、 サイズ400×300のサブウィンドウがモニタ画面の左上(0,0)にオープンするようにしました。 このサブウィンドウは、モニタ画面に現れると同時に、 まずは、ツツーッと下にすべってタテ位置のみモニタ画面中央に行き、 行き着いたところで今度は、右方向にツツーッと滑って、 最後にはモニタ画面のど真ん中に配置されるようにしたかったのです。 そこで、サブウィンドウ内には、以下のスクリプト(onload)を書きました。 <script language="javascript"> <!-- var disW= screen.availWidth; var disH= screen.availHeight; var cX=disW/2-200; var cY=disH/2-150; var pX=0; var pY=0; var timerID; function moveWin(){ if(pY < cY){ pY+=5; window.moveTo(0,pY); timerID=setTimeout("moveWin()",1); } if(pY==cY){ pX+=5; window.moveTo(pX,cY); timerID=setTimeout("moveWin()",1); } else{ clearTimeout(timerID); } } //--> </script> でも、うまくいきません。 ふたつめのifがいけないのでしょうが、 未熟なためどうしてなのかわかりません。 どなたか、教えてください! よろしくおねがいします。

  • 斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてくだ

    斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてください。 点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)に斜線に直角の線を描く方程式を教えてください。 Ax=5000:Ay=4000 Bx=25000:By=22000 A点からP点まで距離 L=20000として Px=19865.883:Py=17379.295 CD線の長さをL2=3000として Cx= Cy= Dx= Dy= を求めたいのですが

  • classを使って座標軸を求めるコード

    やさしいJavaからの問題です。 次のように、整数値の座標をあらわす MyPoint クラスを作成してください。 フィールド private int x; (X座標) private int y; (Y座標) メソッド public void setX(int px); (X座標を設定する) public void setY(int py); (Y座標を設定する) public int getX(); (X座標を得る) public int setY(); (Y座標を得る) という問題で、回答は以下の通りですが、 class MyPoint { int x; int y; void setX(int px) { x = px; } void setY(int py) { y = py; } int getX() { return x; } int getY() { return y; } } class Sample5 { public static void main(String[] args) { MyPoint p1; p1 = new MyPoint(); p1.setX(10); p1.setY(5); int px = p1.getX(); int py = p1.getY(); System.out.println("p1のX座標は" + px + "Y座標は" + py + "でした。"); } } 教科書の関連の章ではreturnが先に来ているのですが、突然この問題ではvoidから始まっているのですが、int getX()~return y;までとvoid setX~y = py;までの部分 の順番を変えてもいいですか?

    • ベストアンサー
    • Java
  • 画面を切り替えたい

    現在、ボタンを押すと 「てすと」(画像ファイル名はtest.jpg)→「てすと2」(画像ファイル名はtest2.jpg) と画面が切り替えられるプログラムを作成していますが、不明な点があり質問してみました。 2つの画面を作成してみましたが、この後どう合体すればいいのかよく分かりません。分かる方は是非教えて下さい。 <プログラムソース> (1) import java.awt.*; import java.awt.event.*; import javax.swing.*; class Title extends JFrame{ public Title() { add(new DrawPanel()); JPanel L = new DrawPanel(); L.setLayout(new BorderLayout()); JPanel L1 = new JPanel(); L1.setOpaque(false); L1.add(new JButton("OK")); L.add(L1, BorderLayout.SOUTH); setContentPane(L); } public static void main(String args[]){ JFrame frame = new Title(); frame.setSize(640, 480); frame.setTitle("てすと"); frame.setLocationRelativeTo(null); frame.setBackground(Color.pink); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);} } class DrawPanel extends JPanel{ String path = "test.jpg"; Image image; public DrawPanel() { ImageIcon icon = new ImageIcon(path); } public void paintComponent(Graphics args) { super.paintComponent(args); args.drawImage(image, 0, 0, this); args.setFont(new Font("TimesRoman",Font.ITALIC,100)); args.setColor(Color.red); args.drawString("てすと", 120, 230); } } (2) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Title2 extends JFrame { public Title2() { add(new DrawPanel()); JPanel L = new DrawPanel(); L.setLayout(new BorderLayout()); JPanel L1 = new JPanel(); L1.setOpaque(false); L1.add(new JButton("OK")); L.add(L1, BorderLayout.SOUTH); setContentPane(L); } public static void main(String args[]){ JFrame frame = new Title2(); frame.setSize(640, 480); frame.setTitle("てすと"); frame.setLocationRelativeTo(null); frame.setBackground(Color.white); frame.setVisible(true); } } class DrawPanel extends JPanel { String path = "test2.jpg"; Image image; public DrawPanel() { ImageIcon icon = new ImageIcon(path); image = icon.getImage(); } public void paintComponent(Graphics args) { super.paintComponent(args);  args.setFont(new Font("TimesRoman",Font.BOLD,40)); args.setColor(Color.blue); args.drawString("てすと2", 150, 390); } }

    • ベストアンサー
    • Java
  • javaで作成したゲーム→android用に変換

    お世話になっています。 前回こちらで、 1~25までの順番にタッチしていくというゲームのjavaのソースコードを教えて頂きました。 今回お聞きしたい内容が そのゲームに (1)秒単位のタイマーを付け、25個目の数字を押したらカウント終了 (2)androidアプリとして使用できるように変換 としようとしているのですが、いろいろと変換しなければいけないみたいで、 どちらもなかなかうまくいきません。 前回教えて頂いたコード import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private List<NumberdButton> numbers = new ArrayList<NumberdButton>(); private GridLayout grid = new GridLayout(5, 5); private boolean[] pressed = new boolean[5 * 5 + 1]; public MainFrame(String name) { super(name); setResizable(false); } public void setButtons(final Container pane) { initPressed(); initNumbers(); final JPanel p = new JPanel(grid); for (final NumberdButton b : numbers) { p.add(b); b.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (pressed[b.getNumber() - 1]) { b.setIcon(new ImageIcon("" + numbers + "_off.png")); b.setEnabled(false); pressed[b.getNumber()] = true; } } }); } pane.add(p, BorderLayout.CENTER); } private void initNumbers() { for (int i = 1; i < 26; i++) { numbers.add(new NumberdButton(i)); } Collections.shuffle(numbers); } private void initPressed() { for (int i = 0; i < pressed.length; i++) pressed[i] = false; pressed[0] = true; } public static void create(String name) { MainFrame frame = new MainFrame(name); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setButtons(frame.getContentPane()); frame.pack(); frame.setVisible(true); } } class NumberdButton extends JButton { private static final long serialVersionUID = 1L; private final int number; public NumberdButton(int number) { super(new ImageIcon("" + number + ".png")); this.number = number; } public int getNumber() { return number; } } public class pressbuttontoorder { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MainFrame.create("PressButtonToOrder"); } }); } } androidのレイアウトはTableLayoutとtableRowでボタンを配置すればいいのかなと思い 配置しました。 TableLayout <TableRow1 <Button1~5 <TableRow2 <Button6~10 という風に25個ボタンを配置しています。 行き詰まっております。 どなたかやり方やコード等、教えて頂けたらありがたいです。 ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • キャレットの幅を設定したい。

    キャレットの幅を設定したい。 以下のソースで色を設定するメソッドはありますが、 キャレットの幅の設定の仕方が解りませんでした。 ご存じの方がおられましたら教えてください。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; class test extends JFrame{ public static void main(String args[]){ new test(); } test(){ this.setSize(300, 250); JPanel p = new JPanel(); JTextArea area2 = new JTextArea("test", 10, 10); area2.setCaretColor(Color.RED); p.add(area2); this.add(p, BorderLayout.CENTER); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • リスナーを別クラスで書いた時のエラーの意味と原因?

       今晩は。  参考書を見ながら、リスナーを別クラスで書いてみました。  maクラスのコンストラクタを「public void ma」にすると「maのコンストラクタが未定義」 ですというエラーが出ます。  これはどのような意味でしょうか、よろしくお願いします。 ================================================================================= public class applet extends Applet { String s = "Hello" ; public void init() { addMouseListener(new ma(this)); } public void paint(Graphics g) { g.drawString( s , 60 , 60 ) ; } } class ma extends MouseAdapter { applet a ; public /*void*/ ma(applet ap) { a = ap ; } public void mouseClicked(MouseEvent e) { a.s = "JAVA" ; a.repaint() ; } }

    • ベストアンサー
    • Java
  • javaで2パネルにテーブルデーターを表示

    今日は! javaの初心者で、初心者なりに、フレームに2個のパネルを作成し、各パネルに同じ テーブルデーターを表示するコードを作ってみましたが、旨く行きません。 下記の添付コードで、不具合点の改造箇所をお教え頂けますと大変助かります。 //================================== package packageA; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("JTableTest2"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 300*2, 140*2); setTitle(name); String data[][] = { //テーブルデータを作る {"田辺太郎","89","79","100","100"}, {"山田大助","68","55","72","100"}, {"佐藤恵美","78","69","81","100"} }; //列名の配列 String title[] = {"名前","数学","英語","国語","音楽"}; JTable table = new JTable(data,title); //テーブルデータと列名でテーブルを作る JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 80)); p1.add(sp); //JPanelにJScrollPaneを結合する p2.add(sp); //JPanelにJScrollPaneを結合する getContentPane().add(p1, BorderLayout.WEST); getContentPane().add(p2, BorderLayout.EAST); } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java