2015-01-26 80 views
2

我有一個快速的谷歌周圍,我似乎無法找到一個很好的解決方案,主要是因爲我不知道如何描述它。Java JTextArea動態列和行編號

本質上,我需要在JTextArea中顯示任意數量的十六進制字符,並且我希望它們的間隔均勻,並且字符的頂部和左側顯示字符的位置。

這是我想實現的一個例子,這是十六進制查看器WinHex。

enter image description here

我一直在用的字節數組轉換爲字符串玩耍,然後文字環繞它,但我有一些奇怪的結果。任何建議如何實現類似的東西將不勝感激。

我考慮過的另一個選擇是使用JTable,但我想知道這是否會使事情稍微複雜化。也許。

感謝

+4

沒有,用一個JTable,試圖用一個JTextArea要做到這一點是過於複雜 – MadProgrammer 2015-01-26 19:28:47

回答

4

這應該讓你開始,用非常簡單的實現的AbstractTableModel。這隻花了我15分鐘的時間來撰寫(以迴應「過度複雜的問題」)。

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

public class HexText extends JFrame { 
    public static void main(String... args) { 
    final HexText window = new HexText(); 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     window.setVisible(true); 
     } 
    }); 
    } 

    private static class HexTableModel extends AbstractTableModel { 
    List<Integer> data = new ArrayList<>(); 

    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 

    @Override 
    public int getColumnCount() { 
     return 9; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     if (columnIndex == 0) { 
     return Integer.toHexString(rowIndex << 5); 
     } else { 
     int row = data.get(rowIndex); 
     int theByte = 0xFF & (row >> (columnIndex * 2)); 
     String output = Integer.toHexString(theByte); 
     if (output.length() == 1) 
      output = "0" + output; 
     return output; 
     } 
    } 

    public void addRow(int rowElement) { 
     data.add(rowElement); 

     fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 
    } 

    public HexText() { 
    JPanel contentPane = new JPanel(new BorderLayout()); 

    HexTableModel theModel = new HexTableModel(); 

    JTable theTable = new JTable(theModel); 

    Random r = new Random(); 

    for (int i = 0; i < 20; i++) { 
     theModel.addRow(r.nextInt()); 
    } 

    contentPane.add(theTable, BorderLayout.CENTER); 
    this.add(theTable); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.pack(); 
    } 
} 

Screenshot

4

我認爲是使用一個JTable,但我想知道,如果這是在稍微

十年前,這個問題複雜化,當我試圖瞭解JTable我自己創建了一個簡單的十六進制編輯器來嘗試理解表模型,渲染器和編輯器。

檢查出Hex Editor爲我的結果。只需解壓縮文件並編譯所有的java文件,然後執行Hex類。

我還沒有看過10年的代碼,所以我不知道我是否遵循了所有最好的編碼實踐,但無論如何都很有趣。

Hex Viewer

+0

非常感謝。我現在去看看。 – Tony 2015-01-27 09:29:49