我的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表示分开。所以,我按此顺序执行:
所以问题就出现了。我没有问题切换顺序(尽管它将数据部分与UI混合),但我只是想知道原因。