diff --git a/.gitignore b/.gitignore index 2b40ba2..72b0460 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ out/* .idea/* -note.iml \ No newline at end of file +*.iml diff --git a/data/data.txt b/data/data.txt new file mode 100644 index 0000000..0c33440 --- /dev/null +++ b/data/data.txt @@ -0,0 +1,30 @@ +start7410 +1+ + 成长路上,有快乐,有幸福;有苦涩,有艰辛。成长告诉我,我不再是那个淘气的孩子,我长大了;成长告诉我珍惜光阴;成长告诉我珍惜友谊;成长告诉我和家人心连着心;下面是有有关成长的优美散文,欢迎参阅。 + + + + +start7410 +2+ + 有关成长的优美散文:在体验中成长生活丰富多彩,探索它也是很有趣的。 + 实践也是生活的一部分,也让我们更加多姿多彩,也让我们得到很多。 + 一次集体旅行,让我们得到快乐;一次搞卫生,让我们体味到劳动的艰辛;一次来之不易的成功,让我们体会到付出的重要,明白了奋斗的可贵。 + + + +start7410 +3+ + 如今社会步入小康,百姓们再也不用像以前一样担忧粮食了。每当到吃饭时间,父母总是做好饭喊我吃,我就只要乖乖吃饭就可以了。 + 有一次我突然想,每次都是父母做饭,我总也要实践一下吧,于是乎,我经过父母的允许,准备自己弄一顿饭。 + + + +start7410 +4+ + 买菜。 + “选菜是自己要仔细看,别选些坏的……”“得买2,3元洋葱,对了,盐不多了,买些盐……”刚出门,妈妈生怕我不知道,忙说了大堆话,“好好好”,我含糊的回答后便小跑迅速离开,去菜市场的路上我都在想着该买的东西,不时的回想。因为以前随父母来过,所以我很快到了。菜市场气氛不多说,肯定是喧闹的,买几个辣椒,随便在小摊上拿上几个,之后付钱。 + 我初次买,实在不好说,连价都不知道砍,肯定被商家赚到了一些。不过有几个买菜老板很热情,一见我来买菜,忙客气的招呼,过了好久,我觉得差不多了,又仔细的回忆一下,嗯,应该没漏,没多留后飞奔似的回家。 + + + diff --git a/src/top/dreamcenter/note/Main.java b/src/top/dreamcenter/note/Main.java index 3ba19ce..24cf194 100644 --- a/src/top/dreamcenter/note/Main.java +++ b/src/top/dreamcenter/note/Main.java @@ -1,22 +1,33 @@ package top.dreamcenter.note; import javax.swing.*; -import javax.swing.text.BadLocationException; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.*; import java.net.URL; +import java.util.LinkedList; +import java.util.List; public class Main { + + private static final int TOTAL_PAGE = 3650; + private static final String MARK = "start7410"; + + private static File file = new File("data/data.txt"); + public static void main(String[] args) { - JFrame jf = new JFrame("日记本"); + + JFrame jf = new JFrame("日记本 [F5 上一页; F6 下一页; F7 保存]"); jf.setSize(800, 1020); jf.setResizable(false); jf.setLocationRelativeTo(null); jf.getContentPane().setLayout(null); jf.setBackground(Color.WHITE); - jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 内容面板穿透 JPanel imPanel=(JPanel) jf.getContentPane(); @@ -31,55 +42,165 @@ public class Main { JLabel backgroundLabel = new JLabel(new ImageIcon(newimg)); backgroundLabel.setBounds(0, 0, jf.getWidth() , jf.getHeight()); + // 数据 + final int[] curPage = {0}; + LinkedList contentlist = new LinkedList<>(); + LinkedList dateList = new LinkedList<>(); + initList(contentlist, dateList); + + // 页号 + JLabel pageNo = new JLabel(String.valueOf(curPage[0])); + pageNo.setFont(new Font("Segoe Script", Font.PLAIN, 20)); + pageNo.setHorizontalAlignment(JLabel.RIGHT); + pageNo.setBounds(330,40,60,40); + + // 日期 + JTextField date = new JTextField(dateList.get(curPage[0])); + date.setBorder(null); + date.setFont(new Font("Segoe Script", Font.PLAIN, 18)); + date.setBounds(100,45,130,30); // 文本行 - JTextArea textArea = new JTextArea(); + JTextArea textArea = new JTextArea(contentlist.get(curPage[0])); textArea.setFont(new Font(null, Font.PLAIN, 36)); textArea.setOpaque(false); // 透明背景 textArea.setLineWrap(true); // 自动换行 textArea.setTabSize(2); textArea.setBounds(20, 90, jf.getWidth() - 40, jf.getHeight() - 140); - int maxRows = 19; + date.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + dateList.set(curPage[0], date.getText()); + } + }); + textArea.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { - try { - int len = textArea.getText().length(); - Rectangle rec = textArea.modelToView(len); - // 最大行数 - int line = rec.y / rec.height + 1; - - // 超出部分逻辑判断 - if (line > maxRows) { - int i = len - 1; - for (; i >= 0; i--) { - Rectangle rec0 = textArea.modelToView(i); - - int tmpLine = rec0.y / rec0.height + 1; - if (tmpLine <= maxRows){ - i++; - break; - } + contentlist.set(curPage[0], textArea.getText()); + switch (e.getKeyCode()) { + case KeyEvent.VK_F5 -> { // 上一页 + if (curPage[0] > 0) { + contentlist.set(curPage[0], textArea.getText()); + dateList.set(curPage[0], date.getText()); + curPage[0]--; + pageNo.setText(String.valueOf(curPage[0])); + textArea.setText(contentlist.get(curPage[0])); + date.setText(dateList.get(curPage[0])); } - - System.out.println("超出行数字符串内容:" + textArea.getText(i, len - i)); - textArea.setText(textArea.getText(i, len - i)); } - - - } catch (BadLocationException badLocationException) { - badLocationException.printStackTrace(); + case KeyEvent.VK_F6 -> { // 下一页 + if (curPage[0] < TOTAL_PAGE) { + contentlist.set(curPage[0], textArea.getText()); + dateList.set(curPage[0], date.getText()); + curPage[0]++; + pageNo.setText(String.valueOf(curPage[0])); + textArea.setText(contentlist.get(curPage[0])); + date.setText(dateList.get(curPage[0])); + } + } + case KeyEvent.VK_F7 -> { // 保存 + saveData(contentlist, dateList); + } } + } + }); + jf.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + int confirm = JOptionPane.showConfirmDialog(jf, "是否保存并退出?", "保存退出", JOptionPane.YES_NO_CANCEL_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + saveData(contentlist, dateList); + System.exit(0); + } else if (confirm == JOptionPane.NO_OPTION) { + System.exit(0); + } } }); // 添加组件 jf.getLayeredPane().add(backgroundLabel, Integer.valueOf(Integer.MIN_VALUE)); + jf.getContentPane().add(date); + jf.getContentPane().add(pageNo); jf.getContentPane().add(textArea); jf.setVisible(true); } + + private static void initList(List contentList, List dateList) { + if (!file.exists()) { + try { + boolean createResult = file.createNewFile(); + if (!createResult) { + JOptionPane.showMessageDialog(null, "数据文件创建失败", "警告", JOptionPane.WARNING_MESSAGE); + } + } catch (IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, "IO错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); + } + } + + for (int i = 0; i < TOTAL_PAGE; i++){ + contentList.add(""); + dateList.add(""); + } + + try (BufferedReader br = new BufferedReader( + new InputStreamReader(new FileInputStream(file)))) { + String tmp; + StringBuilder sb = new StringBuilder(); + + int page = -1; + String date = ""; + while ((tmp = br.readLine()) != null) { + if (MARK.equals(tmp)) { + if (page != -1) { + dateList.set(page - 1, date); + contentList.set(page - 1, sb.toString()); + sb.delete(0, sb.length()); + } + String[] part = br.readLine().split("\\+"); + page = Integer.parseInt(part[0]); + if (part.length == 2){ + date = part[1]; + } + } else { + sb.append(tmp).append("\n"); + } + } + if (page != -1) { + dateList.set(page - 1, date); + contentList.set(page - 1, sb.toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void saveData(List contentList, List dateList){ + try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)))) { + for (int i = 0; i < TOTAL_PAGE; i++) { + String date = dateList.get(i); + String content = contentList.get(i); + if (!"".equals(date) || !"".equals(content)) { + bw.write(MARK); + bw.newLine(); + bw.write(String.valueOf(i + 1)); + bw.write("+"); + bw.write(date); + bw.newLine(); + bw.write(content); + bw.newLine(); + } + } + JOptionPane.showMessageDialog(null, "保存成功!", "消息", JOptionPane.INFORMATION_MESSAGE); + + } catch (IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, "保存失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); + + } + } }