Java テキストエディタ

import javax.swing.*;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;

public class AdvancedTextEditor extends JFrame implements ActionListener {
    JTabbedPane tabbedPane;
    JTextArea textArea;
    JMenuBar menuBar;
    JMenu fileMenu, editMenu, formatMenu, themeMenu;
    JMenuItem newItem, openItem, saveItem, saveAllItem, closeItem;
    JMenuItem cutItem, copyItem, pasteItem, findItem, replaceItem, undoItem, redoItem;
    JMenuItem fontItem, lightThemeItem, darkThemeItem;
    JFileChooser fileChooser;
    JLabel statusBar;
    UndoManager undoManager = new UndoManager();
    JPopupMenu contextMenu;

    public AdvancedTextEditor() {
        setTitle("Advanced Text Editor");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tabbedPane = new JTabbedPane();
        add(tabbedPane, BorderLayout.CENTER);

        statusBar = new JLabel("Status: Ready | Line: 1, Column: 1");
        add(statusBar, BorderLayout.SOUTH);

        menuBar = new JMenuBar();

        // ファイルメニューの作成
        fileMenu = new JMenu("File");
        newItem = new JMenuItem("New");
        openItem = new JMenuItem("Open");
        saveItem = new JMenuItem("Save");
        saveAllItem = new JMenuItem("Save All");
        closeItem = new JMenuItem("Close");
        fileMenu.add(newItem);
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.add(saveAllItem);
        fileMenu.add(closeItem);

        // 編集メニューの作成
        editMenu = new JMenu("Edit");
        cutItem = new JMenuItem("Cut");
        copyItem = new JMenuItem("Copy");
        pasteItem = new JMenuItem("Paste");
        undoItem = new JMenuItem("Undo");
        redoItem = new JMenuItem("Redo");
        findItem = new JMenuItem("Find");
        replaceItem = new JMenuItem("Replace");
        editMenu.add(cutItem);
        editMenu.add(copyItem);
        editMenu.add(pasteItem);
        editMenu.add(undoItem);
        editMenu.add(redoItem);
        editMenu.add(findItem);
        editMenu.add(replaceItem);

        // フォーマットメニューの作成
        formatMenu = new JMenu("Format");
        fontItem = new JMenuItem("Change Font");
        formatMenu.add(fontItem);

        // テーマメニューの作成
        themeMenu = new JMenu("Themes");
        lightThemeItem = new JMenuItem("Light Theme");
        darkThemeItem = new JMenuItem("Dark Theme");
        themeMenu.add(lightThemeItem);
        themeMenu.add(darkThemeItem);

        // メニューバーにメニューを追加
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(formatMenu);
        menuBar.add(themeMenu);

        setJMenuBar(menuBar);

        // アクションリスナーの設定
        newItem.addActionListener(this);
        openItem.addActionListener(this);
        saveItem.addActionListener(this);
        saveAllItem.addActionListener(this);
        closeItem.addActionListener(this);
        cutItem.addActionListener(this);
        copyItem.addActionListener(this);
        pasteItem.addActionListener(this);
        undoItem.addActionListener(this);
        redoItem.addActionListener(this);
        findItem.addActionListener(this);
        replaceItem.addActionListener(this);
        fontItem.addActionListener(this);
        lightThemeItem.addActionListener(this);
        darkThemeItem.addActionListener(this);

        // ドラッグ&ドロップ対応
        new DropTarget(tabbedPane, new FileDropHandler());

        // コンテキストメニューの設定
        contextMenu = new JPopupMenu();
        contextMenu.add(cutItem);
        contextMenu.add(copyItem);
        contextMenu.add(pasteItem);
    }

    // アクションリスナーの処理
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == newItem) {
            addNewTab();
        }
        // 他のアクションもここに追加
    }

    // 新しいタブを追加するメソッド
    private void addNewTab() {
        JTextArea textArea = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(textArea);
        tabbedPane.add("Untitled", scrollPane);
        tabbedPane.setSelectedComponent(scrollPane);
        textArea.getDocument().addUndoableEditListener(e -> undoManager.addEdit(e.getEdit()));
    }

    // ファイルドロップハンドラ
    @SuppressWarnings("unchecked")
    class FileDropHandler extends DropTargetAdapter {
        @Override
        public void drop(DropTargetDropEvent dtde) {
            dtde.acceptDrop(DnDConstants.ACTION_COPY);
            try {
                java.util.List<File> droppedFiles = (java.util.List<File>) dtde.getTransferable()
                        .getTransferData(DataFlavor.javaFileListFlavor);
                for (File file : droppedFiles) {
                    openFile(file);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    // ファイルを開くメソッド
    private void openFile(File file) {
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            JTextArea textArea = new JTextArea();
            textArea.read(reader, null);
            JScrollPane scrollPane = new JScrollPane(textArea);
            tabbedPane.add(file.getName(), scrollPane);
            tabbedPane.setSelectedComponent(scrollPane);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            AdvancedTextEditor editor = new AdvancedTextEditor();
            editor.setVisible(true);
        });
    }
}

投稿者: chosuke

趣味はゲームやアニメや漫画などです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です