2015-01-26 91 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