2014-03-29 18 views
0

我正在嘗試編寫一個程序,用它們之間的連線連接兩個點。首先,我想說,我知道drawline()函數,但我不允許使用它(這是H.W賦值)。所以我的問題是,我設法編寫代碼來連接兩個點,但由於某種原因,每當我運行我的程序時,(0,0)像素始終處於打開狀態,並且在第一次鼠標單擊時,線條從(0,0)繪製到第一個點擊座標。有人可以幫我弄清楚如何在沒有(o,o)像素開啓的情況下運行應用程序。 另一件事,我想要做到它分開每一行(兩個點擊=行,另外兩個點擊=另一個單獨的行),這也是我正在努力實現的東西。如何繪製兩個點之間創建的點作爲鼠標點擊的結果

希望我的解釋夠好,任何幫助都會很棒! 這是我的代碼:

package com.mycompany; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class MousePanel extends JPanel implements MouseListener,ActionListener{ 

    private int x,y,x2,y2,a=1; 
    public MousePanel(){ 
     super(); 
     addMouseListener(this); 
    } 

    public void paint(Graphics g){ 
     int w = x2 - x ; 
     int h = y2 - y ; 
     int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ; 
     if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ; 
     if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ; 
     if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ; 
     int longest = Math.abs(w) ; 
     int shortest = Math.abs(h) ; 
     if (!(longest>shortest)) { 
      longest = Math.abs(h) ; 
      shortest = Math.abs(w) ; 
      if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ; 
      dx2 = 0 ;    
     } 
     int numerator = longest >> 1 ; 
     for (int i=0;i<=longest;i++) { 
      g.fillRect(x,y,1,1); 
      numerator += shortest ; 
      if (!(numerator<longest)) { 
       numerator -= longest ; 
       x += dx1 ; 
       y += dy1 ; 
      } else { 
       x += dx2 ; 
       y += dy2 ; 
      } 
     } 
    } 

    public void mouseClicked(MouseEvent mouse){  
      x=x2; 
      y=y2; 
      x2 = mouse.getX(); 
      y2 = mouse.getY(); 
      repaint(); 
     } 

    public void mouseEntered(MouseEvent mouse){ } 
    public void mouseExited(MouseEvent mouse){ } 
    public void mousePressed(MouseEvent mouse){ } 
    public void mouseReleased(MouseEvent mouse){ } 

    public static void main(String arg[]){ 
     JFrame frame = new JFrame("MousePanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(640,640); 

     MousePanel panel = new MousePanel(); 
     frame.setContentPane(panel); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

嗨,我不是100%確定我明白你的問題,但我想幫忙。 – Inversus

+1

像[答案](http://stackoverflow.com/a/5797965/230513)見過[這裏](http://stackoverflow.com/q/5797862/230513)? – trashgod

+0

不完全,生病試圖更好地解釋我的自我: 我的目標是建立程序來連接兩個點與一條線。 點座標應該是兩個單獨的鼠標點擊的結果。 第一次點擊會標記第一個點,第二個點擊會標記第二個點。 第二次點擊後,應該在這兩個點之間的屏幕上畫一條線,等等...... 一件重要的事情是我希望每一行都是獨特的,我的意思是第一和第二次點擊是一行,第三和第四 點擊是另一個單獨的行......希望這將解釋更好,謝謝! –

回答

0

嘗試使用計數器在你的代碼來檢查「的點擊數」。 第一次點擊表示初始點,第二次點擊表示結束點。 如果點擊%2!= 0然後根據該點設置您的初始座標,否則獲取第二個座標並畫線。 我想這足以讓你繼續。 它的分配,以便揣摩了:)

+0

我建議使用'點擊%2'來檢查'偶數'或'奇數'命中。即使命中意味着一條完整的線。 – TeamIncredibles

0

如果你的目的只是爲了畫一條線,那麼你可以簡單地使用的drawLine()方法,而不是測序矩形點成一條線。

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class MousePanel extends JPanel implements MouseListener,ActionListener{ 

    private int x,y,x2,y2,a=1; 
    private int count=0; 

    public MousePanel(){ 
     super(); 
     addMouseListener(this); 
    } 

    public void paint(Graphics g){ 

     if(count==2){ 
      g.drawLine(x, y, x2, y2); 

     count=0; 
     x=0; 
     y=0; 
     x2=0; 
     y2=0; 
     } 
    } 

    public void mouseClicked(MouseEvent mouse){ 

     count++; 

     if(count==1){ 
      x=mouse.getX(); 
      y=mouse.getY(); 
     } 

     if(count==2){ 
      x2 = mouse.getX(); 
      y2 = mouse.getY(); 
     } 

     repaint(); 
     } 

    public void mouseEntered(MouseEvent mouse){ } 
    public void mouseExited(MouseEvent mouse){ } 
    public void mousePressed(MouseEvent mouse){ } 
    public void mouseReleased(MouseEvent mouse){ } 

    public static void main(String arg[]){ 
     JFrame frame = new JFrame("MousePanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(640,640); 

     MousePanel panel = new MousePanel(); 
     frame.setContentPane(panel); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

但是,你的代碼也沒有錯。但是您需要添加計數器來存儲上面代碼中顯示的點值。

0

只需更換mouseClicked()方法即可。由於您已經定義了一個變量a,請使用它來計算按鈕點擊次數。

public void mouseClicked(MouseEvent mouse) { 
    if (a == 1) { 
     a = 0; 
     x = x2 = mouse.getX(); 
     y = y2 = mouse.getY(); 
    } else { 
     a = 1; 
     x = x2; 
     y = y2; 
     x2 = mouse.getX(); 
     y2 = mouse.getY(); 
     repaint(); 
    } 
}