2014-05-17 3 views
2

JTextPaneANSI art을 표시하는 데 문제가 있습니다.Java - JTextPane에서 ANSI 아트를 올바르게 표시하는 방법

나는 생각 단순히 고정 폭 또는 고정 폭 글꼴을 chosing과 SimpleAttributeSet를 통해 JTextPaneStyledDocument의 라인 간격을 제거하는 것은 제대로 some different pieces of ANSI art를 표시하기에 충분하지만, 다른 글꼴과 설정을 시도한 후 나는 그것이이어야한다 깨달았다 것 그 이상.

the piece of digital art이 올바르게 표시되는지 확인하기 위해 DAMN NFO Viewer을 사용하여 JTextPane을 비교했습니다.

나는 NFO 뷰어 artTextPane.setFont(new java.awt.Font("Courier New", 0, 8))를 통해 (해당 설정 기본적으로 택배 새로운 8에 따라)를 사용하는 것과 동일한 글꼴 빌어 먹을에 JTextPane 글꼴을 설정합니다. 그러나 StyledDocument.setParagraphAttributes(int, int, AttributeSet, boolean)을 통해 줄 간격 설정을 적용하더라도 내 JTextPane에 아트가 올바르게 표시되지 않습니다.

빌어 먹을 NFO 뷰어 (택배 새로운, 8) :

DAMN NFO Viewer Courier New 8

JTextPane (택배 새로운 8) :

JTextPane Courier New 8 다음은 차이를 보여 두 스크린 샷입니다

정말 이상한 것은 내가있을 때입니다. 내 JTextPane의 font-size를 9로 설정하면 정렬이 정확하지만 약간 언뜻 보입니다.

JTextPane (택배 새로운 9) : 또한

JTextPane Courier New 9

예술 작품의 g 형성 문자로 확대하면이 날카롭지 보이게 오른쪽 파란 화소를 도시 메모장에 art.txt을 열면 DAMN NFO Viewer와 마찬가지로 표시됩니다. 또한 JTextPane은 문자가 그려지는 '작은 상자'가 더 작게 표시되는 것처럼 작게 표시되는 것 같습니다.

먼저 나는 빌어 먹을 NFO 뷰어 글꼴 택배 새로운의 다른 버전을 사용하고 생각했다, 그래서 나는 그것의 디렉토리를 파고 다음 레지스트리 파일을 찾을 수 :

[HKEY_CURRENT_USER\Software\DAMN\DAMN NFO Viewer\NFO] 
"FontName"="[built-in] Courier New" 
"FontData"=hex:91,00,03,01 
"Window"=dword:00000023 
"BackgroundColor"=hex:ff,ff,ff,00 
"TextColor"=hex:00,00,00,00 
"HyperLinkColor"=hex:bf,cd,db,00 
"HyperLinkHoverColor"=hex:99,b4,d1,00 
"Text"=dword:00000400 

나 그것을 사용할 수 있습니다 생각하게 파생 버전은 Courier New이고 설정은 "FontData"=hex:91,00,03,01입니다. 그러나 Java에서 그 파생어를 재현하는 방법을 모릅니다.

누구나 내가 잘못하고있는 내용을 JTextPane에 텍스트 파일을 표시하려고 시도하고 있다고 말할 수 있습니까? DAMN NFO 뷰어?

편집 : 추가 된 나는 현재 노력하고, 함께 일하고 몇 가지 테스트/예제 코드 글꼴합니다 (ANSI 아트를 훼손하지 않는 방식으로) "제대로"표시하려면 . NetBeans IDE의 내장 GUI 빌더 "Mantisse"를 사용하여이 테스트 GUI를 만들었으므로 완벽한 예제는 아니지만 DAMN NFO 뷰어의 스크린 샷과의 차이점을 분명히 보여 주어야합니다.

package jtextpanetest; 

public class JTextPaneTestUI extends javax.swing.JFrame { 

/** 
* Creates new form JTextPaneTestUI 
*/ 
public JTextPaneTestUI() { 
    initComponents(); 
} 

/** 
* 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() { 

    scrollPane = new javax.swing.JScrollPane(); 
    panel = new javax.swing.JPanel(); 
    textPanesSrollPane = new javax.swing.JScrollPane(); 
    textPane = new javax.swing.JTextPane(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    panel.setLayout(new java.awt.BorderLayout()); 

    textPane.setFont(new java.awt.Font("Courier New", 0, 8)); // NOI18N 
    textPane.setText("▀▀▀▀▀▀▀▀▀▄▄▄▄\n███████▄▄▄▄ ▀▀▀▄▄\n▄ ▀█▓█████████▄▄ ▀▀█▄\n █ ▓█▓▄ ▀▀█▓███▓▄ ██\n █ ▒▓▒▓ ▒█▓█▒▓ █▓█\n █ ░▒░▒█ █ ░▓▒▓░▒█ █▒▓█\n █ ░░░░▓ █ ░▒░▒░░▓ ▓░▒█\n █ ▒░▒░▒ █ ▒░░░▒░▒ ▒░░█\n █ ▓▒▓▒░ █ ▓░▒░▓▒░ ░▒░█\n █ █▓█▓▀ █ █▒▓▒█▓░ ░▓▒█\n █ ██▀ ▄▀█ █▓█▓██ ▒██\n █ █ ▄▀▄█ █████▀ ▓█\n ░ █ ░ █ ▄██▀▀ ▄▄█ █░\n ▒▄▄▄▒ ░▄▄▄▄▄▀▀ █ █\n   █ ██▀ ▄▀     \n   █ █▌▄▀ \n   ░ █ █     \n   ▒▄▄▄░ \n\n █████████\n███████████\n███████████\n███████████\n█████ █████\n█████ █████\n█████ █████\n█████ █████\n█████ █████\n███████████\n███████████\n ██████████\n  ██████\n███████████\n██████████  "); 
    textPanesSrollPane.setViewportView(textPane); 

    panel.add(textPanesSrollPane, java.awt.BorderLayout.CENTER); 

    scrollPane.setViewportView(panel); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 
    ); 

    pack(); 
}// </editor-fold>       

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(JTextPaneTestUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new JTextPaneTestUI().setVisible(true); 
     } 
    }); 
} 


private javax.swing.JPanel panel; 
private javax.swing.JScrollPane scrollPane; 
private javax.swing.JTextPane textPane; 
private javax.swing.JScrollPane textPanesSrollPane; 

} 

EDIT2 : 누군가가 이미지로 예술을 렌더링하기 위해 나에게 제안,하지만 내가 추측 옵션을 선택하지 않습니다 그래서 나는 그것이 편집 할 필요가있다. 모든 힌트를 부탁드립니다!

답변

3

여기서 중요한 문제는 JTextPane의 텍스트가 줄 사이에 너무 많은 공간으로 렌더링된다는 것입니다. 다른 위젯에서도 같은 문제가 발생합니다. 실제 간격은 글꼴 (따라서 JVM)에 따라 다릅니다. Courier 9에서 관찰 할 수있는 파란색 흐림 효과는 앤티 앨리어싱 때문일 수 있습니다.

귀하의 코드는 자바 맥 OS X에 대한 1.7.0_55-B13와 같은 렌더링 : (JTextPane.setText를 호출하기 전에) 다음과 같이 JTextPane가와 Original rendering

, 당신은 줄 간격을 줄일 수

javax.swing.text.MutableAttributeSet set = new javax.swing.text.SimpleAttributeSet(textPane.getParagraphAttributes()); 
javax.swing.text.StyleConstants.setLineSpacing(set, (float)-0.1); 
textPane.setParagraphAttributes(set, false); 

-0.1 값은 줄 간격을 수정하므로 다른 글꼴이나 글꼴 크기에 다른 값이 필요할 수 있습니다.

Removed space between lines

당신은뿐만 아니라 추적 (문자 사이의 공간)을 줄여야 할 수 있습니다 :

java.awt.Font font = new java.awt.Font("Courier New", 0, 8); 
java.util.Map<java.awt.font.TextAttribute, Object> attributes = new java.util.HashMap<java.awt.font.TextAttribute, Object>(); 
attributes.put(java.awt.font.TextAttribute.TRACKING, -0.1); 
java.awt.Font font2 = font.deriveFont(attributes); 
textPane.setFont(font2); 

Rendering with tracking

+0

내가 이미 사용하여 줄 간격을 설정 한 한'StyleConstants.setLineSpacing을() '을 사용하여 예술의 흐릿하고 선명하지 않은 표시가 나타나고 특정 글꼴 (Courier New)의 모든 크기 (9에서 16 사이)에 대한 줄 간격을 제거하지 않았습니다. 어쩌면 주어진 글꼴의 크기에 따라 다른 간격 값을 추가해야합니까? 여유 시간을 찾았을 때 추적을 추가해보고 결과를 알려 드리겠습니다. – phew

+0

'TextAttribute.TRACKING'은 "Courier New"의 크기가 다른 문자들 사이의 작은 간격을 없애기 위해 실제로 유용합니다. 그러나 그것을 사용하여 여전히 DAMN NFO Viewer에서 글꼴 모양을 재현 할 수 없었습니다. 더 많은 테스트를하고 더 많은 정보로 질문을 업데이트 할 것입니다. – phew

+0

아, 나는 방금 * .nfo 파일에서 아트를 복사 할 때 메모장 ++에 '[BEL]'로 표시된 특수 문자가 있음을 알아 차렸습니다. 앞면 크기를 9에서 다른 것으로 변경하면 아트가 손상됩니다. 이들을 공백으로 바꾸면 훼손되지 않고 크기를 다르게 표시 할 수 있습니다. 나는 더 많은 테스트를 할 것이고, 나는 당신의 제안을 '추적 (TRACKING)'과 함께 사용하여 지금 일할 수있을 것이라고 생각한다. – phew

관련 문제