JTable 2列クラスで数値を(#.00)形式で表示するにはどうすればよいですか?

Aug 24 2020

私のJTableモデル

DefaultTableModel modelim = new DefaultTableModel() {
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return Integer.class;
                    case 1:
                        return String.class;
                    case 2:
                        return String.class;
                    case 3:
                        return String.class;
                    case 4:
                        return Date.class;
                    case 5:
                        return Double.class;
                    default:
                        return String.class;
                }
            }
        };

JTableがあります。列5は二重数用です。例えば。

1234.25
177.12
1745.02
1748.10
1899.00

これは5列目の項目です。しかし、プログラムを起動すると、次のようになります。

1234.25
177.12
1745.02
1748.1 //different
1899.0 //different

したがって、ドットの後に少なくとも1つの数字が表示されます。しかし、ドットの後に2つの数字が付いている数字を見たいです。

1748.10
1899.00

このように。必要に応じて、さらにコードを共有できます。

回答

2 MadProgrammer Aug 24 2020 at 16:56

カスタムセルレンダラーを使用します。テーブルの使用方法とカスタムレンダラーの使用を参照してください

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JTable table = new JTable();
            DefaultTableModel modelim = new DefaultTableModel() {
                public Class getColumnClass(int column) {
                    switch (column) {
                        case 0:
                            return Integer.class;
                        case 1:
                            return String.class;
                        case 2:
                            return String.class;
                        case 3:
                            return String.class;
                        case 4:
                            return Date.class;
                        case 5:
                            return Double.class;
                        default:
                            return String.class;
                    }
                }

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

            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 1.234567});
            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 2.345678});
            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 3.456789});
            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 4.567890});
            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 5.678901});
            modelim.addRow(new Object[] {1, "1", "1", "1", new Date(), 6.789012});

            table.setAutoCreateRowSorter(true);
            table.setModel(modelim);
            table.getColumnModel().getColumn(5).setCellRenderer(new DoubleFormatTableCellRenderer());

            add(new JScrollPane(table));
        }

    }

    public class DoubleFormatTableCellRenderer extends DefaultTableCellRenderer {

        private NumberFormat numberFormat;

        public NumberFormat getNumberFormat() {
            if (numberFormat == null) {
                numberFormat = NumberFormat.getNumberInstance();
                numberFormat.setMinimumFractionDigits(2);
                numberFormat.setMaximumFractionDigits(2);
            }
            return numberFormat;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Double) {
                value = getNumberFormat().format(value);
            } 

            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }

    }
}

私は1つを使用します。大丈夫でしたが、数字を並べ替えようとすると正しく並べ替えられません。だから私はそれらを正しくソートするためにダブルカラムクラスを使わなければなりませんでした。しかし、私が二重列クラスを使用した後、数字はこのようになりました

次回は、再現性のある最小限の例を提供します。これにより、すでに行った可能性のある地上での使用が防止されたり、ソリューションが機能しなかった理由がわかります。