2013-01-10 99 views
1

我想用Swing設計聊天界面,但我太笨了,無法弄清楚如何爲消息部分做適當的縮進。使用Swing設計聊天佈局

這裏是什麼我的例子後: http://xchat.org/docs/start/xchat-3-channel.png

這裏就是我剛剛砍死在一起(只是複製和粘貼):

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

public class Scrap { 

private static final int NICK_INDENT = 120; 
private static final int MESSAGE_INDENT = NICK_INDENT + 10; 

private static boolean applyHangingIndent = false; 

public static void main(final String args[]) { 
    StyledDocument doc = new DefaultStyledDocument(); 
    JTextPane pane = new JTextPane(doc) { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.BLACK); 
      g.drawLine(NICK_INDENT + 5, 0, NICK_INDENT + 5, getHeight()); 
     } 
    }; 

    TabStop[] tabs = new TabStop[2]; 
    tabs[0] = new TabStop(NICK_INDENT, TabStop.ALIGN_RIGHT, TabStop.LEAD_NONE); 
    tabs[1] = new TabStop(MESSAGE_INDENT, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE); 
    TabSet tabset = new TabSet(tabs); 

    StyleContext sc = StyleContext.getDefaultStyleContext(); 
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.TabSet, tabset); 
    pane.setParagraphAttributes(aset, false); 

    insertString(doc, "\ta nickname:\tthis is the message blaa blaa blaa\n"); 

    if (applyHangingIndent) { 
     applyHangingIndent(doc); 
    } 

    insertString(doc, "\tanother nickname:\there is another message blaa blaa blaablaa, try to resize the window\n"); 

    if (applyHangingIndent) { 
     applyHangingIndent(doc); 
    } 

    insertString(doc, "\ta third nickname:\tnow try to set the applyHangingIndent to true!\n"); 

    if (applyHangingIndent) { 
     applyHangingIndent(doc); 
    } 

    JFrame frame = new JFrame(); 
    frame.setContentPane(new JScrollPane(pane)); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setSize(600, 300); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

private static void insertString(StyledDocument doc, String str) { 
    try { 
     doc.insertString(doc.getLength(), str, null); 
    } catch (BadLocationException e) { 
     e.printStackTrace(); 
    } 
} 

private static void applyHangingIndent(StyledDocument doc) { 
    SimpleAttributeSet sas = new SimpleAttributeSet(); 
    int indent = MESSAGE_INDENT; 
    StyleConstants.setFirstLineIndent(sas, -indent); 
    StyleConstants.setLeftIndent(sas, indent); 
    doc.setParagraphAttributes(0, doc.getLength(), sas, false); 
} 
} 

嘗試將窗口大小調整爲更小的尺寸。

現在,嘗試將applyHangingIndent設置爲true並再次調整大小。

在我看來,代碼應該沒問題,但負面的第一行indent屬性似乎不適用於tabstops。

任何人有想法如何使縮進工作正常嗎?

回答

3

我會推薦另一種方法 - 基於表。

請參閱示例http://java-sl.com/JEditorPaneTables.html和此http://java-sl.com/JEditorPaneTablesRowColumnInsert.html 您可以根據需要(針對每條消息)定義一個包含2列和多行的表。

第一個單元格包含暱稱,第二個單元格包含消息。您可以根據需要調整單元格的內容(實際上是正常的段落)。你也可以定義任何想要的邊框來渲染或不爲列/行。

+0

這看起來確實會滿足我的需求,我會開始試驗你的代碼。謝謝! – n00bster

+0

好吧,經過幾天的編碼,我得到了一切按照我的意圖工作。再次感謝您創造這些聰明的桌子! – n00bster

+0

你可以添加一個用兩行創建表的示例代碼嗎?我完全迷失在推薦的代碼中。 –