Java 如何动态更改线条的颜色?
我的表格看起来是这样的,一切正常)我需要的是,如果条件到达=0或离开=0得到满足,那么整行的文本颜色是不同的颜色,例如红色或黑色,没关系,我想不出如何更改它,可能很简单,我是新来的)我还没有在其他问题中找到这个问题的答案Java 如何动态更改线条的颜色?,java,swing,Java,Swing,我的表格看起来是这样的,一切正常)我需要的是,如果条件到达=0或离开=0得到满足,那么整行的文本颜色是不同的颜色,例如红色或黑色,没关系,我想不出如何更改它,可能很简单,我是新来的)我还没有在其他问题中找到这个问题的答案 private void btnLogIdentifications2ActionPerformed(java.awt.event.ActionEvent evt) {
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社区获得良好响应/解决方案的机会:)请创建一个解决方案,以便我们更容易理解您的需求,我们的解决方案适合您的情况。不要发布完整的代码,而是创建一个不需要数据库访问的小的可运行类,这样可以消除您的问题。