为啥 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea?

Posted

技术标签:

【中文标题】为啥 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea?【英文标题】:Why is JScrollpane not added to JTextArea in my TextEditor?为什么 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea? 【发布时间】:2021-12-03 20:08:16 【问题描述】:

我不明白为什么 JScrollpane 不会被添加到 JTextArea,这是因为某种布局问题吗?

这是我朋友做的一个文本编辑器,他最初只用 AWT 做的,但后来我用 swing 的 JTextArea 替换了 AWT TextArea 来换行。

输出:

编辑:感谢所有为我投入时间的人。 我发现将 JTextArea 添加到 Frame 是实际问题,因为它已经添加到 JScrollPane 中;并且 JScrollPane 已经添加到 Frame 中。所以我只是删除了将 JTextArea 添加到 Frame 的行,这行写在我在代码中创建主题的上方。

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

//---------------------------------------
class MyFrame extends JFrame  // creating class name is 'Myframe' extending from 'JFrame' class
    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");

        // this is for shortcut keys
        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);
        // -------------------------------------------
        // setting icon
        Image icon = Toolkit.getDefaultToolkit().getImage(".//res//icon.png");
        setIconImage(icon);

        //

        bar = new MenuBar(); // creating object of menubar and giving it reference

        menu1 = new Menu("File");// creating object of menu as 'File' and giving it reference
        menu2 = new Menu("Edit");// creating object of menu as 'Edit' and giving it reference

        format_menu = new Menu("Format");// creating object of menu as 'Format' and giving it reference
        font_size = new Menu("Font Size");// creating object of menu as 'Font Size' and giving it reference
        theme = new Menu("Theme");// creating object of menu as 'Theme' and giving it reference

        //// creating object of MenuItem and giving it reference,and Passing arguments
        //// 'label','menushortcut'
        new_item1 = new MenuItem("New", menuShortcut_new_item1);
        item2 = new MenuItem("Open", menuShortcut_item2);
        item3 = new MenuItem("Save", menuShortcut_item3);
        item4 = new MenuItem("Exit", menuShortcut_item4);

        item5 = new MenuItem("Copy", menuShortcut_item5);
        item6 = new MenuItem("Paste", menuShortcut_item6);
        item7 = new MenuItem("Cut", menuShortcut_item7);
        item8 = new MenuItem("Select All", menuShortcut_item8);

        // ------------------done--------------

        // creating menuItem for font size menu
        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");
        // -------------------done-------------------
        // creating menuItem for theme menu
        dracula = new MenuItem("Dracula");
        queen = new MenuItem("Queen");
        dawn = new MenuItem("Dawn");
        light = new MenuItem("Light");

        // creating menuItem for theme menu

        // adding new_item1,2,3,4 to menu1 ,that is new,open,save,exit
        menu1.add(new_item1);
        menu1.add(item2);
        menu1.add(item3);
        menu1.add(item4);

        // ------------------Done-------------------

        // adding item5,6,7,8 to menu2 ,that is copy,paste,cut,and select all
        menu2.add(item5);
        menu2.add(item6);
        menu2.add(item7);
        menu2.add(item8);
        // -------done---------------------------------------------------------

        format_menu.add(font_size);// adding font_size menu to format menu so it becomes submenu

        // adding MenuItems to font_size menu
        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);
        // ---------done------------------------

        // adding MenuItem to theme Menu-------
        theme.add(dracula);
        theme.add(queen);
        theme.add(dawn);
        theme.add(light);
        // ---------done------------------------

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

        // adding menus to bar
        bar.add(menu1);
        bar.add(menu2);
        bar.add(format_menu);
        bar.add(theme);

        setMenuBar(bar); // settingmenubar as bar
        add(jTextArea);// adding text area

        // declaring some colors using rgb

        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);

        // setting default foreground color of jTextArea and setting font
        jTextArea.setForeground(Color.BLUE);
        jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 15));

        // setting size and location and visibility
        setSize(1000, 600);
        setLocationRelativeTo(null);
        setVisible(true);

        item2.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                FileDialog dialog = new FileDialog(new Frame(), "Open", FileDialog.LOAD); // this will load the
                                                                                          // fileDialog
                dialog.setVisible(true);// this will make dialog visible
                String path = dialog.getDirectory() + dialog.getFile(); // this will select the path of selected file
                                                                        // and put it into 'path'
                setTitle(dialog.getFile() + " - CodePad");// this will set Title to selected file name and -CodePad

                try 
                    FileInputStream fi = new FileInputStream(path);
                    byte b[] = new byte[fi.available()];
                    fi.read(b);
                    String str = new String(b); // this will store b in str
                    jTextArea.setText(str);// this will display text in 'str' in jTextArea
                    fi.close();// this will close fi

                 catch (Exception e) 

                    System.out.println("Something went Wrong :(");
                
            
        );

        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(), "Save ", 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("Something went Wrong :(");
                
            
        );
        item4.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                // setVisible(false);//this will make frame invisible
                System.exit(0);
            
        );

        item5.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                text = jTextArea.getSelectedText();// this will store selected text in to variable 'text'
            
        );

        item6.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.insert(text, jTextArea.getCaretPosition()); // this will insert the text present in 'text'
                                                                      // variable at the carret position
            
        );

        item7.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                text = jTextArea.getSelectedText(); // this will copy the selected text
                jTextArea.replaceRange("", jTextArea.getSelectionStart(), jTextArea.getSelectionEnd()); // this will put
                                                                                                        // ""
                                                                                                        // to selected
                                                                                                        // text
            
        );

        item8.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.selectAll(); // this will select all the text in jTextArea
            
        );

        // ------------------------------------------------------------------------

        // --------------------------------------------------------------------------

        size_8.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 8)); // this will change the size of text in
                                                                            // jTextArea to 8
            
        );
        size_12.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 12));// this will change the size of text in
                                                                            // jTextArea to 12
            
        );
        size_16.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 16));// this will change the size of text in
                                                                            // jTextArea to 16
            
        );
        size_20.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));// this will change the size of text in
                                                                            // jTextArea to 20
            
        );
        size_24.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 24));// this will change the size of text in
                                                                            // jTextArea to 24
            
        );
        size_28.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                jTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 28));// this will change the size of text in
                                                                            // jTextArea to 28
            
        );

        // --------------------------------------------------------------------------
        dracula.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 

                jTextArea.setBackground(dracula_Color);// this will backgound to dracula
                jTextArea.setForeground(green_Color);// this will set foregrounf to green
            
        );
        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();// object
    

【问题讨论】:

【参考方案1】:

您是 Swing 新手吗? 我没有看到您设置内容窗格。 我也没有看到您在 actionListeners 中使用 @Override 命令。

正如我发现一些可疑的事情一样。我通常创建一个新的 JFrame 而不是扩展它。而且我认为扩展 JFrame 是一种不好的做法。但这不是普遍的看法。 然后,您将向框架添加一个面板并将其设置为 contentPane。 然后您可以开始将所有内容添加到您的面板中,包括其他有助于 UI 布局的面板。 文本字段甚至显示吗?因为我怀疑它没有。 此外,您需要将 ScrollPane 添加到您的 contentPane,而不是您的 Frame。 我建议从帖子中的代码中删除与您的问题无关的所有内容,即与当前主题无关的所有内容。

编辑: 您是否尝试将 textArea 添加到 Scrollpane? 它看起来像这样。

JTextArea text = new JTextArea();
JScrollPane newScroll = new JScrollPane(text);

这对你有帮助吗?

【讨论】:

是的,你猜对了,我是新手。并且代码确实有效,即显示 TextArea 只是即使 JTextArea 已满,它也不会显示 JScrollPane。不过感谢您的回答! 我编辑了我的答案。你试过吗? 你有框架。您使用框架来添加面板。您使用面板添加滚动窗格,然后使用滚动窗格添加文本区域。按这个顺序。【参考方案2】:

总结here的观点并阐述:

如图here,默认内容窗格会有BorderLayout,默认约束为BoderLayout.CENTER;只有 一个 组件可以占据该位置。

给你的JTextArea一个初始的首选尺寸和pack()框架;键入一些文本或调整名声大小以根据需要查看滚动条。

如图所示 here 用于 Swing,使用 javax.swing.JMenuBarJMenuJMenuItem 等。

在event dispatch thread 上构造和操作 Swing GUI 对象。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class CodePad 

    public static void main(String[] args) 
        EventQueue.invokeLater(new CodeEditor()::create);
    

    private static final class CodeEditor 

        JMenuBar bar = new JMenuBar();
        JMenu file = new JMenu("File");
        JMenu edit = new JMenu("Edit");
        JTextArea textArea = new JTextArea("Some text…", 8, 36);

        public void create() 
            JFrame f = new JFrame("CodePad");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            bar.add(file);
            bar.add(edit);
            f.setJMenuBar(bar);

            textArea.setForeground(Color.BLUE);
            textArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 16));
            textArea.setLineWrap(true);
            JScrollPane scrollArea = new JScrollPane(textArea);
            f.add(scrollArea); // default BoderLayout.CENTER

            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        
    

【讨论】:

以上是关于为啥 JScrollpane 没有添加到我的 TextEditor 中的 JTextArea?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 ViewModel 添加到我的 SwiftUI 应用程序后我的 UI 没有更新?

尝试使用自动布局将 UIButton 添加到我的视图中,但它没有出现。为啥? [关闭]

为啥垃圾被添加到我的 mongodb 中?

为啥垃圾被添加到我的 mongodb 中?

jScrollPane + 嵌入式 Youtube 视频悬停

为啥服务器没有检测到我的 python 项目中的更改源代码?