我试图根据某些行项的值覆盖JXTable的突出显示颜色.这是一个示例,如果行项值有高亮显示为绿色getNumber() % 2 == 0.
它适用于JTable,但对于JXTable,看起来表格单元格渲染器不起作用,除非选择了相关的行.为什么它会这样,我该如何解决?

import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import org.jdesktop.swingx.JXTable;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
public class TableRendererExample {
static public enum ItemKey {
NAME("name") {
@Override public String getStringFromItem(Item item) {
return item.getName();
}
},
NUMBER("#") {
@Override public String getStringFromItem(Item item) {
return Integer.toString(item.getNumber());
}
},
PARENT("parent") {
@Override public String getStringFromItem(Item item) { …Run Code Online (Sandbox Code Playgroud) 我已经加入多JProgressBar到TableColumn的JTable.
在进行某些计算后,我正在使用数据更新所有JProgressBar,但只有最后一个ProgressBar(在这种情况下ProgressBar progressObj4)添加的内容正在更新.
我怎样才能更新所有的ProgressBars?
基本要求是我在上传时显示文件进度条的状态.目前我正在硬编码4个进度条以测试所有进度条是否正在更新文件的状态,但我需要动态创建它们.进度条总数没有上传的文件数.另外,如何获取进度条的各个实例并更新其状态?
我附加了添加到表列的进度条的源代码.
//tc = object of TableColumn
progressObj1 = new ProgressBarRenderer("Progress1");
progressObj1.setValue(0);
progressObj1.setStringPainted(true);
progressObj1.setBackground(Color.WHITE);
progressObj1.setBorderPainted(true);
tc.setCellRenderer(progressObj1);
progressObj2 = new ProgressBarRenderer("Progress2");
progressObj2.setValue(0);
progressObj2.setStringPainted(true);
progressObj2.setBackground(Color.WHITE);
progressObj2.setBorderPainted(true);
tc.setCellRenderer(progressObj2);
progressObj3 = new ProgressBarRenderer("Progress3");
progressObj3.setValue(0);
progressObj3.setStringPainted(true);
progressObj3.setBackground(Color.WHITE);
progressObj3.setBorderPainted(true);
tc.setCellRenderer(progressObj3);
progressObj4 = new ProgressBarRenderer("Progress4");
progressObj4.setValue(0);
progressObj4.setStringPainted(true);
progressObj4.setBackground(Color.WHITE);
progressObj4.setBorderPainted(true);
tc.setCellRenderer(progressObj4);
Run Code Online (Sandbox Code Playgroud) 我表中一列的单元格是HTML字符串.HTML用于提供一些颜色指示.通常,列的宽度足以包含整个字符串.但是当它还不够时,字符串很好地剪切在单词边界上.这是期望的行为.使用默认的单元格渲染器.
我注意到偶尔会有一些与表的交互触发渲染器包装字符串.据我了解,包裹HTML字符串是一种正常的行为JLabel从中DefaultTableCellRenderer派生.不清楚的是,为什么这种行为如此不一致以及是什么引发了它的偏差.跳来跳去的原因是什么JLabel,就像经常重新测量一样?有关示例,请参见附图.
为了解决这个问题,我可以添加<nobr>HTML字符串以防止换行,或者使用更复杂的渲染器来渲染彩色字符串.但我想知道是否有办法让JLabel游戏变得更好.
我设法将整个案例简化为一个简单的例子.我要重现的问题是单击各行以更改选择.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class TestTable extends JPanel{
public TestTable() {
setLayout(new BorderLayout());
Object[][] rows = {
{ "<html><font color=red>1 Lorem ipsum</font> dolor sit amet, " +
"consectetur adipiscing elit. In lectus dolor</html>"},
{ "<html><font color=green>2 Lorem ipsum</font> dolor sit amet, " +
"consectetur adipiscing elit. In lectus dolor</html>"}, …Run Code Online (Sandbox Code Playgroud) 我想在第1列的JTable(3,3)中添加JComboBox.但在第1列中,每行都有自己的ComboBox元素集.当我尝试使用时
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox_Custom));
Run Code Online (Sandbox Code Playgroud)
每行都被设置为同一组ComboBox值.但我希望每一行ComboBox都有不同的项目.
我正在使用一个实现TableCellRenderer的自定义单元格渲染器,并为每一行显示JTextArea(而不是JLabel).我基本上覆盖了我的getTableCellRendererComponent(...)方法,每行进行一些额外的计算.每个表更新只需执行一次这些计算.由于每次鼠标移动都会调用getTableCellRendererComponent方法,因此会发生滞后.所以我认为我应该阻止调用getTableCellRendererComponent以避免延迟.
注意事项:
1)我的表只有1列,没有标题.
2)我的数据是静态的,并通过实现AbstractTableModel的自定义tablemodel类中的getValueAt(int row,int column)方法从ArrayList读取.
3)我不需要观察鼠标运动事件.
4)我不期望有太多数据,所以我可能想要一次显示整个表或完全缓存它.
5)大多数滞后是由每次从getTableCellRendererComponent返回时设置文本引起的,因为有些行使用从右到左的字符,而RTL文本需要额外的时间来渲染.
我想在我的系统上添加另一个设计/模型JTable.这是一个简单的设计,但对我来说(作为一个新手)我很难设置这种表.我希望表格看起来像这样:

是否有可能在Java中设计这样的表?请分享你有任何想法.
我想在JTable的列中添加正确的cell-padding,我该怎么办?
我尝试在线搜索,但似乎无法找到明确的答案.
我希望有一个人可以帮助我.
此致,乍得
我正在寻找这个问题的解决方案:我有一个包含数据的excel文件.一些细胞具有黄色背景.我已经创建了一个代码,用于将文本导入JTable,工作正常.但我也想将背景单元格颜色导入特定单元格.为简单起见,这个例子,我没有使用循环,从源等读取excel数据.阅读论坛后我明白我需要CustomCellRenderer.
我有这个方法的问题,因为这个代码首先正确地着色列中的单元格,但是当我开始滚动此表中的彩色单元格时,它将整个列重新着色为黄色.(见截图)
我以为我可以添加else语句来专门将剩余的单元格着色为白色,但这种方法对我来说不起作用,因为我会覆盖以前的单元格结果.
你能指点我这个解决方案吗?(这是一个bug,还是JTable的预期行为?).我正在使用NetBeans和GUI拖放生成器
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class MyRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
int[][] coordinatesYellow = new int[3][2];
//[row][column] these cells are yellow
coordinatesYellow[0][0] = 3;
coordinatesYellow[0][1] = 2;
coordinatesYellow[1][0] = 4;
coordinatesYellow[1][1] = 2;
coordinatesYellow[2][0] = 2;
coordinatesYellow[2][1] = 2;
for (int i = 0; i < 3; i++) …Run Code Online (Sandbox Code Playgroud) 我有一张这样的桌子.第二列使用JTextField渲染器,第三列使用基于JPasswordField的渲染器和编辑器.

看起来不错.但问题是我们必须输入值并且必须点击"ENTER".在该图像中,我输入了密码,但未按Enter键.因此,如果我单击"保存并关闭"按钮,它将显示密码字段为空的错误.
以前我在JTabbedPane下只使用了JTextFields和JPasswordFields,效果很好.当我不得不添加越来越多的东西时,我把它改成了这样的表格.
现在我已经贴了一个标签让人们知道他们应该点击进入..这不太好.另一个大问题.在Nimbus的Atleast外观和感觉,我们得知这个领域仍然是焦点.在Windows系统外观中,无论字段是否聚焦,都没有太多明显的区别.

当我点击"保存并关闭"按钮时,我需要用户名字段或密码字段来设置它的值.请帮我.
我正在尝试创建一个表格和颜色特定的单元格,黄色,红色或白色,具体取决于其他列的内容.为此,我循环填充值的行,然后检查内容.对于当前显示在屏幕上的每一行都可以正常工作,但是当程序到达未显示的行时,或者如果用户尝试滚动每个单元格,则将其背景颜色更改为白色.我在网上搜索了解决方案,唯一合理的想法是在每次循环后重置cellRenderer,这不起作用,因为它也会重置每个单元格.
我希望有人知道这方面的解决方案,或者可以让我知道我在哪里搞砸了什么.
我正在使用这个循环
for(int e = 0; e < modules.size(); e++)
{
gui.clearOutputStream();
gui.getOutputStream().setText("Load Modul " + modules.get(e) + "\r\n");
version = getVersion(modules.get(e));
//Update current Row
updateRow(gui.getReleaseTabelle(), e);
}
Run Code Online (Sandbox Code Playgroud)
它调用这种方法
public void updateRow(JTable target, int row){
//...
//insert Values here
//...
CustomRenderer cr = new CustomRenderer();
cr.tab = target;
if(!target.getValueAt(row, 2).equals(target.getValueAt(row, 3)))
{
cr.Val1 = target.getValueAt(row, 1).toString();
target.setValueAt("X", row, 1);
}
else if(!target.getValueAt(row, 7).equals(""))
{
cr.Val1 = target.getValueAt(row, 1).toString();
target.setValueAt("Y", row, 1);
}
else
{
}
target.getColumnModel().getColumn(1).setCellRenderer(cr);
}
Run Code Online (Sandbox Code Playgroud)
这是我的CustomRenderer
class …Run Code Online (Sandbox Code Playgroud)