在有人建议使用 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...
}
如果您需要多个区域,只需使用 ArrayList 而不是简单的字段。取消突出显示的方法可能也很有用。
现在,您需要覆盖JLabel 的paintComponent 方法。在这里您需要执行几个离散的步骤,您可能希望以不同的方法或其他方式组织这些步骤。为简单起见,我将把它全部放在 paint 方法中。
@Override
protected void paintComponent(Graphics g) {
...
首先,您需要确定突出显示的物理尺寸,您可以使用漂亮的 FontMetrics 类来完成。为您正在使用的 Font 创建 FontMetrics 类。
FontMetrics metrics = new FontMetrics(getFont());
现在您可以获得创建将成为亮点的矩形所需的所有信息。您需要起始位置、高度和宽度。为此,您需要 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();
现在您可以在绘制标签的其余部分之前绘制突出显示的区域:
g.fillRect(startX, startY, length, height);
super.paintComponent(g);
}
当然,如果你想让高亮跨越多行,那将需要更多的工作。
如果您想知道,我以前确实写过类似的东西。一时兴起,我决定从 JPanel 编写我自己的文本区域类型组件,这基本上就是我处理突出显示的方式。在实际项目中重新发明轮子可能很愚蠢,但它确实教会了你一些可能有用的随机东西......
关于java - 如何突出显示 JLabel 的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533967/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/