1

以下の例では、ウィンドウはウィンドウ自体の幅を含むテーブルを表示します。ウィンドウのサイズが変更されると、その幅の値は現在の真実を反映しています。

これはどうしてですか?モデルを再リクエストする必要があることをSwingがどのようにテーブルに通知したか? それとも、モデルが値が変更されたという情報を受け取っているのでしょうか?

public class JTableDynamicUpdate extends JFrame {



private AbstractTableModel tableModel = new AbstractTableModel() {

    private String[] columnNames = new String[] {"Parameter", "Value"};

    public String getColumnName(int column) {
        return columnNames[column];
    };

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if( rowIndex == 0 ) {
            if( columnIndex == 0 ) {
                return "Window width:";
            }
            else if( columnIndex==1) {
                return getSize().width;
            }
        }
        throw new IndexOutOfBoundsException();
    }

};

private JTable table = new JTable(tableModel);

private JScrollPane tableScroll = new JScrollPane(table);

private Container contentPane = getContentPane();
{
    contentPane.setLayout(new BorderLayout());
    contentPane.add(tableScroll, BorderLayout.CENTER);

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}

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

            JTableDynamicUpdate frame = new JTableDynamicUpdate();
            frame.pack();
            frame.setVisible(true);

        }
    });
}
}
4

2 に答える 2

2

JTableは単なるビューであり、値を保持しないことを意味します。Aは、トレース全体を表示できるようにするための例外を生成します。

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException
at TestClass$1.getValueAt(TestClass.java:36)
at javax.swing.JTable.getValueAt(JTable.java:2686)
at javax.swing.JTable.prepareRenderer(JTable.java:5703)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:752)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1491)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1422)
at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
at javax.swing.JComponent.paint(JComponent.java:1015)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
at java.awt.Container.paint(Container.java:1778)
at java.awt.Window.paint(Window.java:3379)

フレームを再ペイントすると、最終的にテーブルの再ペイントがトリガーされます。テーブルモデルは、特定のセルを再描画するために必要な値を取得するために使用されます。

于 2012-10-14T00:31:06.290 に答える
2

getValueAt()この方法でメソッドを変更するだけで、一連のメソッド呼び出しから何が起こっているかを簡単に見つけることができます。

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
        throw new RuntimeException("Trace!");
}
于 2012-10-14T00:42:04.013 に答える