1. 程式人生 > >Java畫不規則,及拖動直線

Java畫不規則,及拖動直線

上一個文章已經講了畫直線,三角形,多邊形,橢圓,矩形,還有加了兩個帶名字的顏色按鈕。 那麼這一個部落格我們主要來看看,如何畫不規則的圖形以及拖動滑鼠畫直線,還有當按鈕上沒有名字了,我們該怎麼去處理,另外還介紹如何做橡皮擦; 1.不規則的圖形 之前我們做的都是有關直線的,現在我們想做任意的曲線,這個時候我們需要新增一個滑鼠拖動監聽器,因為可以繼承多個介面,所以直接在一個類裡繼承。 同理,介面類的全部方法需要重寫,不然會報錯,我們發現MouseMotionListener類有兩個方法,拖動與移動,拖動是按下滑鼠挪動滑鼠,移動鬆開滑鼠挪動滑鼠。同理我們也可以直接get,x,y,的座標,是時時刻刻的反饋,所以,當我們畫不規則圖形的時候,可以把它想象成無線短的一個個線段的連線,所以我們需要儲存前一個線段的末座標。

  if ("不規則".equals(name)) {
   x4 = e.getX();
   y4 = e.getY();
   gr.drawLine(x1, y1, x4, y4);
   x1 = x4;
   y1 = y4;
  }

2.畫可拖動的直線 在這裡插入圖片描述

這是按照拖動軌跡不斷畫直線,但我們想要的只是一條最終釋放開的直線,中間的過程可視但不可出現在最後,所以,我們對程式碼進行了改進,畫一個白線覆蓋之前的黑線。 PS:大家寫東西的時候一定記得儲存,我…一言難盡

  if ("直線2".equals(name)) {
   gr.setColor(Color.WHITE);
   gr.drawLine(x1, y1, x4, y4);
   x4 = e.getX();
   y4 = e.getY();
   gr.setColor(color);
   gr.drawLine(x1, y1, x4, y4);
  }

畫板的其他直線有明顯的擦除效果,其實就是被白線覆蓋了。 在這裡插入圖片描述

3.做橡皮擦,上面作直線給我們很好的啟發,所以我們首先做一個橡皮擦的按鈕,然後根據拖動的特點,時時刻刻獲得座標,我們可以利用這一點畫一個矩形,將需要擦除的覆蓋掉。

  if("橡皮擦".equals(name))
  {
   gr.setColor(Color.WHITE);
   gr.drawRect(x4, y4, 8, 8);
   x4 = e.getX();
   y4 = e.getY();
   gr.setColor(color);
   gr.drawRect(x4, y4, 8, 8);
  }

這個程式碼還有一個瑕疵的地方就是,最後還會遺留下來一個矩形,所以我們需要在釋放的時候再次把這個矩形覆蓋掉。

  if("橡皮擦".equals(name))
  {
   x2 = e.getX();
   y2 = e.getY();
   gr.setColor(Color.WHITE);
   gr.drawRect(x2, y2, 8, 8);
  }

4.無名字的顏色按鈕 首先我們可以換一下畫板的背景顏色

jf.getContentPane().setBackground(Color.WHITE);

然後建立無顏色的按鈕

  javax.swing.JButton blackButton=new javax.swing.JButton();
  blackButton.setPreferredSize(new Dimension(40,30));
  jf.add(blackButton);
  blackButton.setBackground(Color.BLACK);
  javax.swing.JButton redButton=new javax.swing.JButton();
  redButton.setPreferredSize(new Dimension(40,30));
  jf.add(redButton);
  redButton.setBackground(Color.RED);

然後按鈕是無法傳到我們的監聽器的,所以,我們需要在監聽器裡找到事件發生源,強制轉換成按鈕型別,然後獲取事件源-按鈕的背景色,從而改變畫筆的顏色。 程式碼實在沾不上啦,下一個補上。