我最近一直在研究和使用函数式编程,仅仅是为了拓宽我对编程的思考,因为我发现思维"功能上"很难.
我已经下载了Glasgow Haskell并对其进行了实验.
我想知道的是,Windows试用FP的最佳平台是什么?我更喜欢基于JVM的方法,但SO上的另一篇文章表明,由于缺乏对尾递归的支持,无法在JVM上实现真正的FP语言.怎么说你?
编辑:正如我所说,我已经与Haskell进行了相当多的尝试; 根据其中一个答案的建议,我一直在审查Scala网站.查看Scala示例,代码似乎更"熟悉"(我的背景是C和Java),但它似乎更多OO /程序性和功能性更低.Scala的一个巨大优势在于它为我提供了另一种与Java并排使用的语言工具,并且可能成为我当前专业箭袋中的另一个箭头,而不仅仅是一个学习练习.当我进一步深入Scala时,功能方面是否会变得更加突出,或者我最终只会编写具有某些功能影响的OO代码?换句话说,Haskell会比Scala更难和更快地挑战我的先入为主吗?
我有一个应用程序在几个地方使用禁用的JTextFields是透明的 - 允许显示背景而不是文本字段的正常背景.
运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏了.好像LAF忽略了不透明的属性.明确地设置背景颜色在几个地方都很困难,并且由于背景图像实际上不起作用而不是最佳 - 它仍然在顶部绘制LAF默认背景,留下类似边框的外观(下面的启动画面具有明确设置背景以匹配图像).
关于如何让Nimbus不为JTextField绘制背景的任何想法?
注意:我需要一个JTextField而不是JLabel,因为我需要线程安全的setText()和包装功能.
注意:我的后备位置是继续使用系统LAF,但Nimbus确实看起来好多了.
见下面的示例图片.
这种行为的意外是由于对Nimbus错误报告中的setOpaque()意图做错误的解释:
这是Swing的原始设计以及它多年来一直令人困惑的问题.问题是setOpaque(false)在退出LAF时产生了副作用,即隐藏背景并不是真正的背景.可以说,我有透明部分和swing的组件应该在其后面绘制父组件.
不幸的是,Nimbus组件似乎也不尊重setBackground(null),否则这将是停止背景绘制的推荐方法.设置完全透明的背景对我来说似乎不直观.
在我看来,setOpaque()/ isOpaque()是一个错误的公共API选择,应该只有:
public boolean isFullyOpaque();
Run Code Online (Sandbox Code Playgroud)
我这样说,因为isOpaque()== true是与Swing的契约,组件子类将负责绘制它的整个背景 - 这意味着父级可以跳过绘制该区域(如果需要)(这是一个重要的性能增强).外部的东西不能直接改变这个合同(合法地),其履行可以编码到组件中.
因此,不应使用setOpaque()设置组件的不透明度.相反,像setBackground(null)这样的东西会导致许多组件"没有背景",因此变得不完全不透明.举例来说,在理想的世界中,大多数组件应该具有如下所示的isOpaque():
public boolean isOpaque() { return (background!=null); }
Run Code Online (Sandbox Code Playgroud)
当我在Java 6下运行swing GUI应用程序时,它们会自动为所有字体使用我配置的子像素抗锯齿设置.与标准AA选项相比,结果有了很大改进.
但是当我绘制到图像时,我无法初始化图形上下文以使用系统的AA配置.尝试使用Java的不同AA提示是一个失败的原因,因为没有子像素方法适用于所有用户.
有没有办法继承给定图形上下文的系统AA设置,而不必选择一个并明确设置提示?目前我必须使用GASP AA来避免标准AA用小字体给出的可怕结果.我试过没有为文本AA设置任何内容,也没有设置任何AA提示.
更新2010-01-05
我想我已经把它钉死了; 当直接绘制到AWT图形上下文时,子像素AA提示似乎只被尊重; 当我画到双缓冲图像时,它只是标准AA; 但当我绕过双缓冲图像时,子像素AA完成.
否则,The_Fire的答案将适用于具有Swing可用的JVM(但不适用于J2ME JVM); 请注意,The_Fire的答案不能使用AWT组件(使用新的Label()而不是新的JLabel()失败),可能是因为在将组件实现到显示器之前无法提取FontRenderContext.
我目前为目标图像获取图形上下文的代码如下所示:
try {
if((dbImage=dctRoot.createImage(wid,hgt,1))!=null) { // if createImage returns null or throws an exception the component is not yet displayable
dbGraphics=(Graphics2D)dbImage.getGraphics();
if(dctRoot.properties.getBoolean("Antialias",true)) {
try {
// set AA on overall
dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING ,RenderingHints.VALUE_ANTIALIAS_ON);
// set text AA to platform/impl default
dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
// try to override platform/impl AA with font-specified AA (Java 6+)
try { dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); } catch(Throwable thr) {;} // yes, ignore exception
}
catch(Throwable thr) { …Run Code Online (Sandbox Code Playgroud) 我在一个项目中使用Mithril JS而且我很难理解如何进入Ajax生命周期.就像我有一个Ajax请求需要一段时间,我想展示一个微调器.非常基本,但我似乎无法弄清楚这是怎么发生的.
我想为微调器使用相同的容器作为Ajax请求所寻找的内容.
这是我的设置:
var Thing = function (data) {
var p = m.prop;
this.title = p(data.title);
this.timestamp = p(moment.unix(data.timestamp));
}
Thing.list = function(options) {
m.request({method: "GET", url: "/things.json", type: Thing, background: true});
};
MyApp.components.thingsList = {
controller: function ThingListController() {
this.things = m.prop([]);
Thing.list().then(this.things).then(m.redraw);
},
view: function thingListView(ctrl) {
return m('div#thing-tab', [
m('ul#things', [
ctrl.things().map(thingView)
])
]);
}
};
function thingView(thing) {
...some view stuff...
}
Run Code Online (Sandbox Code Playgroud)
我已经按照我想要的方式工作,但我无法弄清楚如何挂钩到ajax生命周期.同样,我只是想在请求开始时显示一个微调器,然后将其替换为ajax请求的结果.
非常感谢任何和所有的帮助!
谢谢,
几个月来,我一直在用reveal.js演示文稿来解决问题.会发生的是,如果我为幻灯片内容制作半透明的背景,那么ol数字,但不是ul子弹,也不是我能看到的任何其他元素,也会变得半透明到相同的程度.
最重要的问题是列表编号是如何设计的?第二个问题是,列表编号的颜色如何以这种方式与背景相关联?
我已经仔细检查了显示CSS(并且有相当数量)无济于事.当然,我已经检查了浏览器工具中涉及的元素.问题的一个重要部分是我不知道如何故意达到这样的效果; 这些只是具有库存CSS样式的股票HTML列表 - 没有与CSS内容等有趣的业务.
注意第二张图像中的数字几乎不可见.当我改变背景颜色的半透明度时,数字的半透明度随之变化.
背景是一个固定的div:
<div class="background"<% [WallpaperImage] %> style="background-image:url(<% WallpaperImage %>)"<% [/] %>></div>
Run Code Online (Sandbox Code Playgroud)
具有非常直观的造型:
body > div.background {
background : fixed border-box #000 center/cover no-repeat;
bottom : 0;
left : 0;
position : fixed;
right : 0;
top : 0;
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试增强我用Java编写的GUI系统以使用子像素抗锯齿并且已经成功,除了两个剩余的异常.这是几个星期前我的另一个问题的后续问题.
第一个问题是将设置渲染提示KEY_ANTIALIASING设置为VALUE_ANTIALIAS_ON会导致KEY_TEXT_ANTIALIASING在设置为LCD(子像素)AA值时被忽略.任何人都可以对此有所了解吗?目前我在渲染文本之前被迫使用VALUE_ANTIALIAS_OFF,并在渲染文本后将其重新打开(以便其他绘画,如圆圈等,是AA'd).下面的独立测试程序证明了这个问题.
第二个问题是我找不到查询AA的底层操作系统设置,所以我必须做一个相当大的解决方法,即创建一个Swing JLabel,获取它的FontMetrics,得到它的FontRenderContext然后得到AA提示.除了在一个程序中涉及Swing,否则完全不使用Swing,它将无法在运行任何J2ME JVM的设备上运行.任何人都可以提出更好的方法吗?如果它需要J5或J6就可以了,因为当前的kludge已经需要J6(但只需要J4就是最好的).我已经尝试了每个默认设置并使用AWT组件而不是JLabel.
该程序验证要使子像素AA工作,必须首先禁用一般AA设置.(PS:我写入后台缓冲区,因为我的底层GUI确实如此,我想在等效的上下文中进行测试).
import java.awt.*;
import java.awt.event.*;
public class AwtTestFrame1b extends Panel {
private final Font font=new Font(Font.SANS_SERIF, Font.PLAIN, 16);
private final int line=25;
AwtTestFrame1b() {
setBackground(SystemColor.control);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
int py=0;
py=paintText(g2d,py,null ,false);
py=paintText(g2d,py,null ,true );
py+=line;
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
py+=line;
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
py+=line; …Run Code Online (Sandbox Code Playgroud) 我发现虽然在Java中渲染不透明文本(最新版本6u23)使用子像素AA就好了,渲染半透明文本却没有.
子像素AA:

只有颜色从0xFFFFFFFF变为0xBFFFFFFF的相同文本:

正如你所看到的,半透明文字显然是标准AA,而不是干净的半透明渲染,它具有可怕的'90年代"蜘蛛"外观.
这是由于一般的子像素AA的技术限制,还是Java中的错误,还是因为Java甚至没有尝试半透明文本,或者我错过了什么?
图形初始化
dbGraphics=(Graphics2D)dbImage.getGraphics();
if(dctRoot.properties.getBoolean("Antialias",true)) {
try {
Map hnts=(Map)(dctRoot.awtComponent.getToolkit().getDesktopProperty("awt.font.desktophints"));
// SET AA ON OVERALL (NOTE: GENERAL AA MUST BE OFF FOR SUBPIXEL AA TO BE HONORED - TEXT WIDGETS MUST DO THIS THEMSELVES)
dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
if(hnts!=null) {
// SET FONT RENDERING HINTS FROM DESKTOP
dbGraphics.addRenderingHints(hnts);
}
else {
try {
// SET TEXT AA TO FONT-SPECIFIED GASP AA (JAVA 6+)
dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null));
}
catch(Throwable thr3) {
// SET TEXT AA TO DEFAULT
dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
}
}
catch(Throwable thr) …Run Code Online (Sandbox Code Playgroud) 我在以下代码中遇到过Mithril.js:
finish(state == 1 && 3)
Run Code Online (Sandbox Code Playgroud)
对于我的(Java/C程序员)来说,它看起来应该总是调用,finish(true)如果state是1,finish(false)如果state不是1.但它实际上似乎是finish(3)针对前者和finish(false)后者.
这背后的逻辑是什么?
这是JavaScript中的惯用语,还是一个坏主意?对我而言,这是非常模糊的.
是否有一个免费的包,用于在Java中读取,操作和编写ASN.1?
肯定是:
我今天一直在研究Java内存模型,以便详细了解JMM pre-Java 5的问题以及Java 5中实现的JSR-133所做的更改.
我似乎无法找到明确答案的是特定同步所需的缓存失效和刷新的范围.
进入代码的任何同步部分时所有CPU寄存器和高速缓存都必须无效,并且在离开时全部刷新到主RAM,或者JVM是否只允许实际读取的那些变量无效,并且只刷新在同步代码块中实际写入的那些?
如果是前者,为什么JMM如此迂腐,坚持认为内存屏障只发生在同一个对象同步的两个线程之间?
如果是后者,是否有任何好的文件解释了如何实现这一目标的细节?(I将假设底层实现将具有在在同步块的开始CPU级别设定"旁路缓存"标志和结束时清除它,但我可能是方式关闭基地.)
java ×6
antialiasing ×2
javascript ×2
ajax ×1
asn.1 ×1
css ×1
firefox ×1
fonts ×1
mithril.js ×1
nimbus ×1
packages ×1
paint ×1
rendering ×1
reveal.js ×1
swing ×1