Home > Net >  Why is JScrollpane not added to JTextArea in my TextEditor?
Why is JScrollpane not added to JTextArea in my TextEditor?

Time:10-17

I can't understand why the JScrollpane won't be added to JTextArea, is this because of some sort of layout problem?

This is a text editor made by my friend, he initially made it with only AWT but I then replaced AWT TextArea with swing's JTextArea to wrap text.

Output: enter image description here

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
    }
}

CodePudding user response:

Are you new to Swing? I dont see you setting a contentpane. I also do not see you use the @Override command in your actionListeners.

Just as a few things I find suspicious. I normally create a new JFrame instead of extending it. And I consider extending JFrame a bad practice. But that is no universal opinion. Then you would add a panel to the frame and set it as contentPane. And then you can start adding everything to your panel, including other panels to help with UI Layout. Does the Textfield even show? Because I suspect it does not. Also you need to add the ScrollPane to your contentPane, not your Frame. I suggest to delete everything from your code in the post that is not relevant to your question, i.e. everything not related to the topic at hand.

Edit: have you tried adding the textArea to the Scrollpane? it would look something like this.

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

Does that help you?

CodePudding user response:

Summarizing the points made image

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);
        }
    }
}
  • Related