Почему Java JTextArea не получает весь вставленный текст? - PullRequest
3 голосов
/ 09 февраля 2010

Используя инструмент перетаскивания Netbeans 6.8 (версия для Mac) для создания графического интерфейса, я разработал JTextArea, в который пользователь должен вставить свои данные, которые программа изменит, и показать их ему.

Работает нормально; однако когда я попытался вставить около 65 тысяч строк тестовых данных в JTextArea, графический интерфейс показал только несколько из этих строк (например, 50 или менее) ... по какой-то причине он отказался вставить все тестовые данные, которые я скопировал из блокнота.

Я думал, что JTextArea заполнен или что-то в этом роде, но когда я попытался ввести больше текста вручную (после вставки данных тестирования), он набирал текст и отображался в текстовом поле!

Есть идеи, что происходит?


Обновление 001

Я получаю следующую ошибку

Java.lang.OutOfMemoryError: Java heap spaces

Обновление 002

package bossconverter;

import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
 * The application's main frame.
 */
public class BOSSConverterView extends FrameView {

public BOSSConverterView(SingleFrameApplication app) {
    super(app);

    initComponents();

    // status bar initialization - message timeout, idle icon and busy animation, etc
    ResourceMap resourceMap = getResourceMap();
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
    messageTimer = new Timer(messageTimeout, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            statusMessageLabel.setText("");
        }
    });
    messageTimer.setRepeats(false);
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
    for (int i = 0; i < busyIcons.length; i++) {
        busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
    }
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
            statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
        }
    });
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);

    // connecting action tasks to status bar via TaskMonitor
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if ("started".equals(propertyName)) {
                if (!busyIconTimer.isRunning()) {
                    statusAnimationLabel.setIcon(busyIcons[0]);
                    busyIconIndex = 0;
                    busyIconTimer.start();
                }
                progressBar.setVisible(true);
                progressBar.setIndeterminate(true);
            } else if ("done".equals(propertyName)) {
                busyIconTimer.stop();
                statusAnimationLabel.setIcon(idleIcon);
                progressBar.setVisible(false);
                progressBar.setValue(0);
            } else if ("message".equals(propertyName)) {
                String text = (String)(evt.getNewValue());
                statusMessageLabel.setText((text == null) ? "" : text);
                messageTimer.restart();
            } else if ("progress".equals(propertyName)) {
                int value = (Integer)(evt.getNewValue());
                progressBar.setVisible(true);
                progressBar.setIndeterminate(false);
                progressBar.setValue(value);
            }
        }
    });
}

@Action
public void showAboutBox() {
    if (aboutBox == null) {
        JFrame mainFrame = BOSSConverterApp.getApplication().getMainFrame();
        aboutBox = new BOSSConverterAboutBox(mainFrame);
        aboutBox.setLocationRelativeTo(mainFrame);
    }
    BOSSConverterApp.getApplication().show(aboutBox);
}

/** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    mainPanel = new javax.swing.JPanel();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTextArea2 = new javax.swing.JTextArea();
    jButton1 = new javax.swing.JButton();
    menuBar = new javax.swing.JMenuBar();
    javax.swing.JMenu fileMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
    javax.swing.JMenu helpMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
    statusPanel = new javax.swing.JPanel();
    javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
    statusMessageLabel = new javax.swing.JLabel();
    statusAnimationLabel = new javax.swing.JLabel();
    progressBar = new javax.swing.JProgressBar();

    mainPanel.setName("mainPanel"); // NOI18N

    jScrollPane1.setName("jScrollPane1"); // NOI18N

    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jTextArea1.setName("jTextArea1"); // NOI18N
    jScrollPane1.setViewportView(jTextArea1);

    jScrollPane2.setName("jScrollPane2"); // NOI18N

    jTextArea2.setColumns(20);
    jTextArea2.setRows(5);
    jTextArea2.setName("jTextArea2"); // NOI18N
    jScrollPane2.setViewportView(jTextArea2);

    org.jdesktop.application.ResourceMap resourceMap =
                org.jdesktop.application.Application.getInstance
                  (bossconverter.BOSSConverterApp.class).getContext()
                  .getResourceMap(BOSSConverterView.class);
    jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N
    jButton1.setName("jButton1"); // NOI18N
    jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            tester(evt);
        }
    });

    org.jdesktop.layout.GroupLayout mainPanelLayout =
                 new org.jdesktop.layout.GroupLayout(mainPanel);
    mainPanel.setLayout(mainPanelLayout);
    mainPanelLayout.setHorizontalGroup(
        mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(mainPanelLayout.createSequentialGroup()
            .addContainerGap()
            .add(mainPanelLayout.createParallelGroup(org.jdesktop.layout
                                                     .GroupLayout.LEADING)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
                     383, Short.MAX_VALUE)
                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
                     383, Short.MAX_VALUE)
                .add(org.jdesktop.layout.GroupLayout.TRAILING, jButton1))
            .addContainerGap())
    );
    mainPanelLayout.setVerticalGroup(
        mainPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(mainPanelLayout.createSequentialGroup()
            .addContainerGap()
            .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
                 98, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .add(18, 18, 18)
            .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
                 97, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
            .add(jButton1)
            .addContainerGap(22, Short.MAX_VALUE))
    );

    menuBar.setName("menuBar"); // NOI18N

    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
    fileMenu.setName("fileMenu"); // NOI18N

    javax.swing.ActionMap actionMap = org.jdesktop.application.Application
                                      .getInstance(bossconverter.BOSSConverterApp
                                      .class).getContext().getActionMap
                                      (BOSSConverterView.class, this);
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
    exitMenuItem.setName("exitMenuItem"); // NOI18N
    fileMenu.add(exitMenuItem);

    menuBar.add(fileMenu);

    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
    helpMenu.setName("helpMenu"); // NOI18N

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N
    helpMenu.add(aboutMenuItem);

    menuBar.add(helpMenu);

    statusPanel.setName("statusPanel"); // NOI18N

    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

    progressBar.setName("progressBar"); // NOI18N

    org.jdesktop.layout.GroupLayout statusPanelLayout = new org.jdesktop.layout
                                                        .GroupLayout(statusPanel);
    statusPanel.setLayout(statusPanelLayout);
    statusPanelLayout.setHorizontalGroup(
        statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout
                                              .LEADING)
        .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
             423, Short.MAX_VALUE)
        .add(statusPanelLayout.createSequentialGroup()
            .addContainerGap()
            .add(statusMessageLabel)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 227,
                             Short.MAX_VALUE)
            .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
                 org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
                 org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
            .add(statusAnimationLabel)
            .addContainerGap())
    );
    statusPanelLayout.setVerticalGroup(
        statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout
                                              .LEADING)
        .add(statusPanelLayout.createSequentialGroup()
            .add(statusPanelSeparator, org.jdesktop.layout.GroupLayout
                 .PREFERRED_SIZE, 2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED,
                             org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
                             Short.MAX_VALUE)
            .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout
                                                       .GroupLayout.BASELINE)
                .add(statusMessageLabel)
                .add(statusAnimationLabel)
                .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
                     org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
                     org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .add(3, 3, 3))
    );

    setComponent(mainPanel);
    setMenuBar(menuBar);
    setStatusBar(statusPanel);
}// </editor-fold>

private void tester(java.awt.event.MouseEvent evt) {

    Converter converter = new Converter();
    jTextArea2.setText(converter.fixParsedParagraph (jTextArea1.getText()) );
}

// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextArea jTextArea2;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
// End of variables declaration

private final Timer messageTimer;
private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;

private JDialog aboutBox;
}

Это код, который был автоматически сгенерирован netbeans для моего GUI.

Так есть ли что-то, что нужно исправить в этом?

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Виртуальная машина Java принимает два аргумента командной строки, которые устанавливают начальный и максимальный размеры кучи:

-Xms и -Xmx. Например, если вы хотите, чтобы ваша Java-программа имела начальный размер 64 МБ и максимальный размер кучи 256 МБ, вы можете запустить ее следующим образом:

java -Xms64m -Xmx256m my_prog
1 голос
/ 09 февраля 2010

Вот пример, который я сделал, как урок . Имея достаточно места в куче, я могу вставить более 200 000 строк. Возможно, вам не хватает исключения в очереди событий?

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

public class JTextAreaPasteTest {

    private String testStr = "Paste text here.";

    public static void main(String argv[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JTextAreaPasteTest();
            }
        });
    }

    public JTextAreaPasteTest () {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
        PasteArea wrapArea = new PasteArea("Paste text here.");
        frame.setLayout(new FlowLayout());
        frame.add(new JScrollPane(wrapArea));
        frame.pack();
        frame.setVisible(true);
    }

    private static class PasteArea extends JTextArea {

        public PasteArea(String str) {
            super(str, 20, 40);
            this.setLineWrap(true);
            this.setWrapStyleWord(true);
            this.setCaretPosition(str.length());
        }
    }
}
...