You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的Java文本编辑器中JScrollPane未正常添加到JTextArea是什么原因?

JScrollPane 无法绑定 JTextArea 问题

问题描述

  • 我无法理解为什么JScrollPane无法添加到JTextArea上,请问这是不是某种布局问题导致的?
  • 这是我朋友开发的文本编辑器,最初他仅使用AWT开发,我将AWT的TextArea替换为Swing的JTextArea以实现文本自动换行功能。

运行输出效果:
运行效果图


问题原因与解决

我已经找到问题所在:JTextArea已经被添加到JScrollPane中,且JScrollPane已经添加到Frame中,我又额外写了一行将JTextArea直接添加到Frame的代码,这就是问题根源。我删除了主题创建代码上方那行单独添加JTextArea到Frame的代码后问题解决。


问题复现代码

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

//---------------------------------------
class MyFrame extends JFrame { // 创建继承自JFrame的MyFrame类
    MenuBar bar;
    Menu menu1, menu2, format_menu, font_size, theme;
    MenuItem new_item1, item2, item3, item4, item5, item6, item7, item8;
    MenuItem dracula, queen, dawn, light;
    MenuItem size_8, size_12, size_16, size_20, size_24, size_28;

    JTextArea jTextArea;
    String text;

    MyFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Untitled - CodePad");

        // 快捷键配置
        MenuShortcut menuShortcut_new_item1 = new MenuShortcut(KeyEvent.VK_N);
        MenuShortcut menuShortcut_item2 = new MenuShortcut(KeyEvent.VK_O);
        MenuShortcut menuShortcut_item3 = new MenuShortcut(KeyEvent.VK_S);
        MenuShortcut menuShortcut_item4 = new MenuShortcut(KeyEvent.VK_X);

        MenuShortcut menuShortcut_item5 = new MenuShortcut(KeyEvent.VK_C);
        MenuShortcut menuShortcut_item6 = new MenuShortcut(KeyEvent.VK_V);
        MenuShortcut menuShortcut_item7 = new MenuShortcut(KeyEvent.VK_T);
        MenuShortcut menuShortcut_item8 = new MenuShortcut(KeyEvent.VK_A);
        // -------------------------------------------
        // 窗口图标配置
        Image icon = Toolkit.getDefaultToolkit().getImage(".//res//icon.png");
        setIconImage(icon);

        // 菜单栏初始化
        bar = new MenuBar();

        menu1 = new Menu("文件");
        menu2 = new Menu("编辑");
        format_menu = new Menu("格式");
        font_size = new Menu("字号");
        theme = new Menu("主题");

        // 菜单项初始化,绑定快捷键
        new_item1 = new MenuItem("新建", menuShortcut_new_item1);
        item2 = new MenuItem("打开", menuShortcut_item2);
        item3 = new MenuItem("保存", menuShortcut_item3);
        item4 = new MenuItem("退出", menuShortcut_item4);

        item5 = new MenuItem("复制", menuShortcut_item5);
        item6 = new MenuItem("粘贴", menuShortcut_item6);
        item7 = new MenuItem("剪切", menuShortcut_item7);
        item8 = new MenuItem("全选", menuShortcut_item8);

        // 字号菜单项初始化
        size_8 = new MenuItem("8");
        size_12 = new MenuItem("12");
        size_16 = new MenuItem("16");
        size_20 = new MenuItem("20");
        size_24 = new MenuItem("24");
        size_28 = new MenuItem("28");

        // 主题菜单项初始化
        dracula = new MenuItem("德古拉");
        queen = new MenuItem("女王紫");
        dawn = new MenuItem("晨光橙");
        light = new MenuItem("亮白");

        // 为文件菜单添加菜单项
        menu1.add(new_item1);
        menu1.add(item2);
        menu1.add(item3);
        menu1.add(item4);

        // 为编辑菜单添加菜单项
        menu2.add(item5);
        menu2.add(item6);
        menu2.add(item7);
        menu2.add(item8);

        // 字号菜单作为格式菜单的子菜单
        format_menu.add(font_size);
        // 为字号菜单添加菜单项
        font_size.add(size_8);
        font_size.add(size_12);
        font_size.add(size_16);
        font_size.add(size_20);
        font_size.add(size_24);
        font_size.add(size_28);

        // 为主题菜单添加菜单项
        theme.add(dracula);
        theme.add(queen);
        theme.add(dawn);
        theme.add(light);

        jTextArea = new JTextArea();
        jTextArea.setLineWrap(true);
        JScrollPane scroll = new JScrollPane(jTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(scroll);

        // 将菜单添加到菜单栏
        bar.add(menu1);
        bar.add(menu2);
        bar.add(format_menu);
        bar.add(theme);

        setMenuBar(bar);
        // 错误代码:重复添加JTextArea到Frame,导致之前的JScrollPane失效
        add(jTextArea);

        // 自定义颜色声明
        Color dracula_Color = new Color(39, 40, 34);
        Color green_Color = new Color(166, 226, 41);
        Color orange_Color = new Color(219, 84, 34);
        Color queen_Color = new Color(174, 129, 219);

        // JTextArea默认样式配置
        jTextArea.setForeground(Color.BLUE);
        jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 15));

        // 窗口基础配置
        setSize(1000, 600);
        setLocationRelativeTo(null);
        setVisible(true);

        // 打开文件逻辑
        item2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                FileDialog dialog = new FileDialog(new Frame(), "打开", FileDialog.LOAD);
                dialog.setVisible(true);
                String path = dialog.getDirectory() + dialog.getFile();
                setTitle(dialog.getFile() + " - CodePad");

                try {
                    FileInputStream fi = new FileInputStream(path);
                    byte b[] = new byte[fi.available()];
                    fi.read(b);
                    String str = new String(b);
                    jTextArea.setText(str);
                    fi.close();

                } catch (Exception e) {
                    System.out.println("操作出错 :(");
                }
            }
        });

        // 新建文件逻辑
        new_item1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                setTitle("Untitled - CodePad");
                jTextArea.setText(" ");
            }
        });

        // 保存文件逻辑
        item3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                FileDialog dialog = new FileDialog(new Frame(), "保存", FileDialog.SAVE);
                dialog.setVisible(true);
                String path = dialog.getDirectory() + dialog.getFile();
                setTitle(dialog.getFile() + "- CodePad");

                try {
                    FileWriter fw = new FileWriter(path);
                    fw.write(jTextArea.getText());
                    fw.close();

                } catch (Exception e) {
                    System.out.println("操作出错 :(");
                }
            }
        });

        // 退出逻辑
        item4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });

        // 复制逻辑
        item5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                text = jTextArea.getSelectedText();
            }
        });

        // 粘贴逻辑
        item6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.insert(text, jTextArea.getCaretPosition());
            }
        });

        // 剪切逻辑
        item7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                text = jTextArea.getSelectedText();
                jTextArea.replaceRange("", jTextArea.getSelectionStart(), jTextArea.getSelectionEnd());
            }
        });

        // 全选逻辑
        item8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.selectAll();
            }
        });

        // 字号调整逻辑
        size_8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 8));
            }
        });
        size_12.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 12));
            }
        });
        size_16.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 16));
            }
        });
        size_20.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));
            }
        });
        size_24.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 24));
            }
        });
        size_28.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 28));
            }
        });

        // 主题切换逻辑
        dracula.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setBackground(dracula_Color);
                jTextArea.setForeground(green_Color);
            }
        });
        queen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setBackground(dracula_Color);
                jTextArea.setForeground(queen_Color);
            }
        });
        dawn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setBackground(Color.WHITE);
                jTextArea.setForeground(orange_Color);
            }
        });
        light.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                jTextArea.setBackground(Color.WHITE);
                jTextArea.setForeground(Color.BLUE);
            }
        });
    }
}

// 主类
public class CodePad_updated {
    public static void main(String[] args) {
        new MyFrame();
    }
}

内容的提问来源于stack exchange,提问作者Priyanshu Ganatra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:39:00