Java Swing – 在JTextPane中插入问题的组件

下面给出的程序在点击button上插入一个新的JTextArea。 每次新的TextArea被插入到新行中。 该程序在Linux机器上工作正常,但不在Windows机器上。 在Windows机器上它给我BadLocationException。 任何人都可以告诉我这个问题的解决scheme。 提前致谢。

import javax.swing.JTextArea; import javax.swing.text.BadLocationException; import javax.swing.text.StyledDocument; public class TestPane extends javax.swing.JFrame { /** Creates new form TestPane */ StyledDocument doc = null; public TestPane() { initComponents(); doc = jTextPane1.getStyledDocument(); //BoxLayout messageLayout = new BoxLayout(jScrollPane1,BoxLayout.PAGE_AXIS); //jTextPane1.setLayout(messageLayout); } /** 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() { jButton1 = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); jTextPane1 = new javax.swing.JTextPane(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jScrollPane1.setViewportView(jTextPane1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(164, 164, 164) .addComponent(jButton1)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 286, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1) .addContainerGap(31, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: jTextPane1.insertComponent(new JTextArea("hi this is StackOverflow ")); jTextPane1.revalidate(); insertEmptyLable(); } private void insertEmptyLable() { try { doc.insertString (jTextPane1.getText().length(), "\n", null); } catch (BadLocationException ex) { ex.printStackTrace(); } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new TestPane().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextPane jTextPane1; // End of variables declaration } 

每次actionPerformed()被调用的时候,你真的想要做insertComponent()吗? 我曾经预料过更多这样的事情:

 private void insertMessage() { try { doc.insertString(jTextPane1.getText().length(), "Hi, this is StackOverflow.\n", null); } catch (BadLocationException ex) { ex.printStackTrace(); } } 

附录:比较这与你在同一主题上的上一个问题,你应该考虑是否要在滚动窗格中插入文本文本组件 。 而且,NetBeans的GUI设计器已经相当成熟,但是它并不适合简短的例子。