gpt4 book ai didi

java - 欢迎就创建我自己的 Swing 组件提出建议

转载 作者:行者123 更新时间:2023-11-29 08:18:25 24 4
gpt4 key购买 nike

最近 I asked 是绑定(bind)到 BigDecimal 变量(具有一些特定的编辑属性)的最佳 Swing 组件。事实证明,没有一个标准 Swing 组件完全适合我,我在那里找到的第三方 Swing 组件库也不适合。所以我决定创建自己的 Swing 组件。

组件说明:

我想扩展 JTextFieldJFormattedTextField ,以便我的新组件可以轻松绑定(bind)到 BigDecimal 变量。

该组件将具有可自定义的scalelength 属性。

行为:

绘制组件时,它只显示小数点和右边scale 位的空格。

当组件获得焦点时,插入符号应位于小数点左侧。当用户键入数字(忽略任何其他字符)时,它们会出现在插入符号的左侧,只有 lengthscale 数字被接受,任何其他键入的数字都将被忽略,因为整数部分已满。每当用户键入小数点时,插入符号都会移动到小数点的右侧。以下输入的数字显示在小数部分,只有 scale 数字被认为是任何其他输入的数字都将被忽略,因为小数部分已满。此外,千位分隔符应在用户键入小数点后的数字时出现。

我还希望能够将该组件用作 Cell Editor 中的 JTable(无需编写两次代码)。

在组件上调用 getValue() 方法应该产生表示刚刚输入的数字的 BigDecimal。


我从未创建过自己的 Swing 组件;我几乎没用过标准的。因此,我将不胜感激有关创建所描述组件的任何好的教程/信息/提示。 This 是我目前唯一拥有的东西。

提前致谢。

最佳答案

我喜欢 Grouchnikov您引用的文章,但我不确定您是否想要更改 UI 委托(delegate)。因为这将是一个不可变对象(immutable对象)的 View ,所以我更喜欢组合而不是继承。我倾向于认为您描述的组件是 renderer , 如本 example 所示.您可以添加 InputVerifierDocumwntListener以获得您想要的验证。

附录:这是一个使用 JFormattedTextFieldMaskFormatter 的示例.您需要调整格式掩码以匹配您的比例和长度。

public class TableGrid extends JPanel {

private DecimalFormat df;
private MaskFormatter mf;
private JFormattedTextField tf;

public TableGrid() {
df = new DecimalFormat("0.00");
try {
mf = new MaskFormatter("#.##");
} catch (ParseException ex) {
ex.printStackTrace();
}
tf = new JFormattedTextField(mf);
TableModel dataModel = new TableModel();
JTable table = new JTable(dataModel);
table.setCellSelectionEnabled(true);
table.setRowHeight(32);
table.setDefaultRenderer(BigDecimal.class, new DecRenderer(df));
table.setDefaultEditor(BigDecimal.class, new DecEditor(tf, df));
this.add(table);
}

private static class TableModel extends AbstractTableModel {

private static final int SIZE = 4;
private BigDecimal[][] matrix = new BigDecimal[SIZE][SIZE];

public TableModel() {
for (Object[] row : matrix) {
Arrays.fill(row, BigDecimal.valueOf(0));
}
}

@Override
public int getRowCount() {
return SIZE;
}

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

@Override
public Object getValueAt(int row, int col) {
return matrix[row][col];
}

@Override
public void setValueAt(Object value, int row, int col) {
matrix[row][col] = (BigDecimal) value;
}

@Override
public Class<?> getColumnClass(int col) {
return BigDecimal.class;
}

@Override
public boolean isCellEditable(int row, int col) {
return true;
}
}

private static class DecRenderer extends DefaultTableCellRenderer {

DecimalFormat df;

public DecRenderer(DecimalFormat df) {
this.df = df;
this.setHorizontalAlignment(JLabel.CENTER);
this.setBackground(Color.lightGray);
this.df.setParseBigDecimal(true);
}

@Override
protected void setValue(Object value) {
setText((value == null) ? "" : df.format(value));
}
}

private static class DecEditor extends DefaultCellEditor {

private JFormattedTextField tf;
private DecimalFormat df;

public DecEditor(JFormattedTextField tf, DecimalFormat df) {
super(tf);
this.tf = tf;
this.df = df;
tf.setHorizontalAlignment(JFormattedTextField.CENTER);
}

@Override
public Object getCellEditorValue() {
try {
return new BigDecimal(tf.getText());
} catch (NumberFormatException e) {
return BigDecimal.valueOf(0);
}
}

@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
tf.setText((value == null) ? "" : df.format((BigDecimal) value));
if (isSelected) tf.selectAll();
return tf;
}
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
JFrame f = new JFrame("TableGrid");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new TableGrid());
f.pack();
f.setVisible(true);
}
});
}
}

关于java - 欢迎就创建我自己的 Swing 组件提出建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com