2013-01-10 3 views
1

스윙을 사용하여 채팅 UI를 디자인하려고하지만 메시지 부분에 적절한 들여 쓰기를 수행하는 방법이 너무 어리 석다. 후 여기에 스윙을 이용한 채팅 레이아웃 디자인

가 난 무엇의 예 : 여기 http://xchat.org/docs/start/xchat-3-channel.png

난 그냥 함께 해킹 무엇을 (그냥 복사 및 붙여 넣기) : A와 창 크기를 조정하는

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로 설정하고 다시 크기를 조정하십시오.

하지만 내 첫 번째 줄 들여 쓰기 속성이 탭 스톱과 함께 작동하지 않는 것 같습니다.

누구나 들여 쓰기가 올바르게 작동하도록하는 방법에 대한 아이디어가 있습니까?

답변

3

테이블 기반의 다른 접근 방식을 권장합니다.

예를 참조하십시오. http://java-sl.com/JEditorPaneTablesRowColumnInsert.html 필요에 따라 (각 메시지에 대해) 2 열과 행이있는 테이블을 정의 할 수 있습니다.

첫 번째 셀에는 닉네임이 있고 두 번째 셀에는 닉네임이 들어 있으며 두 번째 셀에는 메시지가 있습니다. 원하는대로 셀 내용을 정렬 할 수 있습니다 (사실 단락). 또한 열/행에 대해 렌더링 할 테두리를 정의 할 수 있습니다.

+0

내 요구 사항에 잘 맞을 것 같아서 코드를 실험 해 보겠습니다. 감사! – n00bster

+0

좋아요, 며칠 동안 코딩을 한 후 의도 한대로 모든 작업을 처리했습니다. 이 영리한 테이블을 만들어 주셔서 다시 한 번 감사드립니다! – n00bster

+0

두 행이있는 표를 만들기위한 예제 코드를 추가 할 수 있습니까? 나는 완전히 언급 된 코드에서 길을 잃었다. –