我的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
相关产品推荐
相关产品推荐

