sta*_*ext 7 java swing jtable jlabel
在任何人建议HTML之前,我稍后会解释为什么这不是一个选项.我有一个表,其中包含一个包含文本单元格的列.我需要能够突出显示每个单元格中的一些文本.因此,例如,如果单元格包含"cat foo dog"......我可能想要突出显示foo.
我当前的方法是使用一个自定义的TableCellRenderer,它将html放入一个呈现的JLabel组件中,并且暂时很好.然后我注意到,当单元格中的文本变得太长而无法适应列宽时,它只是截断了文本而没有在这种情况下正常发生的正常"...".因此,用户不知道他们没有看到更多的文字.另一个问题是,如果原始文本本身包含HTML,在我的情况下它有时会执行,则单元格将无法正确呈现.我知道我可以逃脱html,但我仍然会有一个流行的问题.
如果我使用jlabel以外的组件,那么它会让我的桌子看起来很奇怪.有没有人有什么建议?谢谢
嗯,这是一个解决方案.
简而言之,您可以子类JLabel手动绘制突出显示.覆盖paintComponent方法以进行实际绘制,并使用它FontMetrics来计算应该绘制突出显示区域的位置.
这是一个令人难以忍受的细节答案:
基本上,你可以创建一个JLabel可以突出显示内容的子类.我愿意这样做; 你可能想要做一些不同的事情:
添加一个方法,告诉标签要突出显示哪个部分.这可能是这样的,假设您只需要一个突出显示的区域:
public void highlightRegion(int start, int end) {
// Set some field to tell you where the highlight starts and ends...
}
Run Code Online (Sandbox Code Playgroud)
如果您需要多个区域,只需要一个ArrayList而不是一个简单的字段.取消照明的方法也可能是有用的.
现在,您需要覆盖paintComponent方法JLabel.在这里,您需要执行几个不同的步骤,您可能希望以不同的方法或其他方式组织这些步骤.为简单起见,我将把它全部放在paint方法中.
@Override
protected void paintComponent(Graphics g) {
...
Run Code Online (Sandbox Code Playgroud)
首先,你需要弄清楚亮点的物理尺寸,你可以使用漂亮的FontMetrics类来做.FontMetrics为Font您正在使用创建类.
FontMetrics metrics = new FontMetrics(getFont());
Run Code Online (Sandbox Code Playgroud)
现在,您可以获得创建将成为亮点的矩形所需的所有信息.你需要起始位置,高度和宽度.为了得到这个,你需要两个JLabel文本的子串如下:
String start = getText().substring(0, startOfHighlight);
String text = getText().substring(startOfHighlight, endOfHighlight);
//You may also need to account for some offsets here:
int startX = metrics.stringWidth(start);
int startY = 0; //You probably have some vertical offset to add here.
int length = metrics.stringWidth(text);
int height = metrics.getHeight();
Run Code Online (Sandbox Code Playgroud)
现在,您可以在绘制标签的其余部分之前绘制突出显示的区域:
g.fillRect(startX, startY, length, height);
super.paintComponent(g);
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您希望突出显示跨越多行,则需要更多工作.
如果你想知道,我之前写过这样的东西.一时兴起,我决定从a编写自己的文本区域类型组件JPanel,这基本上就是我处理突出显示的方式.在实际项目中重新发明轮子可能是愚蠢的,但它确实会教你随机的东西可能会有用......
| 归档时间: |
|
| 查看次数: |
5069 次 |
| 最近记录: |