swing寫的記事本
package com.guozhiqiang; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; public class NotePad extends JFrame{ private JMenu editeMenu; private JMenuItem menuOpen; private JMenuItem menuSave; private JMenuItem menuSaveAs; private JMenuItem menuClose; private JMenuItem menuCut; private JMenuItem menuCopy; private JMenuItem menuPaste; private JMenuItem menuAbout; private JTextArea textArea; private JPopupMenu popUpMenu; private JLabel stateBar; private JFileChooser fileChooser = new JFileChooser(); public NotePad(){ super("新建文本文件"); setUIComponent(); setEventListen(); setVisible(true); } public void setEventListen(){ //關閉監聽 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ closeFile(); } }); menuOpen.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ openFile(); } }); menuSave.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ saveFile(); } } ); menuSaveAs.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ saveFileAs(); } }); menuClose.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ closeFile(); } }); menuCut.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ cut(); } }); menuCopy.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ copy(); } }); menuPaste.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ paste(); } }); textArea.addKeyListener(new KeyAdapter(){ public void keyTyped(KeyEvent e){ processTextArea(); } }); textArea.addMouseListener(new MouseAdapter(){ public void mouseReleased(MouseEvent e){ if(e.getButton()==MouseEvent.BUTTON3){ popUpMenu.show(editeMenu,e.getX(),e.getY()); } } public void mouseClicked(MouseEvent e){ if(e.getButton()==MouseEvent.BUTTON1){ popUpMenu.setVisible(false); } } }); } public void setUIComponent(){ setSize(640,480); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); menuOpen = new JMenuItem("打開"); menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_0,InputEvent.CTRL_MASK)); menuSave = new JMenuItem("保存"); menuSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); menuSaveAs = new JMenuItem("另保存"); menuClose = new JMenuItem("關閉"); menuClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,InputEvent.CTRL_MASK)); fileMenu.add(menuOpen); fileMenu.addSeparator(); fileMenu.add(menuSave); fileMenu.add(menuSaveAs); fileMenu.addSeparator(); fileMenu.add(menuClose); editeMenu = new JMenu("編輯"); menuCut = new JMenuItem("剪切"); menuCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK)); menuCopy = new JMenuItem("複製"); menuCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK)); menuPaste = new JMenuItem("粘貼"); menuPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK)); editeMenu.add(menuCut); editeMenu.add(menuCopy); editeMenu.add(menuPaste); JMenu aboutMenu = new JMenu("關於"); menuAbout = new JMenuItem("關於JNotePad"); aboutMenu.add(menuAbout); menuBar.add(fileMenu); menuBar.add(editeMenu); menuBar.add(aboutMenu); setJMenuBar(menuBar); /*****************************************/ textArea= new JTextArea(); textArea.setFont(new Font(" 宋體",Font.PLAIN,16)); ///??? textArea.setLineWrap(true); JScrollPane panel = new JScrollPane(textArea,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); Container contentPane = getContentPane(); contentPane.add(panel,BorderLayout.CENTER); stateBar = new JLabel("未修改"); stateBar.setHorizontalAlignment(SwingConstants.LEFT); stateBar.setBorder(BorderFactory.createEtchedBorder()); contentPane.add(stateBar,BorderLayout.SOUTH); popUpMenu = editeMenu.getPopupMenu(); } private void openFile(){ if(isCurrentFiledSaved()){ open(); }else{ int option = JOptionPane.showConfirmDialog(null,"文件已修改,是否保存","保存文件?",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,null); switch(option){ case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: open(); break; } } } private void open(){ int option =fileChooser.showDialog(null,null); if(option == JFileChooser.APPROVE_OPTION){ try { BufferedReader buf = new BufferedReader(new FileReader(fileChooser.getSelectedFile())); setTitle(fileChooser.getSelectedFile().toString()); textArea.setText(""); stateBar.setText("未修改"); String lineSeparator = System.getProperty("LINE.separator"); String text ; while((text=buf.readLine())!= null){ textArea.append(text); textArea.append(lineSeparator); } buf.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private boolean isCurrentFiledSaved(){ if(stateBar.getText().equals("未修改")){ return false; }else{ return true; } } private void saveFile(){ File file = new File(getTitle()); if(!file.exists()){ saveFileAs(); }else{ try { BufferedWriter buf = new BufferedWriter(new FileWriter(file)); buf.write(textArea.getText()); buf.close(); stateBar.setText("未修改"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void saveFileAs(){ int option = fileChooser.showDialog(null,null); if(option == JFileChooser.APPROVE_OPTION){ File file = fileChooser.getSelectedFile(); setTitle(file.toString()); try { file.createNewFile(); saveFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void closeFile(){ if(isCurrentFiledSaved()){ dispose(); }else{ int option = JOptionPane.showConfirmDialog(null,"文件已經修改是否保存?","保存文件",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE,null); switch(option){ case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: dispose(); } } } private void cut(){ textArea.cut(); stateBar.setText("已修改"); popUpMenu.setVisible(false); } private void copy(){ textArea.copy(); popUpMenu.setVisible(false); } private void paste(){ textArea.paste(); stateBar.setText("已修改"); popUpMenu.setVisible(false); } private void processTextArea(){ stateBar.setText("已修改"); } public static void main(String[] str){ new NotePad(); } }
本篇參考: https://help.salesforce.com/s/articleView?id=sf.customize_functions_begins.htm&type=5 https://help.salesforce.com/
開源BSD有三大系列:freebsd、openbsd、netbsd。其實Mac OS X也是BSD系列,只不過是商業。 1.FreeBSD FreeBSD是從386BSD的基礎上 發展起來的,而386BSD是由伯克利的計算機科學家Bill
現象 dubbo服務的默認端口是20880,按照網上教程想查看dubbo服務,報錯 telnet 127.0.0.1 20880 dubbo>lsDubbo Telnet Unsupported command: ls 原因 Pleas
前置條件 安裝docker與dapr: 手把手教你學Dapr - 3. 使用Dapr運行第一個.Net程序 安裝k8s dapr 自託管模式運行 新建一個webapi無權限項目 launchSettings.json中applica
基礎知識 ● 計算機運行過程中,遇到突發事件,要求 CPU 暫時停止正在運行的程序,轉去爲突發事件服務,服務完畢,再自動返回原程序繼續執行,這個過程稱爲__(1),其處理過程中保存現場的目的是(2)__。 (1)A.阻塞 B.中斷 C.動態
基礎知識 ● 下列屬於 CPU 中算術邏輯單元的部件是(1)。 (1)A、程序計數器 B、加法器 C、指令寄存器 D、指令譯碼器 參考答案:(1)B ● 在 CPU 和主存之間設置
基礎知識 ● 計算機執行程序時,CPU中(1)的內容是一條指令的地址。 (1)A、運算器 B、控制器 C、程序計數器 D、通用寄存器 參考答案:(1)C ● DMA控制方式是在(2)之間直接建立數據通路進行數據的交換處理。 (2)A、CPU
Flink雙流Join分爲window join、internal join、connect、維表廣播等方法,其中window join又分爲Tumbling Window Join、Sliding Window Join、Sessi
前言 今天我們來講講如何使用.NET開源(MIT License)的輕量、靈活、高性能、跨平臺的分佈式網絡爬蟲框架DotnetSpider來快速實現網頁數據抓取功能。 注意:爲了自身安全請在國家法律允許範圍內開發網頁爬蟲功能。 網頁數據
很早之前我們就聊過ToolFormer,Gorilla這類API調用的Agent範式,這一章我們針對真實世界中工具調用的以下幾個問題,介紹微調(ToolLLM)和prompt(AnyTool)兩種方案。 真實世界的API數量龐大且多樣:之
一. 二. 三. ! 作 者 : Yaopengfei(姚鵬飛) 博客地址 : http://www.cnblogs.com
前言 市面上關於認證授權的框架已經比較豐富了,大都是關於單體應用的認證授權,在分佈式架構下,使用比較多的方案是--<應用網關>,網關裏集中認證,將認證通過的請求再轉發給代理的服務,這種中心化的方式並不適用於微服務,這裏討論另一種方案--<認
import json with open ('ocr結構化輸出/10000.json') as f: #調用的高精度騰旭ocr tmp=f.read() tengxunjieguo=json.loads(tmp) 別使用js
這樣做的目的是避免循環引用,編寫多餘的類型文件 //global.d.ts import type { A } from "./a"; import type { B } from "./b"; declare global {
在數據庫設計中,處理一對多關係時,是否使用逗號分隔的ID列表(也稱爲“序列化”或“規範化不足”的方法)或創建一個新的關聯表來存儲這些ID,是一個常見的決策點。 以下是兩種方法的比較和考慮因素: 1. 使用逗號分隔的ID列表 優點: 簡單易