Aplicación de Bloc de Notas en Java

respondido por OpenAI o1 mini en OpenAI o1

Pregunta:

Hola Puedes crearme una aplicacion block de notas con java, la aplicacion debe ser capaz de realizar las funcionalidaes basicas abrir archivos, guardar e imprimir, asi como tambien las opciones de deshacer y rehacer, tambien debe dar la posibilidad de tener multiples pestañas, asi como de hacer zoom, cambiar el estilo, color y tamaño de la letra, el diseño debe ser moderno y atractivo

Respuesta:

¡Claro! A continuación, te proporcionaré un ejemplo básico de una aplicación de bloc de notas en Java utilizando Swing. Esta aplicación incluirá las funcionalidades que mencionaste: abrir archivos, guardar, imprimir, deshacer, rehacer, múltiples pestañas, zoom, y opciones para cambiar el estilo, color y tamaño de la letra.

Requisitos

Asegúrate de tener instalado Java y un IDE como IntelliJ IDEA o Eclipse para compilar y ejecutar el código.

Código de la Aplicación

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.*;
import java.util.Stack;

public class NotepadApp extends JFrame {
    private JTabbedPane tabbedPane;
    private Stack<String> undoStack;
    private Stack<String> redoStack;

    public NotepadApp() {
        setTitle("Bloc de Notas");
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

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

        undoStack = new Stack<>();
        redoStack = new Stack<>();

        createMenuBar();
        createNewTab();

        setVisible(true);
    }

    private void createMenuBar() {
        JMenuBar menuBar = new JMenuBar();

        JMenu fileMenu = new JMenu("Archivo");
        fileMenu.setMnemonic(KeyEvent.VK_A);
        menuBar.add(fileMenu);

        JMenuItem newItem = new JMenuItem("Nuevo");
        newItem.addActionListener(e -> createNewTab());
        fileMenu.add(newItem);

        JMenuItem openItem = new JMenuItem("Abrir");
        openItem.addActionListener(e -> openFile());
        fileMenu.add(openItem);

        JMenuItem saveItem = new JMenuItem("Guardar");
        saveItem.addActionListener(e -> saveFile());
        fileMenu.add(saveItem);

        JMenuItem printItem = new JMenuItem("Imprimir");
        printItem.addActionListener(e -> printFile());
        fileMenu.add(printItem);

        JMenuItem exitItem = new JMenuItem("Salir");
        exitItem.addActionListener(e -> System.exit(0));
        fileMenu.add(exitItem);

        JMenu editMenu = new JMenu("Editar");
        editMenu.setMnemonic(KeyEvent.VK_E);
        menuBar.add(editMenu);

        JMenuItem undoItem = new JMenuItem("Deshacer");
        undoItem.addActionListener(e -> undo());
        editMenu.add(undoItem);

        JMenuItem redoItem = new JMenuItem("Rehacer");
        redoItem.addActionListener(e -> redo());
        editMenu.add(redoItem);

        JMenu formatMenu = new JMenu("Formato");
        formatMenu.setMnemonic(KeyEvent.VK_F);
        menuBar.add(formatMenu);

        JMenuItem fontItem = new JMenuItem("Cambiar Fuente");
        fontItem.addActionListener(e -> changeFont());
        formatMenu.add(fontItem);

        setJMenuBar(menuBar);
    }

    private void createNewTab() {
        JTextPane textPane = new JTextPane();
        textPane.setContentType("text/plain");
        textPane.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                undoStack.push(textPane.getText());
                redoStack.clear();
            }
        });

        JScrollPane scrollPane = new JScrollPane(textPane);
        tabbedPane.addTab("Nueva Pestaña", scrollPane);
    }

    private void openFile() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("Archivos de texto", "txt"));
        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                JTextPane textPane = new JTextPane();
                textPane.setContentType("text/plain");
                textPane.read(reader, null);
                JScrollPane scrollPane = new JScrollPane(textPane);
                tabbedPane.addTab(file.getName(), scrollPane);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void saveFile() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("Archivos de texto", "txt"));
        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
                JTextPane textPane = (JTextPane) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getView();
                textPane.write(writer);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void printFile() {
        JTextPane textPane = (JTextPane) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getView();
        try {
            textPane.print();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void undo() {
        if (!undoStack.isEmpty()) {
            String lastText = undoStack.pop();
            redoStack.push(lastText);
            JTextPane textPane = (JTextPane) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getView();
            textPane.setText(lastText);
        }
    }

    private void redo() {
        if (!redoStack.isEmpty()) {
            String lastText = redoStack.pop();
            undoStack.push(lastText);
            JTextPane textPane = (JTextPane) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getView();
            textPane.setText(lastText);
        }
    }

    private void changeFont() {
        JTextPane textPane = (JTextPane) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getView();
        Font currentFont = textPane.getFont();
        Font newFont = JFontChooser.showDialog(this, "Seleccionar Fuente", currentFont);
        if (newFont != null) {
            textPane.setFont(newFont);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(NotepadApp::new);
    }
}

class JFontChooser extends JDialog {
    private Font selectedFont;

    public static Font showDialog(Component parent, String title, Font initialFont) {
        JFontChooser fontChooser = new JFontChooser(parent, title, initialFont);
        fontChooser.setVisible(true);
        return fontChooser.selectedFont;
    }

    private JFontChooser(Component parent, String title, Font initialFont) {
        setTitle(title);
        setModal(true);
        setSize(400, 300);
        setLocationRelativeTo(parent);
        setLayout(new BorderLayout());

        JList<String> fontList = new JList<>(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
        fontList.setSelectedValue(initialFont.getFontName(), true);
        add(new JScrollPane(fontList), BorderLayout.CENTER);

        JButton okButton = new JButton("Aceptar");
        okButton.addActionListener(e -> {
            String selectedFontName = fontList.getSelectedValue();
            int selectedSize = Integer.parseInt(JOptionPane.showInputDialog(this, "Tamaño de fuente:", initialFont.getSize()));
            selectedFont = new Font(selectedFontName, Font.PLAIN, selectedSize);
            dispose();
        });
        add(okButton, BorderLayout.SOUTH);
    }
}

Descripción del Código

  1. Interfaz Gráfica: Utiliza JFrame, JTabbedPane, y JTextPane para crear la interfaz de usuario.
  2. Menú: Se crea un menú con opciones para abrir, guardar, imprimir, deshacer, rehacer y cambiar la fuente.
  3. Pestañas: Permite crear múltiples pestañas para diferentes documentos.
  4. Deshacer/Rehacer: Utiliza pilas (Stack) para manejar las operaciones de deshacer y rehacer.
  5. Cambiar Fuente: Se incluye un diálogo para seleccionar la fuente y el tamaño.

Ejecución

  1. Copia el código en un archivo llamado NotepadApp.java.
  2. Compila y ejecuta el archivo en tu IDE o desde la línea de comandos.

Notas

  • Este es un ejemplo básico y puede ser mejorado con más funcionalidades, como la opción de cambiar el color de fondo, agregar un sistema de guardado automático, etc.
  • Asegúrate de manejar excepciones y errores de manera adecuada en un entorno de producción.

¡Espero que esto te ayude a crear tu aplicación de bloc de notas! Si tienes más preguntas o necesitas más funcionalidades, no dudes en preguntar.