Swing - 更改表模型重置渲染器。为什么呢?

时间:2017-02-28 08:17:16

标签: java swing jtable

我的SSCCE:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class Renderer_Model_LookAndFeel extends JFrame {
    public Renderer_Model_LookAndFeel() {
        begin();
    }

    private void begin() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        Object[][] data = new Object[4][4];
        Object[] title = new Object[] {"Name", "Gender", "Age", "Prof."};

        JTable table = new JTable(new DefaultTableModel(data, title));

        for (int i=0; i<4; i++) {
            for (int j=0; j<4; j++) {
                data[i][j] = "Tom"; 
            }
        }


        //SET RENDERER
        DefaultTableCellRenderer r = new DefaultTableCellRenderer();
        r.setHorizontalAlignment(SwingConstants.RIGHT);
        table.getColumnModel().getColumn(2).setCellRenderer(r);

        table.setModel(new DefaultTableModel(data, title));

        table.setPreferredScrollableViewportSize(new Dimension(500, 300));

        JScrollPane sp = new JScrollPane(table);
        sp.setBounds(0, 0, 600, 400);
        getContentPane().add(sp);
        pack();
        setVisible(true);
    }

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

            @Override
            public void run() {
                Renderer_Model_LookAndFeel frame = new Renderer_Model_LookAndFeel();

            }

        });
    }
}

密钥按以下行的顺序排列:

table.setModel(new DefaultTableModel(data, title));

DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(SwingConstants.RIGHT);
table.getColumnModel().getColumn(2).setCellRenderer(r);

如果我先设置模型然后更改列渲染器,则第三列将右对齐。但是,如果我首先设置渲染器然后更改模型,渲染器将重置为null,然后尊重默认路线。

为什么呢?

在我的项目中,我们首先在方法A中建立UI部分,然后读取XML文件以填充方法B中的数据,以便将数据与UI表示分开。所以,我按此顺序执行:

  1. 构造所有UI组件,包括表,用空数据向量填充;
  2. 阅读XML以获取数据。
  3. 重置表格数据。
  4. 所以问题就出现了。我没有问题切换顺序(尽管它将数据部分与UI混合),但我只是想知道原因。

0 个答案:

没有答案