import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.fife.ui.rtextarea.*;
import org.fife.ui.rsyntaxtextarea.*;
import java.io.*;
@SuppressWarnings("serial")
public class Document extends JFrame implements ActionListener, DocumentListener {
private void newFile() {
if (changed)
saveFile();
file = null;
textArea.setText("");
changed = false;
setTitle("Editor");
}
private String readFile(File file) {
StringBuilder result = new StringBuilder();
try (FileReader fr = new FileReader(file); BufferedReader reader = new BufferedReader(fr);) {
String line;
while ((line = reader.readLine()) != null) {
result.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "Cannot read file !", "Error !", JOptionPane.ERROR_MESSAGE);
}
return result.toString();
}
private void saveAs(String dialogTitle) {
JFileChooser dialog = new JFileChooser(System.getProperty("Document.this"));
dialog.setDialogTitle(dialogTitle);
int result = dialog.showSaveDialog(this);
if (result != JFileChooser.APPROVE_OPTION)
return;
file = dialog.getSelectedFile();
try (PrintWriter writer = new PrintWriter(file);) {
writer.write(textArea.getText());
changed = false;
setTitle("Editor - " + file.getName());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void saveFile() {
if (changed) {
int ans = JOptionPane.showConfirmDialog(null, "The file has changed. You want to save it?", "Save file",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (ans == JOptionPane.NO_OPTION)
return;
}
if (file == null) {
saveAs("Save");
return;
}
String text = textArea.getText();
System.out.println(text);
try (PrintWriter writer = new PrintWriter(file);) {
if (!file.canWrite())
throw new Exception("Cannot write file!");
writer.write(text);
changed = false;
} catch (Exception e) {
e.printStackTrace();
}
}
private void loadFile() {
JFileChooser dialog = new JFileChooser(System.getProperty("Document.this"));
dialog.setMultiSelectionEnabled(false);
try {
int result = dialog.showOpenDialog(this);
if (result == JFileChooser.CANCEL_OPTION)
return;
if (result == JFileChooser.APPROVE_OPTION) {
if (changed)
saveFile();
file = dialog.getSelectedFile();
textArea.setText(readFile(file));
changed = false;
setTitle("Editor - " + file.getName());
}
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
}
}
private File file;
public boolean changed = false;
private boolean toolBarEnable = true;
RSyntaxTextArea textArea = new RSyntaxTextArea(20, 60);
JFrame frame = new JFrame("Input Dialog Box Frame");
JButton button = new JButton("Show Input Dialog Box");
JFileChooser fc = new JFileChooser();
private JTextArea ta;
private int count;
private JMenuBar menuBar;
private String pad;
private JToolBar toolBar;
private JMenu file_1;
private JMenuItem n;
private JMenuItem open;
private JMenuItem save;
private JMenuItem saveas;
private JMenuItem 退出;
private JMenu edit;
private JMenuItem cut;
private JMenuItem copy;
private JMenuItem paste;
private JMenuItem find;
private JMenuItem sall;
private JMenu format;
private JMenuItem font;
private JMenu view;
private JMenuItem showstatus;
private JMenu help;
private JMenuItem about;
private JTextField status;
public Document() {
super("Text Editor");
setSize(600, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea.getDocument().addDocumentListener(this);
Container pane = getContentPane();
pane.setLayout(new BorderLayout());
textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
textArea.setCodeFoldingEnabled(true);
textArea.addCaretListener(new CaretListener() {
// Each time the caret is moved, it will trigger the listener and its method
// caretUpdate.
// It will then pass the event to the update method including the source of the
// event (which is our textarea control)
public void caretUpdate(CaretEvent e) {
JTextArea editArea = (JTextArea) e.getSource();
// Lets start with some default values for the line and column.
int linenum = 1;
int columnnum = 1;
// We create a try catch to catch any exceptions. We will simply ignore such an
// error for our demonstration.
try {
// First we find the position of the caret. This is the number of where the
// caret is in relation to the start of the JTextArea
// in the upper left corner. We use this position to find offset values (eg what
// line we are on for the given position as well as
// what position that line starts on.
int caretpos = editArea.getCaretPosition();
linenum = editArea.getLineOfOffset(caretpos);
// We subtract the offset of where our line starts from the overall caret
// position.
// So lets say that we are on line 5 and that line starts at caret position 100,
// if our caret position is currently 106
// we know that we must be on column 6 of line 5.
columnnum = caretpos - editArea.getLineStartOffset(linenum);
// We have to add one here because line numbers start at 0 for getLineOfOffset
// and we want it to start at 1 for display.
linenum += 1;
columnnum += 1;
} catch (Exception ex) {
}
// Once we know the position of the line and the column, pass it to a helper
// function for updating the status bar.
updateStatus(linenum, columnnum);
}
});
RTextScrollPane sp = new RTextScrollPane(textArea);
pane.add(sp);
count = 0;
pad = " ";
ta = new JTextArea(); // textarea
menuBar = new JMenuBar();
toolBar = new JToolBar();
toolBar.setFloatable(false);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
setJMenuBar(menuBar);
file_1 = new JMenu("文件");
file_1.setMnemonic('F');
menuBar.add(file_1);
n = new JMenuItem("新建");
n.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newFile();
}
});
n.setMnemonic('N');
file_1.add(n);
open = new JMenuItem("打开");
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loadFile();
}
});
open.setMnemonic('O');
file_1.add(open);
save = new JMenuItem("保存");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFile();
}
});
save.setMnemonic('S');
file_1.add(save);
saveas = new JMenuItem("另存为...");
saveas.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveAs("另存为...");
}
});
file_1.add(saveas);
退出 = new JMenuItem("退出");
退出.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (changed)
saveFile();
System.exit(0);
}
});
退出.setMnemonic('Q');
file_1.add(退出);
edit = new JMenu("编辑");
edit.setMnemonic('E');
menuBar.add(edit);
cut = new JMenuItem("剪切");
cut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.cut();
}
});
cut.setMnemonic('T');
edit.add(cut);
copy = new JMenuItem("复制");
copy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.copy();
}
});
copy.setMnemonic('C');
edit.add(copy);
paste = new JMenuItem("粘贴");
paste.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.paste();
}
});
paste.setMnemonic('P');
edit.add(paste);
find = new JMenuItem("查找");
find.addActionListener(this);
find.setMnemonic('F');
edit.add(find);
sall = new JMenuItem("选择全部");
sall.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.selectAll();
}
});
sall.setMnemonic('A');
edit.add(sall);
format = new JMenu("格式");
menuBar.add(format);
font = new JMenuItem("字体");
font.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFontDialog fontDialog = new JFontDialog();
fontDialog.setVisible(true);
Font selectedFont = fontDialog.getFont();
System.out.println(selectedFont.toString());
textArea.setFont(selectedFont);
}
});
format.add(font);
view = new JMenu("查看");
menuBar.add(view);
showstatus = new JMenuItem("状态栏");
showstatus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (toolBarEnable == true) {
toolBar.setVisible(false);
toolBarEnable = false;
} else {
toolBar.setVisible(true);
toolBarEnable = true;
}
}
});
view.add(showstatus);
help = new JMenu("帮助");
menuBar.add(help);
about = new JMenuItem("关于");
about.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Text Editor in Java. \n\n 2021", "Text Editor", 1);
}
});
help.add(about);
pane.add(toolBar, BorderLayout.SOUTH);
status = new JTextField();
status.setText("行: 1 列: 1");
toolBar.add(status);
setVisible(true);
}
void writetofile(File ff) throws Exception {
FileWriter fw = new FileWriter(ff.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(textArea.getText());
bw.close();
}
private static void printLines(String name, InputStream ins) throws Exception {
String line = null;
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
while ((line = in.readLine()) != null) {
System.out.println(name + " " + line);
}
}
private static void runProcess(String command) throws Exception {
Process pro = Runtime.getRuntime().exec(command);
printLines(command + "\n============================================================\nOUTPUT:\n\n\n\n",
pro.getInputStream());
printLines(command + " stderr:", pro.getErrorStream());
pro.waitFor();
}
// public void actionPerformed(ActionEvent e) {
// JMenuItem choice = (JMenuItem) e.getSource();
//
// }
public static void main(String[] args) {
new Document();
}
@Override
public void insertUpdate(DocumentEvent e) {
changed = true;
}
@Override
public void removeUpdate(DocumentEvent e) {
changed = true;
}
@Override
public void changedUpdate(DocumentEvent e) {
changed = true;
}
@Override
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
if (action.equals("查找")) {
FindDialogDoc find = new FindDialogDoc(this, true);
find.showDialog();
}
}
// This helper function updates the status bar with the line number and column
// number.
private void updateStatus(int linenumber, int columnnumber) {
status.setText("行: " + linenumber + " 列: " + columnnumber);
}
}
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class FindDialogDoc extends JDialog implements ActionListener, KeyListener {
Document parent;
JLabel label;
JTextField textField;
JCheckBox caseSensitive;
JButton find, close;
boolean finishedFinding = true;
Matcher matcher;
public FindDialogDoc(Document parent, boolean modal) {
super(parent, modal);
this.parent = parent;
getContentPane().addKeyListener(this);
getContentPane().setFocusable(true);
initComponents();
setTitle("查找");
setLocationRelativeTo(parent);
pack();
}
public void showDialog() {
setVisible(true);
}
private void initComponents() {
getContentPane().setLayout(new GridLayout(3, 1));
JPanel panel1 = new JPanel();
label = new JLabel("查找:");
label.setDisplayedMnemonic('F');
panel1.add(label);
textField = new JTextField(15);
panel1.add(textField);
label.setLabelFor(textField);
getContentPane().add(panel1);
JPanel panel2 = new JPanel();
caseSensitive = new JCheckBox("大小写敏感");
panel2.add(caseSensitive);
getContentPane().add(panel2);
JPanel panel3 = new JPanel();
find = new JButton("查找");
close = new JButton("关闭");
find.addActionListener(this);
close.addActionListener(this);
panel3.add(find);
panel3.add(close);
getContentPane().add(panel3);
textField.addKeyListener(this);
find.addKeyListener(this);
close.addKeyListener(this);
caseSensitive.addKeyListener(this);
}
private void find(String pattern) {
if (!finishedFinding) {
if (matcher.find()) {
int selectionStart = matcher.start();
int selectionEnd = matcher.end();
parent.textArea.moveCaretPosition(matcher.start());
parent.textArea.select(selectionStart, selectionEnd);
} else {
finishedFinding = true;
JOptionPane.showMessageDialog(this, "已到达文件末尾", "文件末尾", JOptionPane.INFORMATION_MESSAGE);
// closeDialog();
}
} else {
matcher = Pattern.compile(pattern).matcher(parent.textArea.getText());
finishedFinding = false;
find(pattern);
}
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("查找")) {
String input = textField.getText();
StringBuilder pattern = new StringBuilder();
if (!caseSensitive.isSelected()) {
pattern.append("(?i)");
}
pattern.append(input);
find(pattern.toString());
} else if (cmd.equals("关闭")) {
closeDialog();
}
}
private void closeDialog() {
setVisible(false);
dispose();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
// System.out.println(e.getKeyCode());
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
closeDialog();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
*
* @author PANKAJ
*/
public class JFontDialog extends JDialog {
private static final long serialVersionUID = -6437493905392469749L;
private Font font;
private Font[] fonts;
private JButton okButton;
private JButton cancelButton;
private JLabel previewLabel;
private JList familyList;
private JTextField familyTextField;
private JList styleList;
private JTextField styleTextField;
private JList sizeList;
private JTextField sizeTextField;
public JFontDialog() {
this(new Font("Arial", 0, 12));
}
public JFontDialog(Font font) {
this("Font dialog", font);
}
public JFontDialog(String title, Font font) {
super.setTitle(title);
this.font = font;
this.init();
}
public void setFont(Font font) {
this.font = font;
}
public Font getFont() {
return this.font;
}
private void init() {
this.fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
this.setLayout(new FlowLayout());
this.setMinimumSize(new Dimension(400 + 80, 350));
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setModal(true);
this.setLocationByPlatform(true);
this.add(this.getFamilyPanel());
this.add(this.getStylePanel());
this.add(this.getSizePanel());
this.add(this.getPreviewPanel());
this.add(this.getButtonPanel());
this.eventHandling();
}
private JPanel getFamilyPanel() {
JPanel familyPanel = new JPanel();
familyPanel.setPreferredSize(new Dimension(200 + 10, 200 + 10));
familyPanel.setBorder(new TitledBorder("Font:"));
familyPanel.setLayout(new FlowLayout());
familyPanel.add(this.getFamilyTextBox());
familyPanel.add(this.getFamilyScrooledList());
return familyPanel;
}
private JTextField getFamilyTextBox() {
familyTextField = new JTextField();
familyTextField.setPreferredSize(new Dimension(200, 20));
familyTextField.setText(this.getFont().getFamily());
familyTextField.setEditable(false);
return familyTextField;
}
private JScrollPane getFamilyScrooledList() {
familyList = new JList(this.getFamily());
JScrollPane fontPane = new JScrollPane();
fontPane.setViewportView(familyList);
fontPane.setPreferredSize(new Dimension(200, 152));
familyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
familyList.setSelectedValue(this.getFont().getFamily(), true);
return fontPane;
}
private JPanel getStylePanel() {
JPanel stylePanel = new JPanel();
stylePanel.setPreferredSize(new Dimension(150 + 10, 200 + 10));
stylePanel.setBorder(new TitledBorder("Style:"));
stylePanel.setLayout(new FlowLayout());
stylePanel.add(this.getStyleTextBox());
stylePanel.add(this.getStyleScrooledList());
return stylePanel;
}
private JTextField getStyleTextBox() {
styleTextField = new JTextField();
styleTextField.setPreferredSize(new Dimension(150, 20));
String style = this.calculateStyle(this.getFont(), this.getFont().getFamily());
if (style.equals("")) {
style = "Plain";
}
styleTextField.setText(style);
styleTextField.setEditable(false);
return styleTextField;
}
private JScrollPane getStyleScrooledList() {
styleList = new JList(this.getFontStyles(this.getFont().getFamily()));
JScrollPane stylePane = new JScrollPane();
stylePane.setViewportView(styleList);
stylePane.setPreferredSize(new Dimension(150, 152));
styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
String style = this.calculateStyle(this.getFont(), this.getFont().getFamily());
if (style.equals("")) {
style = "Plain";
}
styleList.setSelectedValue(style, true);
return stylePane;
}
private JPanel getSizePanel() {
JPanel sizePanel = new JPanel();
sizePanel.setPreferredSize(new Dimension(50 + 10, 200 + 10));
sizePanel.setBorder(new TitledBorder("Size:"));
sizePanel.setLayout(new FlowLayout());
sizePanel.add(this.getSizeTextBox());
sizePanel.add(this.getSizeScrooledList());
return sizePanel;
}
private JTextField getSizeTextBox() {
sizeTextField = new JTextField();
sizeTextField.setPreferredSize(new Dimension(50, 20));
Integer size = new Integer(this.getFont().getSize());
sizeTextField.setText(size.toString());
return sizeTextField;
}
private JScrollPane getSizeScrooledList() {
sizeList = new JList(this.getFontSize());
JScrollPane sizePane = new JScrollPane();
sizePane.setViewportView(sizeList);
sizePane.setPreferredSize(new Dimension(50, 152));
sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
sizeList.setSelectedValue(new Integer(this.getFont().getSize()), true);
return sizePane;
}
private JPanel getPreviewPanel() {
JPanel previewPanel = new JPanel();
previewPanel.setBorder(new TitledBorder("Preview"));
previewPanel.setPreferredSize(new Dimension(355, 90));
previewPanel.setLayout(new FlowLayout());
previewPanel.add(this.getPreviewLabel());
return previewPanel;
}
private JLabel getPreviewLabel() {
previewLabel = new JLabel("ABC abc 123");
previewLabel.setPreferredSize(new Dimension(350, 80));
previewLabel.setHorizontalAlignment(JLabel.CENTER);
previewLabel.setFont(this.getFont());
return previewLabel;
}
private JPanel getButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel.setPreferredSize(new Dimension(80, 60));
buttonPanel.setLayout(new FlowLayout());
((FlowLayout) buttonPanel.getLayout()).setVgap(5);
buttonPanel.add(this.getOKButton());
buttonPanel.add(this.getCancelButton());
return buttonPanel;
}
private JButton getOKButton() {
okButton = new JButton("OK");
okButton.setPreferredSize(new Dimension(80, 25));
return okButton;
}
private JButton getCancelButton() {
cancelButton = new JButton("Cancel");
cancelButton.setPreferredSize(new Dimension(80, 25));
return cancelButton;
}
private String[] getFontStyles(String fontFamily) {
List fontStyles = new ArrayList();
for (int i = 0; i < fonts.length; i++) {
Font f = fonts[i];
if (f.getFamily().equals(fontFamily)) {
if (f.getFontName().length() == fontFamily.length()) {
fontStyles.add("Plain");
continue;
}
fontStyles.add(this.calculateStyle(f, fontFamily));
}
}
String[] str = new String[fontStyles.size()];
for (int i = 0; i < str.length; i++) {
str[i] = fontStyles.get(i).toString();
}
return str;
}
private String[] getFamily() {
Set stylesSet = new TreeSet();
for (int i = 0; i < this.fonts.length; i++) {
stylesSet.add(this.fonts[i].getFamily());
}
Object[] obj = stylesSet.toArray();
String[] str = new String[obj.length];
for (int i = 0; i < str.length; i++) {
str[i] = obj[i].toString();
}
return str;
}
private String calculateStyle(Font font, String fontFamily) {
StringBuffer style = new StringBuffer(font.getFontName().replace(fontFamily, ""));
if (style.toString().startsWith(" ")) {
style.replace(0, 1, "");
}
return style.toString();
}
private Integer[] getFontSize() {
Integer[] fs = new Integer[25];
int n = 6;
for (int i = 0; i < fs.length; i++) {
n = n + 2;
fs[i] = new Integer(n);
}
return fs;
}
private void updateFont() {
String family = this.familyTextField.getText();
String style = this.styleTextField.getText();
Integer size = Integer.valueOf(this.sizeTextField.getText());
if (!style.equals("Plain") && !style.contains(".")) {
family = family + " " + style;
} else if (!style.equals("Plain") && style.contains(".")) {
family = family + "." + style;
}
this.font = new Font(family, 0, size.intValue());
this.previewLabel.setFont(this.font);
}
private void eventHandling() {
this.familyList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String selectedFamily = familyList.getSelectedValue().toString();
familyTextField.setText(selectedFamily);
styleList.setListData(getFontStyles(selectedFamily));
styleList.setSelectedIndex(0);
}
});
this.styleList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String selectedStyle = styleList.getSelectedValue().toString();
styleTextField.setText(selectedStyle);
updateFont();
}
});
this.sizeList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
Integer selectedSize = new Integer(sizeList.getSelectedValue().toString());
sizeTextField.setText(selectedSize.toString());
updateFont();
}
});
this.sizeTextField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
if (evt.getKeyChar() < '0' || evt.getKeyChar() > '9') {
evt.consume();
}
}
public void keyReleased(KeyEvent evt) {
String value = sizeTextField.getText();
evt.consume();
if (value.equals("") || value.equals("0")) {
sizeTextField.setText("8");
}
sizeList.setSelectedValue(Integer.valueOf(value), true);
updateFont();
}
});
this.okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setFont(previewLabel.getFont());
dispose();
}
});
this.cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
}
}