2014-05-17 36 views
2

我在JTextPane中顯示ANSI art時遇到問題。Java - 如何在JTextPane中正確顯示ANSI藝術品

我想簡單地艇員選拔固定寬度或寬字體,並經由SimpleAttributeSet除去JTextPaneStyledDocument的線間距將足以正確顯示some different pieces of ANSI art,但嘗試不同的字體和設置後,我意識到它必須是比那更多的。

我一直在使用​​來比較我的JTextPane以查看我的代碼是否正確顯示the piece of digital art

我的JTextPane字體設置爲相同的字體DAMN NFO查看器是使用(根據其設置信使新建,8,默認情況下)通過artTextPane.setFont(new java.awt.Font("Courier New", 0, 8))。但是,即使我通過StyledDocument.setParagraphAttributes(int, int, AttributeSet, boolean)應用行間距設置,我的JTextPane也不能正確顯示作品。 下面是兩個截圖顯示的差異:

該死的NFO查看器(宋體,8):

DAMN NFO Viewer Courier New 8

JTextPane(宋體8)

JTextPane Courier New 8

真奇怪的是,當我設置我的JTextPane的字體大小爲9,對齊似乎是正確的,但有點不清晰。變焦到形成所述在本領域件中的字符顯示青色像素的權利,使之看起來不鮮明:

JTextPane(速遞新9)

JTextPane Courier New 9

另外我注意到在記事本中打開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 

這讓我覺得它可能會使用衍生版本快遞新建,設置爲"FontData"=hex:91,00,03,01。但是我不知道如何重現Java中的派生。

有沒有人能告訴我我在做什麼錯嘗試以相同的方式顯示JTextPane中的文本文件DAMN NFO Viewer這樣做嗎?

編輯: 相加得到顯示的是我目前的工作,嘗試一些測試/例子代碼的字體「正確」(在不污損ANSI藝術的方式)。我使用NetBeans IDE的內置GUI生成器「Mantisse」創建了此測試GUI,因此它可能不是一個完美的示例,但它應該清楚地顯示與DAMN NFO Viewer的屏幕截圖不同。

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觀察到的藍色模糊可能是由抗鋸齒造成的。

你的代碼將呈現這樣與MacOS X上的Java 1.7.0_55-B13: Original rendering

隨着JTextPane中,可以減少行間距如下(主叫JTextPane.setText前):

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'其實是非常有用擺脫上不同大小的「宋體」的occure字符之間的小縫隙,但使用它我仍然無法重現的字體看起來該死的NFO瀏覽器。我會做更多的測試,並用更多的信息更新問題。 – phew

+0

呵呵,我剛纔注意到,從* .nfo文件複製藝術品時,在記事本++中有特殊字符顯示爲'[BEL]',這會在將正面尺寸從9改爲其他任何東西時污損藝術品。用空白替換它們後,可以顯示不同的大小,而不會污損。我將運行更多的測試,我想我現在可以使用你的'TRACKING'建議。 – phew