我正在尝试用图像和提示创建一些看起来更漂亮的JTextFields.为此,我做了一个覆盖paintComponent方法的装饰器.我使用装饰器的原因是我想将它应用于其他类型的JTextField,例如JPasswordField.
这是我到目前为止所做的;

左边的表格中看到的问题是,即使我使用了JPasswordField,paintComponent也似乎忽略了我所假设的密码paintComponent,它可能是密码屏蔽符号.
所以问题是,如何避免重复JTextFields和JPasswordFields的代码,但仍然具有不同的功能,如密码屏蔽.
这是装饰器代码;
public class JTextFieldHint extends JTextField implements FocusListener{
private JTextField jtf;
private Icon icon;
private String hint;
private Insets dummyInsets;
public JTextFieldHint(JTextField jtf, String icon, String hint){
this.jtf = jtf;
setIcon(createImageIcon("icons/"+icon+".png",icon));
this.hint = hint;
Border border = UIManager.getBorder("TextField.border");
JTextField dummy = new JTextField();
this.dummyInsets = border.getBorderInsets(dummy);
addFocusListener(this);
}
public void setIcon(Icon newIcon){
this.icon = newIcon;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int textX = 2;
if(this.icon!=null){
int iconWidth = icon.getIconWidth();
int iconHeight = icon.getIconHeight(); …Run Code Online (Sandbox Code Playgroud) 我有一个gruntfile设置,以便我可以开发我的本地angularjs前端,同时将所有api请求转发到在网络上单独托管的java中间层.
这很好用,除了服务器的位置每隔几天更改一次,我必须不断更新gruntfile和最新的服务器位置.
最新的服务器位置可以通过URL缩短服务找到,该服务转发到正确的位置,因此我可以使用这个grunt task/node.js代码获取它:
grunt.registerTask('setProxyHost', 'Pings the url shortener to get the latest test server', function() {
request('http://urlshortener/devserver', function(error, response, body) {
if (!error) {
var loc = response.request.uri.href;
if (loc.slice(0, 7) === 'http://') {
proxyHost = loc.slice(7, loc.length - 1);
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
当然这是异步的,当我运行它时,grunt已经在请求完成时设置了代理.
如何同步运行此nodejs请求或阻止grunt直到它完成?这只是为了开发,所以欢迎hacky解决方案.
谢谢
编辑:
伟大的答案Cory,这已经解决了这个问题,因为grunt现在等待任务完成才能继续.最后一个问题是我无法从initConfig访问该配置来设置代理,因为initConfig首先运行:
module.exports = function(grunt) {
[...]
grunt.initConfig({
connect: {
proxies: [{
host: grunt.config.get('proxyHost')
Run Code Online (Sandbox Code Playgroud)
这篇文章(initConfig()中的Access Grunt配置数据)概述了这个问题,但我不确定如何在任务之外同步运行请求?
EDIT2 [已解决]:
Corys回答+这篇文章以编程方式将参数传递给grunt任务?为我解决了这个问题.
module.exports = function(grunt) {
[...]
grunt.initConfig({
connect: {
proxies: …Run Code Online (Sandbox Code Playgroud)