2014-04-20 2 views
0

Я пытаюсь создать собственное диалоговое окно чата для моей программы обмена мгновенными сообщениями. Диалог состоит из отдельного класса с JFrame и несколькими дополнительными свойствами. Я могу создать JFrame и несколько компонентов (кнопка отправки сообщения, текстовое поле для ввода сообщения и прокрутка, которая должна содержать мою JTextPane). К сожалению, JTextPane не будет отображаться, только серый квадрат, в котором находится scrollpane (я предполагаю, что это то, что есть).JTextPane не отображается внутри динамически добавленного JFrame

Вот код для моего пользовательского диалогового окна. пакет мгновенных сообщений;

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.text.Document; 


public class ChatDialogue extends JComponent{ 
private BuddyConversation owner; 


/** COMPONENTS *****************************/ 
private JFrame window; 
private javax.swing.JButton btnSendMessage; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JScrollPane jScrollPane1; 
private javax.swing.JTextPane textMessages; 
private javax.swing.JTextField textNewMessage; 
/*******************************************/ 


public ChatDialogue(String username, BuddyConversation owner){ 
    this.owner = owner; 
    initComponents(username); 
} 
private void btnSendMessageActionPerformed(java.awt.event.ActionEvent evt){ 
    owner.addMessage(textNewMessage.getText()); 
} 
public javax.swing.JTextPane getMessageBox(){ 
    return textMessages; 
} 
private void initComponents(String toUser){ 
    window = new JFrame(); 
    window.setAlwaysOnTop(true); 
    window.setBounds(new java.awt.Rectangle(0, 0, 200, 400)); 
    window.setMaximizedBounds(new java.awt.Rectangle(0, 0, 200, 12312312)); 
    window.setMaximumSize(new java.awt.Dimension(200, 12312312)); 
    window.setMinimumSize(new java.awt.Dimension(200, 375)); 
    window.setTitle("Chat with " + toUser); 

    textMessages = new javax.swing.JTextPane(); 
    jScrollPane1 = new javax.swing.JScrollPane(textMessages); 
    jLabel1 = new javax.swing.JLabel(); 
    textNewMessage = new javax.swing.JTextField(); 
    btnSendMessage = new javax.swing.JButton(); 

    javax.swing.GroupLayout windowLayout = new javax.swing.GroupLayout(window.getContentPane()); 
    window.getContentPane().setLayout(windowLayout); 
    windowLayout.setHorizontalGroup(
     windowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(windowLayout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(windowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jScrollPane1) 
       .addComponent(textNewMessage) 
       .addGroup(windowLayout.createSequentialGroup() 
        .addGroup(windowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addComponent(jLabel1) 
         .addComponent(btnSendMessage)) 
        .addGap(0, 29, Short.MAX_VALUE))) 
      .addContainerGap()) 
    ); 
    windowLayout.setVerticalGroup(
     windowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(windowLayout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(jLabel1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(textNewMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(btnSendMessage) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 
    btnSendMessage.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      btnSendMessageActionPerformed(evt); 
     } 
    }); 
    /** ADD COMPONENTS TO JFRAME ******************************************/ 
    //window.getContentPane().add(jLabel1); 
    //window.getContentPane().add(jScrollPane1); 
    //window.getContentPane().add(textNewMessage); 
    //window.getContentPane().add(btnSendMessage); 
    //window.add(textMessages); 
    /**********************************************************************/ 

    jScrollPane1.setViewportView(textMessages); 

    jLabel1.setText("Put your message her and then hit enter or something or press the button"); 

    btnSendMessage.setText("Send Message"); 

    jScrollPane1.setVisible(true); 
    textMessages.setVisible(true); 
    window.invalidate(); 
    window.repaint(); 
    window.pack(); 
    window.revalidate(); 
    window.setVisible(true); 
    } 
} 

Так прямо сейчас, как я уже говорил, единственное, что проявляется это серый контур, где текст и ScrollPane должен идти. Я сделал дизайн JFrame в редакторе дизайна в своем главном графическом интерфейсе, а затем просто скопировал и вставил автогенерированный код в свой пользовательский класс ...

Код внизу - это просто я возился, пытаясь заставить его работать. Возможно, я мог бы переключить его на обычное текстовое поле или что-то подобное и заставить его работать, но я не могу стоять, не зная, что я делаю неправильно. Помощь будет высоко оценена.

+0

Есть ли причина, почему вы не импортировать большинство классов, которые вы используете? –

+0

Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный и проверенный пример). 'window.setBounds (новый java.awt.Rectangle (0, 0, 200, 400)); Java GUI, возможно, придется работать на нескольких платформах, на разных разрешениях экрана и с использованием разных PLAF. Таким образом, они не способствуют точному размещению компонентов. Чтобы организовать компоненты для надежного графического интерфейса, вместо этого используйте менеджеров компоновки или [их комбинаций] (http://stackoverflow.com/a/5630271/418556), а также макеты и границы для [пробела] (http: //stackoverflow.com/q/17874717/418556). –

+0

См. Также [Должен ли я избегать использования методов метода Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

ответ

0

Указатель Эндрю Томпсона о setBounds - это то, что исправлено для меня. Удаление вызовов setBounds и setMaximumBounds каким-то образом устраняло некоторые проблемы, связанные с конкретной платформой, которые имела моя текстовая панель. Для других людей исходный код явно работал нормально. Благодаря!

+0

Если предложение Эндрю помогло решить проблему, тогда вы должны принять ответ, чтобы сделать комментарий к его ответу. – camickr

1
window.setBounds(new java.awt.Rectangle(0, 0, 200, 400)); 
window.setMaximizedBounds(new java.awt.Rectangle(0, 0, 200, 12312312)); 
window.setMaximumSize(new java.awt.Dimension(200, 12312312)); 
window.setMinimumSize(new java.awt.Dimension(200, 375)); 

См Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

Так выше должно быть (Да.): ​​

window.pack(); 
window.setMinimumSize(window.getSize()); //this is a rare exception to the rule 

Обратите внимание, что рамка будет в конечном итоге на координированных 0,0 (вверху слева) экрана. Для позиционирования кадра вы не можете перейти на setLocationByPlatform(true). См. this answer для демонстрации.

Смежные вопросы