2010-02-19 55 views
1

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

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 
} 
+0

你能后的堆栈跟踪? – trashgod 2010-02-19 12:22:19

回答

1

你真的是每次actionPerformed()insertComponent()被调用?我会期待更多的东西是这样的:

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

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