java创建jtable_java – 如何创建不同的JTable模型?

有很多不同的方法可以实现这个结果……

在这里,我用自己的实现替换了标头,将Double类型的默认单元格渲染器设置为我自己的TableCellRenderer,并调整表格的一些内置属性.

public class FancyTable {

public static void main(String[] args) {

new FancyTable();

}

public FancyTable() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

}

JTable table = new JTable(new LoanModel());

table.setTableHeader(new SingleColumnTableHeader());

table.setFillsViewportHeight(true);

table.setShowHorizontalLines(true);

table.setShowVerticalLines(false);

table.setGridColor(Color.LIGHT_GRAY);

table.setDefaultRenderer(Double.class, new CurrencyRenderer());

JScrollPane scrollPane = new JScrollPane(table);

JFrame frame = new JFrame("Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(scrollPane);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class LoanModel extends AbstractTableModel {

private List loans;

public LoanModel() {

loans = new ArrayList(25);

loans.add(new Loan("Davies S.J", 2500000));

loans.add(new Loan("Lucas M.M", 1700000));

loans.add(new Loan("Smith R.B", 600000));

loans.add(new Loan("Jones T.T", 435000));

loans.add(new Loan("Brown R.B", 600000));

loans.add(new Loan("Walls T.T", 435000));

loans.add(new Loan("Healy R.B", 600000));

loans.add(new Loan("Taylor T.T", 435000));

loans.add(new Loan("Ginns R.B", 600000));

loans.add(new Loan("Murphy H", 435000));

}

@Override

public int getRowCount() {

return loans.size();

}

@Override

public int getColumnCount() {

return 2;

}

@Override

public Class> getColumnClass(int columnIndex) {

Class clazz = String.class;

switch (columnIndex) {

case 1:

clazz = Double.class;

break;

}

return clazz;

}

@Override

public Object getValueAt(int rowIndex, int columnIndex) {

Object value = null;

Loan loan = loans.get(rowIndex);

switch (columnIndex) {

case 0:

value = loan.getName();

break;

case 1:

value= loan.getAmount();

break;

}

return value;

}

}

public class Loan {

private String name;

private double amount;

public Loan(String name, double amount) {

this.name = name;

this.amount = amount;

}

public String getName() {

return name;

}

public double getAmount() {

return amount;

}

}

public class CurrencyRenderer extends DefaultTableCellRenderer {

private Font boldFont;

public CurrencyRenderer() {

setHorizontalAlignment(JLabel.RIGHT);

boldFont = getFont().deriveFont(Font.BOLD);

}

@Override

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

if (value instanceof Double) {

value = NumberFormat.getCurrencyInstance().format(value);

}

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

setFont(boldFont);

return this;

}

}

public class SingleColumnTableHeader extends JTableHeader {

private JLabel renderer;

public SingleColumnTableHeader() {

setBackground(Color.WHITE);

renderer = new JLabel("Top Ten Loan Balances");

renderer.setBorder(new EmptyBorder(4, 0, 4, 0));

}

@Override

public Dimension getPreferredSize() {

return renderer.getPreferredSize();

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();

FontMetrics fm = g2d.getFontMetrics();

Insets insets = getInsets();

int width = getWidth() - (insets.left + insets.right);

int height = getHeight() - (insets.top + insets.bottom);

renderer.setBounds(insets.left, insets.top, width, height);

renderer.paint(g2d);

g2d.setColor(Color.LIGHT_GRAY);

g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));

g2d.drawLine(insets.left, insets.top + height - 1, insets.left + width, insets.top + height - 1);

g2d.dispose();

}

}

}

您可以轻松地创建自己的自定义JTable并覆盖configureEnclosingScrollPane来为表头设置自己的组件,但是,就个人而言,我认为这是过度杀戮.

能够提供我自己的渲染器是一种更灵活的方法,并促进组件元素的重复使用,而不是生成紧密的代码…

更新

我发现,在Guillaume说过之后,你可以简单地将JTables标头设置为null.然后,一旦您将表添加到滚动窗格,您只需用户JScrollPane#setColumnHeaderView将标题设置为类似JLabel的内容.

必须实现自己的JTableHeader会更容易

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值