简体   繁体   中英

JTextArea expands as I enter text even though I have a JScrollPane, but the scrollbar doesn't show up either

I have this JTextArea and it keeps expanding as text is entered. I know this looks like a repeat question but I've followed the answers and they haven't worked for me. I also have a JScrollPane attached to it but no scrollbar is showing up. I want the JTextArea to remain a constant size and to have it scrollable. Please take a look at my code and tell me what's wrong, because I have no idea!

Here is my code:

package com.robot;

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;

public class GUI extends JFrame implements Runnable {

//start of the constructor method for GUI
public GUI() {

    //defines the line break
    String newline = System.getProperty("line.separator");

    //defines objects
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension dim = tk.getScreenSize();

    //sets the size of the GUI
    this.setSize(600, 400);

    //centers the GUI
    int xPos = (dim.width / 2) - (this.getWidth() /2);
    int yPos = (dim.height / 2) - (this.getHeight() /2);

    this.setLocation(xPos, yPos);

    //makes the program unable to be resized
    this.setResizable(false);

    //allows the user to close the program with the x button
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //sets the title of the program
    this.setTitle("ROBOT Alpha Alfred Version 3.0");

    //creates panels to hold the elements of the GUI
    JPanel mainPanel = new JPanel();
    JPanel buttonPanel = new JPanel();
    JPanel consolePanel = new JPanel();

    //creates buttons
    JButton runDemo = new JButton("Run Demo");
    JButton runLive = new JButton("Run Live");
    JButton scan = new JButton("Scan Market");
    JButton findPatterns = new JButton("Find Patterns");
    JButton cleanFolder = new JButton("Clean Up Folder");
    JButton configureSettings = new JButton("Configure Settings");

    //creates the console
    JTextArea console = new JTextArea(6, 40);

    //sets the default text of the console
    console.setText("----------------------- ROBOT Console -----------------------" + newline);

    //makes the console unable to be edited
    console.setEditable(false);
    console.append("3sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs22323sfasfs\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline123");

    //sets the line wrapping of the console
    console.setLineWrap(true);
    console.setWrapStyleWord(true);
    JScrollPane scrollBar = new JScrollPane(console);
    scrollBar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

    //adds buttons to the buttonPanel
    buttonPanel.add(runDemo);
    buttonPanel.add(runLive);
    buttonPanel.add(scan);
    buttonPanel.add(findPatterns);
    buttonPanel.add(cleanFolder);
    buttonPanel.add(configureSettings);

    //adds the console to the console panel
    consolePanel.add(console);
    consolePanel.add(scrollBar);

    //adds panels to the main panel
    mainPanel.add(buttonPanel);
    mainPanel.add(consolePanel);

    //adds the main panel to the frame
    this.add(mainPanel);

    //sets the GUI to be visible
    this.setVisible(true);

}

public void run() {

}

}

Thank you so much!

Your problem occurs here...

consolePanel.add(console);
consolePanel.add(scrollBar);

Basically a component can only belong to a single parent, by adding the console to the consolePanel you are removing it from the scroll pane.

The console is already contained within a container, so you simply only need to add the parent container (the scroll pane) to consolePane ...

//consolePanel.add(console);
consolePanel.add(scrollBar);

On a side note, you should be careful of Tookit#getScreenSize is it returns the "whole" screen and not the viewable screen size (that area which the application can safely use). So instead of ...

Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();

//sets the size of the GUI
this.setSize(600, 400);

//centers the GUI
int xPos = (dim.width / 2) - (this.getWidth() /2);
int yPos = (dim.height / 2) - (this.getHeight() /2);

this.setLocation(xPos, yPos);

You could use setLocationRelativeTo(null) and achieve a better result

I would also suggest sizing the component after you have added the content and before you make it visible, for example...

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

This ensures that the window takes into consideration in difference between different platforms more accurately...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM