简体   繁体   中英

JTextArea not showing

Why JTextArea not showing in GUI ?

public class AddMovie extends JTextField {

    static JFrame frame;
    private JLabel description;
    JTextArea movieDescription;

    public JPanel createContentPane() throws IOException
    {

        JPanel totalGUI = new JPanel();
        totalGUI.setLayout(null);
        totalGUI.setBackground(Color.WHITE);

        description = new JLabel("Description  ");
            description.setLocation(15,285);
            description.setSize(120, 25);
            description.setFont(new java.awt.Font("Tahoma", 0, 12));
            movieDescription=new JTextArea();
          movieDescription.setLocation(15,320);
          movieDescription.setSize(420, 110);

        JScrollPane scrollPane = new JScrollPane(movieDescription);    
        totalGUI.add(description);
        totalGUI.add(movieDescription);
        totalGUI.add(cancel);
        totalGUI.add(scrollPane);                   
        return totalGUI;
    }


    static void createAndShowGUI() throws IOException
    {

        JFrame.setDefaultLookAndFeelDecorated(true);
        frame = new JFrame("New Movie");
        //Create and set up the content pane.
        AddMovie demo = new AddMovie();
        frame.setContentPane(demo.createContentPane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(515, 520);
        frame.setLocation(480,120);
        frame.setVisible(true);
    }

    public void setVisible(boolean b) {
        // TODO Auto-generated method stub

    }

}

As suggested here and here , a null layout invites trouble. Because your display centers on the description, use the JTextArea constructor that lets you specify a size in rows and columns. When you pack() the enclosing Window , it will be resized to fit the text area. I've added some ad hoc text to illustrate the effect. I've also updated the code to allow the text area to grow when resizing the frame.

图片

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * @see https://stackoverflow.com/a/38282886/230513
 */
public class Test {

    private JPanel createPanel() {
        JPanel panel = new JPanel(new GridLayout());
        //panel.setBorder(BorderFactory.createTitledBorder("Description"));
        JTextArea movieDescription = new JTextArea(10, 20);
        panel.add(new JScrollPane(movieDescription));
        movieDescription.setLineWrap(true);
        movieDescription.setWrapStyleWord(true);
        movieDescription.setText(movieDescription.toString());
        return panel;
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(createPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}
totalGUI.setLayout(null);

There's the 1st problem you should solve: Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or combinations of them along with layout padding and borders for white space .

Besides many other problems, it typically destroys the ability of scroll-panes to do the job they were designed for.

General tips:

  1. There is no attribute named cancel .
  2. Don't override methods like setVisible(boolean) then leave them empty! That is achieving nothing more than breaking functionality that works just fine as it is!
  3. The movieDescription is added to both the totalGUI & the scroll pane. It should only be added to the scroll pane.
  4. A white text area added to a white BG will be invisible except for the caret.
  5. The Tahoma font will only be available in some OS'
  6. Rather than use a JLabel for the description, you might also add the text area to a panel and set the Description text to a TitledBorder used on a panel that the text area is placed in.
  7. Nothing in the two wethods that declare throws IOException could actually cause one.

In the createAndShowGUI method you are creating again a AddMovie object..

so if you modifiy the coda as following, it will work...

Example:

    public class AddMovie extends JTextField {

    private static final long serialVersionUID = 6180900736631578119L;
    private JFrame frame;
    private JLabel description;
    private JTextArea movieDescription;

    public JPanel createContentPane() {

    JPanel totalGUI = new JPanel();
    
    totalGUI.setBackground(Color.WHITE);

    description = new JLabel("Description  ");
    description.setLocation(15, 285);
    description.setSize(120, 25);
    description.setFont(new java.awt.Font("Tahoma", 0, 12));
    movieDescription = new JTextArea();
    movieDescription.setLocation(15, 320);
    movieDescription.setSize(420, 110);

    JScrollPane scrollPane = new JScrollPane(movieDescription);
    totalGUI.add(description);
    totalGUI.add(movieDescription);
    totalGUI.add(scrollPane);

    return totalGUI;
    }

    public void createAndShowGUI() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    frame = new JFrame("New Movie");
    frame.setContentPane(createContentPane());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(515, 520);
    frame.setLocation(480, 120);
    frame.setVisible(true);
    }

    public static void main(String[] args) {
    AddMovie am = new AddMovie();
    am.createAndShowGUI();
    }

}

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