話說現在大家流行用 Ajax 做網頁,什麼東西都可以在線上直接進行編輯,不用儲存到硬碟上。如:Word、Excel 就可以使用 Google Docs 進行編輯。
而 Fauxto 就是一個能讓你在線上作畫的網站。
註冊成功之後,點選「Launch Fauxto」便可以開始享受在線上作畫的樂趣了。
軟體開發、伺服器和生活瑣事
話說現在大家流行用 Ajax 做網頁,什麼東西都可以在線上直接進行編輯,不用儲存到硬碟上。如:Word、Excel 就可以使用 Google Docs 進行編輯。
而 Fauxto 就是一個能讓你在線上作畫的網站。
註冊成功之後,點選「Launch Fauxto」便可以開始享受在線上作畫的樂趣了。
這是從 Aleiku 的部落格上面看到的,主要是讓 Flash 去捕捉你 Webcam 所收到的視訊,並且產生不同的反應。
不錯吧?如果你的電腦已經有安裝 Webcam 了,趕快去原作的網站上面玩玩看吧!
http://www.wretch.cc/blog/aleiku&article_id=9841475
沒錯,真的有用!但是這並不是一個很好解決之道。
我們先把問題拉回原點。硬碟是由磁盤和磁頭組成,在一個無塵的的環境中組合並封裝在一個密閉的容器中。硬碟的磁頭原本是貼在磁盤面上,運轉時因為轉速達到每分鐘 7200 轉,使的磁盤周圍的空氣一起流動,而讓磁頭能夠懸浮在氣流上,不與磁盤接觸。
當有壞軌表示硬碟運轉中不小心遭到碰撞,讓磁盤面上的磁感應物刮傷。前面說過硬碟內是一個密閉的空間,所以這些被刮下來的磁感應物當然不會憑空消失,會變成灰塵一樣。
想想看當灰塵在每分鐘 7200 轉的速度下碰到原本完好無缺的磁盤會發生什麼事?就像一隻麻雀不小心撞進空中的飛機引擎一樣。這些灰塵會造成磁盤上其他的磁感應物脫落,讓硬碟內部有更多灰塵;更多的灰塵代表會有更多的磁感應物會被刮下來。這樣的結果只會讓硬碟損壞更嚴重而已。
這裡不是在批評 PC3000 不好,而是想說 PC3000 可以拿來應急,但是你若想保住你硬碟中的資料不會流失,還是盡快去買一個新的硬碟吧!
目前看到比較簡單的方法是用 KMPlayer 擷取功能擷取背景音樂,另外聽說 GoldWave 也可以開啟 rmvb 檔的音軌部分。
安裝好以後用 KMPlayer 開啟你要擷取音樂的影片,先移動到要開始擷取的時間點按暫停,在畫面任一處點選滑鼠右鍵 -> 擷取 -> 擷取音訊。
跳出子視窗以後,建議把子視窗拉到與 KMPlayer 主視窗不重疊的地方,不然到時候不要怪我操作很麻煩。
從子視窗設定輸出位置和檔案類型後,再把「播放時自動擷取」選項打勾,最後按下「開始」就會開始擷取音樂了。結束直接點選「停止」就可以了。
通常一個視窗中會有多個不同的按鈕,點下按鈕後,按鈕會分別有不同的動作。
假設我們寫了一個 JTextArea 讓使用者輸入資料,當按下「Add Line」按鈕時會自動換行,按下「Exit」按鈕時會結束程式。
程式碼:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class panel0 {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();
public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}
public void go(){
panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );
text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
b1.addActionListener(this);
b2.addActionListener(this);
text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);
frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}
}
public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}
但是這樣寫一點會使的整個程式架構混亂,尤其是按鈕需要值型的動作很複雜時,以後要維護程式碼會變的很麻煩,因此要換一個方式來做。
Java 中有個東西叫做 inner class,也就是 class 中的 class。 Inner class 可以存取 outer class 中的變數和函式,但是要注意的是 inner class 是當 outer class 被建立時才會跟著一起被建立,不會單獨存在。
這時要為每個 JButton 建議一個 inner class:
class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}
建立好 inner class 之後,要讓 JButton 的 ActionListener 會去呼叫寫好的函式:
b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());
改好之後,整個程式會變成這樣:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class panel0 {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();
public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}
public void go(){
panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );
text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());
text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);
frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}
}