简体   繁体   English

如何将文本添加到 JTextArea

[英]How to Add text to JTextArea

Im creating a programme using java.我使用java创建了一个程序。 I want the user to enter some text, then push the button so the text entered shows in the label.我希望用户输入一些文本,然后按下按钮,以便输入的文本显示在标签中。 However, I have 2 problems.但是,我有两个问题。 First, the text are isn´t displaying when I execute the app.首先,当我执行应用程序时没有显示文本。 Second, I don´t know how to allow the user to type in the area.其次,我不知道如何允许用户输入该区域。 Im new in java so that´s why Im asking.我是 Java 新手,这就是我问的原因。 Here is the code.这是代码。 Thank you.谢谢你。

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



class Boton extends JFrame implements ActionListener {
    JButton boton;
    JTextArea textArea = new JTextArea();
    JLabel etiqueta = new JLabel();


    public Boton() {
        setLayout(null);
        boton = new JButton("Escribir");
        boton.setBounds(100, 150, 100, 30);
        boton.addActionListener(this);
        add(boton);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == boton) {
            try {
                String texto = textArea.getText();
                etiqueta.setText(texto);
                Thread.sleep(3000);
                System.exit(0);
            } catch (Exception excep) {
                System.exit(0);
            }
        }
    }
}

public class Main{
    public static void main(String[] ar) {
        Boton boton1 =new Boton();
        boton1.setBounds(0,0,450,350);
        boton1.setVisible(true);
        boton1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Problems:问题:

  1. You never add the JTextArea into your GUI, and if it doesn't show, a user cannot directly interact with it.您永远不会将 JTextArea 添加到您的 GUI 中,如果它没有显示,用户将无法直接与其交互。
  2. You are calling Thread.sleep on the Swing event thread, and this will put the entire application to sleep, meaning the text that you added will not show.您正在 Swing 事件线程上调用Thread.sleep ,这将使整个应用程序进入睡眠状态,这意味着您添加的文本将不会显示。
  3. Other issues include use of null layouts and setBounds -- avoid doing this.其他问题包括使用空布局和 setBounds——避免这样做。

Solutions:解决方案:

  1. Set the JTextArea's column and row properties so that it sizes well.设置 JTextArea 的列和行属性,使其大小合适。
  2. Since your JTextArea's text is going into a JLabel, a component that only allows a single line of text, I wonder if you should be using a JTextArea at all.由于您的 JTextArea 的文本将进入 JLabel,这是一个仅允许一行文本的组件,我想知道您是否应该使用 JTextArea。 Perhaps a JTextField would work better since it allows user input but only one line of text.也许 JTextField 会更好地工作,因为它允许用户输入但只允许一行文本。
  3. Add the JTextArea to a JScrollPane (its viewport actually) and add that to your GUI.将 JTextArea 添加到 JScrollPane(实际上是它的视口)并将其添加到您的 GUI。 Then the user can interact directly with it.然后用户可以直接与之交互。 This is most easily done by passing the JTextArea into a JScrollPane's constructor.这最容易通过将 JTextArea 传递到 JScrollPane 的构造函数来完成。
  4. Get rid of the Thread.sleep and instead, if you want to use a delay, use a Swing Timer.摆脱Thread.sleep ,如果您想使用延迟,请使用 Swing Timer。 check out the tutorialhere这里查看教程

For example:例如:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.KeyEvent; 
import javax.swing.*;

public class Main2 {
    public static void main(String[] args) {
        // create GUI in a thread-safe manner
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        BotonExample mainPanel = new BotonExample();
        JFrame frame = new JFrame("GUI");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

class BotonExample extends JPanel {
    private JLabel etiqueta = new JLabel(" ");
    private JButton boton = new JButton("Escribir");
    
    // jtext area rows and column properties
    private int rows = 5;
    private int columns = 30;
    private JTextArea textArea = new JTextArea(rows, columns);
    
    public BotonExample() {
        // alt-e will activate button
        boton.setMnemonic(KeyEvent.VK_E);
        boton.addActionListener(e -> {
            boton.setEnabled(false); // prevent button from re-activating
            String text = textArea.getText();
            etiqueta.setText(text);
            
            // delay for timer
            int delay = 3000;
            Timer timer = new Timer(delay, e2 -> {
                // get current window and dispose ofit
                Window window = SwingUtilities.getWindowAncestor(boton);
                window.dispose();
            });
            timer.setRepeats(false);
            timer.start();  // start timer
        });
        
        // create JPanels to add to GUI
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
        topPanel.add(new JLabel("Etiqueta:"));
        topPanel.add(etiqueta);
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(boton);
        
        JScrollPane scrollPane = new JScrollPane(textArea);
        
        // use layout manager and add components
        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(scrollPane, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
        
    }
}
textarea.setText("Text");  // this will insert text into the text area
textarea.setVisable(true); // this will display the text area so you can type in it
textarea.setSize(500,500); // set size of the textarea so it actually shows

The user should be able to type in the TA when it is displayed and just do a getText to pull the text用户应该能够在显示时输入 TA 并执行getText来提取文本

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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