Java JTextArea 动态列和行编号
Java JTextArea dynamic column and row numbering
我已经快速 Google 了,但我似乎找不到好的解决方案,主要是因为我不确定如何描述它。
本质上,我需要在 JTextArea
中显示任意数量的十六进制字符,并且我希望它们的间距均匀,并在顶部和左侧显示字符的位置字符。
这是我想要实现的示例,这是十六进制查看器 WinHex。
我一直在尝试将字节数组转换为字符串,然后对其进行文本换行,但我得到了一些奇怪的结果。任何关于如何实现类似目标的建议都将不胜感激。
我考虑过的另一个选择是使用 JTable,但我想知道这是否会使问题稍微复杂化。也许。
谢谢
这应该可以帮助您入门,使用 AbstractTableModel
的一个非常简单的实现。这只花了我 15 分钟的时间来写(回应 "overcomplicating the issue")。
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();
}
}
I've considered is using a JTable, but I'm wondering if that's over complicating the matter slightly
十年前,当我试图理解 JTable 时,我为自己创建了一个简单的十六进制编辑器来尝试理解 table 模型、渲染器和编辑器。
检查 Hex Editor 我的结果。只需解压缩文件并编译所有 java 文件,然后执行 Hex class.
我已经 10 年没看过代码了,所以我不知道我是否遵循了所有最佳编码实践,但无论如何都要玩得开心。
我已经快速 Google 了,但我似乎找不到好的解决方案,主要是因为我不确定如何描述它。
本质上,我需要在 JTextArea
中显示任意数量的十六进制字符,并且我希望它们的间距均匀,并在顶部和左侧显示字符的位置字符。
这是我想要实现的示例,这是十六进制查看器 WinHex。
我一直在尝试将字节数组转换为字符串,然后对其进行文本换行,但我得到了一些奇怪的结果。任何关于如何实现类似目标的建议都将不胜感激。
我考虑过的另一个选择是使用 JTable,但我想知道这是否会使问题稍微复杂化。也许。
谢谢
这应该可以帮助您入门,使用 AbstractTableModel
的一个非常简单的实现。这只花了我 15 分钟的时间来写(回应 "overcomplicating the issue")。
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();
}
}
I've considered is using a JTable, but I'm wondering if that's over complicating the matter slightly
十年前,当我试图理解 JTable 时,我为自己创建了一个简单的十六进制编辑器来尝试理解 table 模型、渲染器和编辑器。
检查 Hex Editor 我的结果。只需解压缩文件并编译所有 java 文件,然后执行 Hex class.
我已经 10 年没看过代码了,所以我不知道我是否遵循了所有最佳编码实践,但无论如何都要玩得开心。