【问题标题】:problems with java layout managerjava布局管理器的问题
【发布时间】:2018-06-08 12:13:27
【问题描述】:

我正在构建小型聊天程序,我想要的是在不同的侧面显示每条消息。

例如:左侧是我的消息,右侧是其他用户的消息。

我写了这段代码:

public final class ChatPanel extends javax.swing.JPanel {

private javax.swing.JPanel main_panel;

public ChatPanel() {
  main_panel = new javax.swing.JPanel();
  main_panel.setLayout(new javax.swing.BoxLayout(main_panel, javax.swing.BoxLayout.Y_AXIS));
  main_panel.setBackground(java.awt.Color.green);
  //add_message("Hello\n\n\nha", true);
  //add_message("Hello", false);
  javax.swing.JScrollPane pane = new javax.swing.JScrollPane(main_panel);
  pane.setPreferredSize(new java.awt.Dimension(433, 213));
  add(pane);
  repaint();
}

public void add_system_message(String message) {
  javax.swing.JTextPane message_area = new javax.swing.JTextPane();
  message_area.setAlignmentX(javax.swing.JLabel.CENTER_ALIGNMENT);
  javax.swing.text.SimpleAttributeSet center = new javax.swing.text.SimpleAttributeSet();
  javax.swing.text.StyleConstants.setAlignment(center, javax.swing.text.StyleConstants.ALIGN_CENTER);

  javax.swing.text.SimpleAttributeSet black = new javax.swing.text.SimpleAttributeSet();
  javax.swing.text.StyleConstants.setForeground(black, java.awt.Color.BLACK);

  javax.swing.text.StyledDocument doc = message_area.getStyledDocument();

  try {
     doc.insertString(doc.getLength(), message, black);
     doc.setParagraphAttributes(doc.getLength(), 1, center, false);
  } catch (javax.swing.text.BadLocationException e) {
     System.err.println("ERROR:\n\t" + e.getMessage());
  }
  main_panel.add(message_area);
  main_panel.repaint();
}

public void add_message(String message, boolean is_main_user) {
  javax.swing.JTextArea stam = new javax.swing.JTextArea(message);
  stam.setWrapStyleWord(true);
  stam.setLineWrap(true);
  stam.setEditable(false);
  if (is_main_user) {
     stam.setAlignmentX(javax.swing.JLabel.LEFT_ALIGNMENT);
  } else {
     stam.setAlignmentX(javax.swing.JLabel.RIGHT_ALIGNMENT);
  }
  stam.setBorder(javax.swing.BorderFactory.createMatteBorder(3, 3, 3, 3, java.awt.Color.red));
  main_panel.add(stam);
  main_panel.repaint();
  repaint();
}
}

当我在构造函数中调用add_message("Hello", false); 时它工作正常,但是当我从按钮(在另一个面板中)调用此函数时,它不会添加消息。

为什么会这样¿

附言 我通常不使用布局管理器,只使用 netbeans GUI 构建器。

【问题讨论】:

  • 欢迎您在上一个关于该主题的问题中获得帮助,我建议您可以在 JTextPane 中使用属性。但是你删除了这个问题,甚至没有一个简单的“谢谢你”的帮助。应在原始问题中提出后续问题,以便每个人都知道建议的内容。所以这次我不会费心帮忙了,因为你可能会再次删除答案。
  • 我在评论里写了谢谢
  • 我没有看到任何评论??
  • 您最初删除了问题,只是取消了删除。在我在上面发表评论之后,你刚刚在 11 分钟前添加了评论。而且您仍然没有“接受”甚至认为向您展示了如何解决问题的答案。
  • 除非他的目标是说服大多数人不要回答他未来的任何问题。

标签: java swing layout layout-manager


【解决方案1】:

您需要在repaint() 调用之前添加main_panel.revalidate(); 以指示Swing 布局管理器重新布局新添加的组件。

【讨论】:

  • 非常感谢@tsolakp 的快速回答,它奏效了☺ 顺便问一下,您是否知道我是否可以在添加的组件之间创建一些间隙¿ 再次感谢您☻
  • 您可以在添加文本字段后尝试添加固定大小的框支柱。在main_panel.add(message_area); 之后添加main_panel.add( Box.createVerticalStrut(10) );
  • 实际上顺序应该是revalidate()(调用布局管理器),然后是repaint(),以确保正确重绘组件。
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多