【问题标题】:JTable : how to align data in the center or how to set row background color alternateJTable:如何在中心对齐数据或如何设置行背景颜色交替
【发布时间】:2015-09-08 21:55:07
【问题描述】:

如何在JTable 中设置行背景颜色并将数据对齐到中心。JTable1 是动态的。 JTable 使用 defaultTableModel 设置数据。我想如果 i%==0 比背景颜色是 #Color.GRAY 否则 #Color.WHITE 我读过关于渲染类但不了解渲染类的内容

import java.awt.Dimension;
import java.awt.Font;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

class FacultyList extends JPanel {

    static DefaultTableModel dm;
    JTable table;
    JScrollPane jsp_table;
    static Connection conn;
    static Statement stmt;
    static ResultSet rs;

    public FacultyList(Connection c) {
        conn = c;
        String col_name[] = {"S.No.", "Name", "Father Name", "College ID", 
            "Gender", "Date of Birth", "Branch", "Contact No."};
        dm = new DefaultTableModel(null, col_name);
        table = new JTable(dm);
        table.getTableHeader().setFont(new Font("Goudy Old Style", Font.BOLD, 15));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.getColumnModel().getColumn(0).setPreferredWidth(50);
        table.getColumnModel().getColumn(1).setPreferredWidth(150);
        table.getColumnModel().getColumn(2).setPreferredWidth(150);
        table.getColumnModel().getColumn(3).setPreferredWidth(125);
        table.getColumnModel().getColumn(4).setPreferredWidth(50);
        table.getColumnModel().getColumn(5).setPreferredWidth(125);
        table.getColumnModel().getColumn(6).setPreferredWidth(225);
        table.getColumnModel().getColumn(7).setPreferredWidth(150);
        jsp_table = new JScrollPane(table);
        jsp_table.setPreferredSize(new Dimension(975, 520));
        addRowTable();
        add(jsp_table);
    }

    public static void addRowTable() {
        try {
            int a = dm.getRowCount();
            int i = 0;
            while (i < a) {
                dm.removeRow(0);
                i++;
            }
            String fac = "Faculty";
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                    ResultSet.CONCUR_UPDATABLE);
            rs = stmt.executeQuery("SELECT NAME, FNAME, CLG_ID, GANDER, "
                    + "DOB, BRANCH, CONTACT FROM PROFILE "
                    + "where I_AM = '" + fac + "'");
            int count = 1;
            while (rs.next()) {
                String s[] = new String[8];
                s[0] = "" + count;
                s[1] = rs.getString(1);
                s[2] = rs.getString(2);
                s[3] = rs.getString(3);
                s[4] = rs.getString(4);
                s[5] = rs.getString(5);
                s[6] = rs.getString(6);
                s[7] = "" + rs.getLong(7);
                count++;
                if (i % 2 == 0) {
                } else {
                }
                dm.addRow(s);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 请问您从哪里读到 Renderer -(我读到了 rander 类但不了解 rander 类)
  • 在本网站或 java oracle doc 上

标签: java swing jtable background-color defaulttablemodel


【解决方案1】:

在本网站或 java oracle 文档上

  • TableCellRenderer 只是关于绘画,是基于 XxxTableCellRenderer 中的设置的静态绘画,不是交互式的,是关于绘画幻觉的,

  • XxxTableCellRenderer 中的绘画非常密集,可从所有键和鼠标事件、相关 API 中实现的方法调用

  • 它可以是JTable 的单独定义或返回规则的单独类,为JTables 视图绘制定义

  • JDBC不是设置或定义渲染器的好地方,关于从数据库中添加新数据到DefaultTableModel

  • ResultSet.CONCUR_UPDATABLE 无法为JTable 设置,是来自 ResultSet 的快照,它没有任何操作返回数据库

  • 为什么来自JDBC的返回限制为String s[] = new String[8];,设置data typed correctly by override getColumnClass

  • 在渲染器中设置对齐方式(数据类型化默认返回alingment),例如通过强制转换为JLabel,那么JLabels API中实现的所有方法都可以在那里使用

  • 默认情况下,prepareRenderergetTableCellRendererComponent 用于整个JTables 视图和Renderer 的许多不同尝试仅应用于具体列

【讨论】:

    【解决方案2】:

    您可以使用自定义渲染器来执行此操作。可以这样做:

     table1 = new JTable(){
    
    public Component prepareRenderer(TableCellRenderer tcr, int row,
        int column) {
        Component c = super.prepareRenderer(tcr, row, column);
    
        if (isRowSelected(row)) {
    
            c.setForeground(getSelectionForeground());
            c.setBackground(getSelectionBackground());
    
        } else {
    
            c.setForeground(getForeground());
            c.setBackground((row % 2 == 0) ? getBackground()
                : Color.lightGray);
        }
    
        int rendererWidth = c.getPreferredSize().width;
        TableColumn tableColumn = getColumnModel().getColumn(column);
        tableColumn.setPreferredWidth(Math.max(rendererWidth
            + getIntercellSpacing().width,
            tableColumn.getPreferredWidth()));
    
    DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
    rightRenderer.setHorizontalAlignment(SwingConstants.CENTER);
    table1.getColumnModel().getColumn(column).setCellRenderer(rightRenderer);
    return c;
        }
    
      };;
    

    【讨论】:

    • 为什么 prepareRenderer 和 DefaultTableCellRenderer 的集合可以在其中一个中轻松完成,为一个 JTable、Column、Cell 组合两个 XxxRenderer 可能会占用大量 CPU ...
    猜你喜欢
    • 2013-11-06
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多