Updating/Calling 更改值时呈现 JTable MANUALLY/DYNAMICALLY
Updating/Calling JTable rendering when a value is changed MANUALLY/DYNAMICALLY
所以我希望每次更改变量中的值时我的 JTable 都呈现,但这并没有发生,table 仅在我单击它或将其移出视图时才呈现然后回来。有什么建议吗?我正在使用下面发布的自定义 TableCellRender。
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;
public class myRenderer extends JLabel implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public myRenderer()
{
super.setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setHorizontalAlignment(SwingConstants.CENTER);
setText(value.toString());
Color myColor = new Color(255, 253, 117);
setBackground(myColor);
if(value == Integer.valueOf(-1))
{
value = null;
setText("");
return this;
}
for(int i = 0; i < 90; i++) {
if(value == Integer.valueOf(finalClass.done[i])) //this value changes during the program.
{
setBackground(Color.cyan);
}
}
return this;
}
}
我希望我的 table 每次在程序的任何其他部分更改 finalClass.done
中的值时呈现。有任何想法吗?我尝试了重新验证选项,但没有结果。
编辑:
这是 finalClass 的最小版本,当 运行 与上述渲染器代码一起使用时,可以重现我面临的相同错误。
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class finalClass {
JFrame frame = new JFrame();
static int[] done = new int[90];
Integer[][] slip = new Integer[9][5];
String colHeader[] = {"1","2","3","4","5"};
JTable table;
finalClass() {
for(int i = 0; i<90; i++)
done[i] = -1;
int cnt = 0;
for(int x = 0; x<9; x++ ) {
for(int y = 0; y <5; y++) {
slip[x][y] = cnt++;
}
}
DefaultTableModel tableModel = new DefaultTableModel(slip, colHeader) {
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(slip, colHeader);
table.setDefaultRenderer(Object.class, new myRenderer());
table.setModel(tableModel);
frame.add(table);
frame.setVisible(true);
frame.pack();
}
public static void main(String[] args) {
new finalClass();
try {
Thread.sleep(5000);
done[5] = 10;
} catch(Exception e) {
e.printStackTrace();
}
}
}
提前感谢大家对我的包容。我是新来的,所以我可能需要一点时间才能了解这里的工作方式。抱歉浪费您的时间,在此先感谢您的帮助。
只有在您移动 table 或单击它后才显示该值的原因是这样做会强制重绘。
您可以通过在 done[5] = 10;
之后调用 frame.repaint()
来验证它
以下是单文件 MRE(将整个代码复制粘贴到 FinalClass.java
和 运行):
import java.awt.Color;
import java.awt.Component;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class FinalClass {
private final JFrame frame = new JFrame();
private final int[] done = new int[90]; //better avoid static
private final Integer[][] slip = new Integer[9][5];
private final String colHeader[] = {"1","2","3","4","5"};
private JTable table;
FinalClass() {
Arrays.fill(done, -1);
int cnt = 0;
for(int x = 0; x<9; x++ ) {
for(int y = 0; y <5; y++) {
slip[x][y] = cnt++;
}
}
DefaultTableModel tableModel = new DefaultTableModel(slip, colHeader) {
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(slip, colHeader);
table.setDefaultRenderer(Object.class, new MyRenderer());
table.setModel(tableModel);
frame.add(table);
frame.pack();
frame.setVisible(true);
}
private void refresh(){
frame.repaint();
}
void done(int index, int value){
done[index] = value;
refresh();
}
public static void main(String[] args) {
FinalClass f = new FinalClass();
try {
Thread.sleep(3000);
f.done(5, 10);
} catch(Exception e) { e.printStackTrace(); }
}
//follow java naming conventions
class MyRenderer extends JLabel implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public MyRenderer()
{
super.setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setHorizontalAlignment(SwingConstants.CENTER);
setText(value.toString());
Color myColor = new Color(255, 253, 117);
setBackground(myColor);
if((int)value == -1)
{
value = null;
setText("");
return this;
}
for(int i = 0; i < 90; i++) {
if((int)value == done[i]) //this value changes during the program.
{
setBackground(Color.cyan);
}
}
return this;
}
}
}
旁注:
1. 如果您希望 table 自动响应底层数据的更改,您需要将更改应用于其模型,如 this answer 中对您上一个问题的演示。
2.Modifying done
来自多个线程需要同步。
3.It推荐关注Java Naming Conventions
所以我希望每次更改变量中的值时我的 JTable 都呈现,但这并没有发生,table 仅在我单击它或将其移出视图时才呈现然后回来。有什么建议吗?我正在使用下面发布的自定义 TableCellRender。
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;
public class myRenderer extends JLabel implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public myRenderer()
{
super.setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setHorizontalAlignment(SwingConstants.CENTER);
setText(value.toString());
Color myColor = new Color(255, 253, 117);
setBackground(myColor);
if(value == Integer.valueOf(-1))
{
value = null;
setText("");
return this;
}
for(int i = 0; i < 90; i++) {
if(value == Integer.valueOf(finalClass.done[i])) //this value changes during the program.
{
setBackground(Color.cyan);
}
}
return this;
}
}
我希望我的 table 每次在程序的任何其他部分更改 finalClass.done
中的值时呈现。有任何想法吗?我尝试了重新验证选项,但没有结果。
编辑: 这是 finalClass 的最小版本,当 运行 与上述渲染器代码一起使用时,可以重现我面临的相同错误。
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class finalClass {
JFrame frame = new JFrame();
static int[] done = new int[90];
Integer[][] slip = new Integer[9][5];
String colHeader[] = {"1","2","3","4","5"};
JTable table;
finalClass() {
for(int i = 0; i<90; i++)
done[i] = -1;
int cnt = 0;
for(int x = 0; x<9; x++ ) {
for(int y = 0; y <5; y++) {
slip[x][y] = cnt++;
}
}
DefaultTableModel tableModel = new DefaultTableModel(slip, colHeader) {
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(slip, colHeader);
table.setDefaultRenderer(Object.class, new myRenderer());
table.setModel(tableModel);
frame.add(table);
frame.setVisible(true);
frame.pack();
}
public static void main(String[] args) {
new finalClass();
try {
Thread.sleep(5000);
done[5] = 10;
} catch(Exception e) {
e.printStackTrace();
}
}
}
提前感谢大家对我的包容。我是新来的,所以我可能需要一点时间才能了解这里的工作方式。抱歉浪费您的时间,在此先感谢您的帮助。
只有在您移动 table 或单击它后才显示该值的原因是这样做会强制重绘。
您可以通过在 done[5] = 10;
frame.repaint()
来验证它
以下是单文件 MRE(将整个代码复制粘贴到 FinalClass.java
和 运行):
import java.awt.Color;
import java.awt.Component;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class FinalClass {
private final JFrame frame = new JFrame();
private final int[] done = new int[90]; //better avoid static
private final Integer[][] slip = new Integer[9][5];
private final String colHeader[] = {"1","2","3","4","5"};
private JTable table;
FinalClass() {
Arrays.fill(done, -1);
int cnt = 0;
for(int x = 0; x<9; x++ ) {
for(int y = 0; y <5; y++) {
slip[x][y] = cnt++;
}
}
DefaultTableModel tableModel = new DefaultTableModel(slip, colHeader) {
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table = new JTable(slip, colHeader);
table.setDefaultRenderer(Object.class, new MyRenderer());
table.setModel(tableModel);
frame.add(table);
frame.pack();
frame.setVisible(true);
}
private void refresh(){
frame.repaint();
}
void done(int index, int value){
done[index] = value;
refresh();
}
public static void main(String[] args) {
FinalClass f = new FinalClass();
try {
Thread.sleep(3000);
f.done(5, 10);
} catch(Exception e) { e.printStackTrace(); }
}
//follow java naming conventions
class MyRenderer extends JLabel implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public MyRenderer()
{
super.setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setHorizontalAlignment(SwingConstants.CENTER);
setText(value.toString());
Color myColor = new Color(255, 253, 117);
setBackground(myColor);
if((int)value == -1)
{
value = null;
setText("");
return this;
}
for(int i = 0; i < 90; i++) {
if((int)value == done[i]) //this value changes during the program.
{
setBackground(Color.cyan);
}
}
return this;
}
}
}
旁注:
1. 如果您希望 table 自动响应底层数据的更改,您需要将更改应用于其模型,如 this answer 中对您上一个问题的演示。
2.Modifying done
来自多个线程需要同步。
3.It推荐关注Java Naming Conventions