Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态更改线条的颜色?_Java_Swing - Fatal编程技术网

Java 如何动态更改线条的颜色?

Java 如何动态更改线条的颜色?,java,swing,Java,Swing,我的表格看起来是这样的,一切正常)我需要的是,如果条件到达=0或离开=0得到满足,那么整行的文本颜色是不同的颜色,例如红色或黑色,没关系,我想不出如何更改它,可能很简单,我是新来的)我还没有在其他问题中找到这个问题的答案 private void btnLogIdentifications2ActionPerformed(java.awt.event.ActionEvent evt) {

我的表格看起来是这样的,一切正常)我需要的是,如果条件到达=0或离开=0得到满足,那么整行的文本颜色是不同的颜色,例如红色或黑色,没关系,我想不出如何更改它,可能很简单,我是新来的)我还没有在其他问题中找到这个问题的答案

private void btnLogIdentifications2ActionPerformed(java.awt.event.ActionEvent evt) {                                                       
    setTableSettingsReport();
    searchIdentificationsReport(true);
    open = true;
}
public void searchIdentificationsReport(boolean all) {
    int z = 0;
    while (z < tm.getRowCount()) {
        tm.removeRow(z);
    }
    Statement statement = null;
    try {
        statement = getDbConnection().createStatement();
        String sql = "select a.id, pr.p_name,pr.p_surname,pr.p_patronic, a.date_arrival_from,a.date_arrival_to, a.arrival,a.date_departure_from,a.date_departure_to, a.depart, a.arrival_comment, a.depart_comment,a.prsn_id "
                + "  FROM bio.persons pr, attendance a where pr.p_id=a.prsn_id and a.date<=CURDATE() ";
        if (cbPersons.getSelectedItem() != null && model.getSelectedItem() != null) {
            CodeValueDTO dto = (CodeValueDTO) model.getSelectedItem();
            sql += " and  pr.p_id='" + dto.getId() + "'";
        }
        if (!all) {
            sql += " and (ARRIVAL =0 or DEPART=0)";

        }

        statement.execute(sql);
        ResultSet rs = statement.getResultSet();
        int value = 1;
        while (rs.next()) {
            Object[] objects = new Object[13];
            for (int i = 0; i < 13; i++) {
                objects[i] = rs.getObject(i + 1);
            }
            if (rs.getInt(7) == 0) {
                objects[6] = "Нет";

            } else {
                objects[6] = "Да";
            }

            if (rs.getInt(10) == 0) {
                objects[9] = "Нет";
            } else {
                objects[9] = "Да";
            }
            System.out.println(value);
            jTblReport.setDefaultRenderer(String.class, new MyCellRenderer(6));
            jTblReport.setDefaultRenderer(String.class, new MyCellRenderer(9));

            tm.addRow(objects);
        }

    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        try {
            statement.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

}
private void setTableSettingsReport() {

    jTblReport.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jTblReport.setRowSelectionAllowed(true);
    jTblReport.setAutoCreateRowSorter(true);
    jTblReport.getTableHeader().setReorderingAllowed(false);

    String[] dbColNames = new String[13];
    dbColNames[0] = "ID";
    dbColNames[1] = "Имя";
    dbColNames[2] = "Фамилия";
    dbColNames[3] = "Отчество";
    dbColNames[4] = "Дата прихода с ";
    dbColNames[5] = "Дата прихода до";
    dbColNames[6] = "Прибытие";
    dbColNames[7] = "Дата ухода с ";
    dbColNames[8] = "Дата ухода до";
    dbColNames[9] = "Убытие";
    dbColNames[10] = "Причина опоздания";
    dbColNames[11] = "Причина раннего ухода";
    dbColNames[12] = "ID лица";

    // dbColNames[8] = "Дата начала";
    //  dbColNames[9] = "Дата окончания";    
    tm.setColumnIdentifiers(dbColNames);
    jTblReport.setModel(tm);
    jTblReport.setSelectionForeground(Color.white);

    jTblReport.setSelectionBackground(Color.red);
    jTblReport.getColumnModel().getColumn(0).setPreferredWidth(10);
    jTblReport.getColumnModel().getColumn(1).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(2).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(3).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(4).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(5).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(6).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(7).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(8).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(9).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(10).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(10).setPreferredWidth(60);
    jTblReport.getColumnModel().getColumn(10).setPreferredWidth(60);

}

public class MyCellRenderer extends DefaultTableCellRenderer {

private int columNum = 0;

public MyCellRenderer(Integer columNum) {
    this.columNum = columNum;
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    Object object = table.getValueAt(row, this.columNum);

    if (object.equals("Нет")) {
        setBackground(Color.RED);
    }
    return this;
}
private void Btnogidentifications2ActionPerformed(java.awt.event.ActionEvent evt){
setTableSettingsReport();
searchIdentificationsReport(真实);
开放=真实;
}
公共无效搜索标识报告(布尔值全部){
int z=0;
而(z+“从bio.persons pr,attention a,其中pr.p_id=a.prsn_id和a.date整个表格变为红色的问题是因为它重用渲染器来绘制每个单元格,并且在代码中只设置一次背景(在第一次遇到“ццц”)并且永远不会将其返回默认颜色(或无颜色)

只需将渲染器视为一个图章,如果您将图章涂成红色一次,而不将其重新着色为其他颜色,则所有下一个图章都将是红色的

此外,您也不能真正做到这一点:

jTblReport.setDefaultRenderer(String.class, new MyCellRenderer(6));
jTblReport.setDefaultRenderer(String.class, new MyCellRenderer(9));
第二个覆盖第一个,因为表中每个类类型只存储一个呈现器。相反,您可以在呈现器中正确处理此逻辑。也就是说,不建议执行任何“繁重”操作(如服务器/db请求等)在渲染器内部,因为它会显著降低UI响应速度。相反,您应该在单独的线程上执行此类操作,并将结果提供到表模型中

无论哪种方式,下面都是一个简单案例的完整工作示例:

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.Objects;

/**
 * @author Mikle Garin
 * @see https://stackoverflow.com/questions/56831494/how-to-change-the-color-of-the-line-dynamically
 */
public class TableRenderer
{
    public static void main ( String[] args )
    {
        SwingUtilities.invokeLater ( () -> {
            final JFrame frame = new JFrame ( "Table renderer" );
            frame.add ( new JScrollPane ( createTableSettingsReport () ) );
            frame.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
            frame.pack ();
            frame.setLocationRelativeTo ( null );
            frame.setVisible ( true );
        } );
    }

    private static JTable createTableSettingsReport ()
    {
        final String[] dbColNames = new String[ 13 ];
        dbColNames[ 0 ] = "ID";
        dbColNames[ 1 ] = "Имя";
        dbColNames[ 2 ] = "Фамилия";
        dbColNames[ 3 ] = "Отчество";
        dbColNames[ 4 ] = "Дата прихода с ";
        dbColNames[ 5 ] = "Дата прихода до";
        dbColNames[ 6 ] = "Прибытие";
        dbColNames[ 7 ] = "Дата ухода с ";
        dbColNames[ 8 ] = "Дата ухода до";
        dbColNames[ 9 ] = "Убытие";
        dbColNames[ 10 ] = "Причина опоздания";
        dbColNames[ 11 ] = "Причина раннего ухода";
        dbColNames[ 12 ] = "ID лица";

        final String[][] data = {
                { "1", "Сергей", "Кирчин", "Васильевич",
                        "15.12.2002", "22.12.2002", "Да",
                        "25.08.2005", "26.08.2005", "Да",
                        "Болел", "Стало плохо", "123" },

                { "2", "Сергей", "Кирчин", "Васильевич",
                        "15.12.2002", "22.12.2002", "Нет",
                        "25.08.2005", "26.08.2005", "Да",
                        "Болел", "Стало плохо", "123" },

                { "3", "Сергей", "Кирчин", "Васильевич",
                        "15.12.2002", "22.12.2002", "Да",
                        "25.08.2005", "26.08.2005", "Нет",
                        "Болел", "Стало плохо", "123" }
        };

        final JTable jTblReport = new JTable ( new DefaultTableModel ( data, dbColNames ) );
        jTblReport.setSelectionMode ( ListSelectionModel.SINGLE_SELECTION );
        jTblReport.setRowSelectionAllowed ( true );
        jTblReport.setAutoCreateRowSorter ( true );
        jTblReport.getTableHeader ().setReorderingAllowed ( false );

        jTblReport.setDefaultRenderer ( Object.class, new MyCellRenderer () );

        // Optionally (if you have Boolean values, just easier to distinguish the data by type):
        // jTblReport.setDefaultRenderer ( Boolean.class, new MyBooleanCellRenderer () );

        jTblReport.getColumnModel ().getColumn ( 0 ).setPreferredWidth ( 10 );
        jTblReport.getColumnModel ().getColumn ( 1 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 2 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 3 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 4 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 5 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 6 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 7 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 8 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 9 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 10 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 10 ).setPreferredWidth ( 60 );
        jTblReport.getColumnModel ().getColumn ( 10 ).setPreferredWidth ( 60 );

        return jTblReport;
    }

    public static class MyCellRenderer extends DefaultTableCellRenderer
    {
        public MyCellRenderer ()
        {
            super ();
            setOpaque ( true );
            setBackground ( Color.WHITE );
        }

        @Override
        public Component getTableCellRendererComponent ( final JTable table, final Object value, final boolean isSelected,
                                                         final boolean hasFocus, final int row, final int column )
        {
            // Still need to call this to setup default stuff below
            super.getTableCellRendererComponent ( table, value, isSelected, hasFocus, row, column );

            // We should let selection color override our highlight
            if ( !isSelected )
            {
                // Checking conditions
                final boolean arrival = Objects.equals ( table.getValueAt ( row, 6 ), "Да" );
                final boolean departure = Objects.equals ( table.getValueAt ( row, 9 ), "Да" );
                setBackground ( !arrival || !departure ? Color.RED : Color.WHITE );
            }

            return this;
        }
    }
}
在本例中,渲染器用于表格的所有单元格,并将每一行的所有单元格涂成红色,以防您在问题中提到的第6列或第9列中有“Бцц”

这只是未来的一个小提示——强烈建议发布SSCCE(完全工作的短代码示例)关于堆栈溢出,以减少其他人检查您的代码和分析错误的时间。您可以阅读有关SSCCE的内容。这将大大增加从SO社区获得良好响应/解决方案的机会:)

请创建一个解决方案,以便我们更容易理解您的需求,我们的解决方案适合您的情况。不要发布完整的代码,而是创建一个不需要数据库访问的小的可运行类,这样可以消除您的问题。