在展示代碼之前先寫一下我的思路吧,尤其是粘貼複製這塊,網上其他的博客都是右鍵彈出的菜單,或者是別的,千篇一律都是複製別人的 ,全都一個樣 。我的粘貼複製部分用的是中介者模式,相對比較清楚一點,不像網上其他的代碼零零散散,不容易理解,也不容易弄到自己的工程裏運行參考。
下面是我的思路,代碼在後面。
1. 創建JFrame名爲WindowOperation;
1.1使用JTextField類創建文本框inputNumberOne,inputNumberTwo;
使用JComboBox類創建下拉列表ChoiceFuhao;
使用JTextArea類創建文本區textShow;
使用JButton類創建按鈕button;
使用JMenuBar類創建菜單條menubar;
使用JMenu類創建菜單menu;
使用JMenuItem創建菜單項copyItem,cutItem,pasteItem,quitItem;
創建監視器OperatorListener對象operator;
創建監視器ComputerListener對象computer;
1.2 WindowOperation的構造方法,調用方法init(),並設置窗口可見,設置用戶關閉按鈕時程序的操作;
1.3創建void的方法init(),使用Layout佈局;對各個容器進行定義,使用中介者類ConcreteMediator中的方法實現複製,剪切,粘貼,退出,並使用setAccelerator(Krystroke.getKeyStroke()),來設置快捷鍵;
1.4使用add(),將各個組件進行添加;
2. 創建類OperatorListener,來註冊監視器operator,利用用戶下拉列表來觸發ItemEvent事件,ItemEvent事件的監視器operator()獲取運算符,並傳遞給ActionEvent事件的監視器computer;
3. 創建類Computer,註冊監視器computer,用戶通過單擊按鈕觸發ActionEvent事件,監視器computer()給出運算結果;
3.1定義方法setJTextFieldOne(),setJTextFieldTwo(),setJTextArea(),
setFuhao(),來設置文本框1,文本框2,文本域,符號;
3.2定義方法actionPerformed(),使用inputNumberOne.getText(),inputNumberOne.getText()來獲取文本框輸入的值,使用fuhao.equals()通過比較得到所輸入的符號,通過數學計算來得到結果result,最後將result顯示在textshow中;
3.3如果文本框爲空或符號沒有選擇則各自觸發異常,彈出警告;
4.創建中介者類ConcreteMediator();
4.1定義public void類型的方法openMenu(),定義String類型變量str,通過text.getSelectedText(),來獲得所選的內容,如果爲空則調用方法copyItem.setEnabled(flase),pasteItem.setEnabled(false),來禁用此選項,否則爲true;
4.2定義public void類型方法patse(),copy(),cut(),來實現粘貼複製剪切操作;
5.創建類Computer;
5.1創建main()方法;
5.2使用WindowOperation類來創建對象win;
通過win調用方法setBounds()設置JFrame的窗口大小;
調用方法setTitle()設置標題;
下面是我的代碼:
要參考的話直接建幾個class,粘貼複製我的代碼到相應的class即可,絕對完美運行。
Computer.java
package cn.hanfeng.computer;public class Computer {
public static void main(String args[]){
WindowOperation win=new WindowOperation();
win.setBounds(100,100,390,360);
win.setTitle("計算器");
}
}
WindowOperation.java
package cn.hanfeng.computer;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
public class WindowOperation extends JFrame {
JTextField inputNumberOne,inputNumberTwo;
JComboBox<String>choiceFuhao;
JTextArea textShow;
JButton button;
JMenuBar menubar;
JMenu menu;
JMenuItem copyItem,cutItem,pasteItem,quitItem;
OperatorListener operator;
ComputerListener computer;
private JTextField textField;
public WindowOperation(){
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
getContentPane().setLayout(new FlowLayout());
inputNumberOne =new JTextField(5);
inputNumberTwo =new JTextField(5);
choiceFuhao =new JComboBox<String>();
button = new JButton("計算");
choiceFuhao.addItem("選擇運算符號");
String []a={"+","-","*","/","%","冪運算","對數運算"};
for(int i=0; i<a.length;i++){
choiceFuhao.addItem(a[i]);
}
textShow =new JTextArea(9,30);
operator =new OperatorListener();
computer =new ComputerListener();
ConcreteMediator mediator=new ConcreteMediator();
menubar=new JMenuBar();
menu=new JMenu("編輯");
menu.addMenuListener(new MenuListener(){
public void menuSelected(MenuEvent e){mediator.openMenu();}
public void menuDeselected(MenuEvent e){}
public void menuCanceled(MenuEvent e){}
});
copyItem=new JMenuItem("複製");
copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
copyItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.copy();
}
});
cutItem=new JMenuItem("剪切");
cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
cutItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.cut();
}
});
pasteItem=new JMenuItem("粘貼");
pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
pasteItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.paste();
}
});
quitItem = new JMenuItem("退出");
quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
quitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
operator.setJComboBox(choiceFuhao);
operator.setWorkTogether(computer);
computer.setJTextFieldOne(inputNumberOne);
computer.setJTextFieldTwo(inputNumberTwo);
computer.setJTextArea(textShow);
choiceFuhao.addItemListener(operator);
button.addActionListener(computer);
menubar.add(menu);
menu.add(cutItem);
menu.add(copyItem);
menu.add(pasteItem);
menu.add(quitItem);
setJMenuBar(menubar);
add(textShow,BorderLayout.CENTER);
mediator.registerMenu(menu);
mediator.registerCopyItem(copyItem);
mediator.registerCutItem(cutItem);
mediator.registerPasteItem(pasteItem);
mediator.registerText(textShow);
getContentPane().add(inputNumberOne);
getContentPane().add(choiceFuhao);
getContentPane().add(inputNumberTwo);
getContentPane().add(button);
getContentPane().add(new JScrollPane(textShow));
JLabel biaoqian=new JLabel("韓鋒 ");
getContentPane().add(biaoqian);
}
}
OperatorListener.java
package cn.hanfeng.computer;
import java.awt.event.*;
import javax.swing.*;
public class OperatorListener implements ItemListener {
JComboBox <String>choice;
ComputerListener workTogether;
public void setJComboBox(JComboBox<String> box){
choice=box;
}
public void setWorkTogether(ComputerListener computer){
workTogether =computer;
}
public void itemStateChanged(ItemEvent e){
String fuhao =choice.getSelectedItem().toString();
workTogether.setFuhao(fuhao);
}
}
ComputerListener.java
package cn.hanfeng.computer;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class ComputerListener implements ActionListener {
JTextField inputNumberOne,inputNumberTwo;
JTextArea textShow;
String fuhao=" ";
public void setJTextFieldOne(JTextField t){
inputNumberOne =t;
}
public void setJTextFieldTwo(JTextField t){
inputNumberTwo =t;
}
public void setJTextArea(JTextArea area){
textShow =area;
}
public void setFuhao(String s){
fuhao=s;
}
static public double log(double value, double base) {
double a=0;
a=Math.log(value)/Math.log(base);
return a;
}
public void actionPerformed(ActionEvent e){
try{
double number1;
double number2;
double result=0;
number1=Double.parseDouble(inputNumberOne.getText());
number2=Double.parseDouble(inputNumberTwo.getText());
if(fuhao.equals("+")){
result=number1+number2;
}
else if(fuhao.equals("-")){
result=number1-number2;
}
else if(fuhao.equals("*")){
result=number1*number2;
}
else if(fuhao.equals("/")){
result=number1/number2;
}
else if(fuhao.equals("%")){
result=number1%number2;
}
else if(fuhao.equals("冪運算")){
result=Math.pow(number1, number2);
}
else if(fuhao.equals("對數運算")){
result=log(number1,number2);
}
if(fuhao.equals(" ")){
JOptionPane.showMessageDialog(null,"請輸入運算符號","警告對話框",JOptionPane.WARNING_MESSAGE);
}
else{
textShow.append(number1+" "+fuhao+" "+number2+"="+result+"\n");
}
}
catch(Exception exp){
JOptionPane.showMessageDialog(null,"請輸入數字","警告對話框",JOptionPane.WARNING_MESSAGE);
}
}
}
ConcreteMediator.java
package cn.hanfeng.computer;
import javax.swing.*;
import java.awt.datatransfer.*;
public class ConcreteMediator {
JMenu menu;
JMenuItem copyItem,cutItem,pasteItem;
JTextArea text;
public void openMenu(){
Clipboard clipboard =text.getToolkit().getSystemClipboard();
String str =text.getSelectedText();
if(str==null){
copyItem.setEnabled(false);
cutItem.setEnabled(false);
}
else{
copyItem.setEnabled(true);
cutItem.setEnabled(true);
}
boolean boo =clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor);
if(boo){
pasteItem.setEnabled(true);
}
}
public void paste(){
text.paste();
}
public void copy(){
text.copy();
}
public void cut(){
text.cut();
}
public void registerMenu(JMenu menu){
this.menu=menu;
}
public void registerPasteItem(JMenuItem item){
pasteItem=item;
}
public void registerCopyItem(JMenuItem item){
copyItem=item;
copyItem.setEnabled(false);
}
public void registerCutItem(JMenuItem item){
cutItem =item;
cutItem.setEnabled(false);
}
public void registerText(JTextArea text){
this.text=text;
}
}