我正在构建一个Java应用程序,它使用用C++编写的共享库,并为不同的操作系统编译.问题是,这个共享库本身依赖于它通常在适当的环境变量(PATH,LIBRARY_PATH或LD_LIBRARY_PATH)下找到的附加库.
我可以 - 但不想 - 设置这些环境变量.我宁愿在运行时从给定路径加载所需的共享库 - 就像插件一样.不 - 我不希望任何启动应用程序在新环境中启动新进程.有谁知道如何实现这一目标?
我知道这一定是可能的,因为我使用的库之一能够从给定路径加载其插件.当然我更喜欢与平台无关的代码,但如果不可能,Windows,Linux和MacOS的单独解决方案也会这样做.
编辑 我应该提到我希望使用的共享库是面向对象的,这意味着单个函数的绑定不会这样做.
我想将属性添加到现有的实例中JsonObject.如果是这个属性boolean,这很容易:
JsonObject jo = ....;
jo.put("booleanProperty", JsonValue.TRUE);
Run Code Online (Sandbox Code Playgroud)
但是,我也想添加一个,JsonNumber但我找不到创建实例的方法JsonNumber.这是我能做的:
JsonObjectBuilder job = Json.createObjectBuilder();
JsonNumber jn = job.add("number", 42).build().getJsonNumber("number");
jo.put("numberProperty", jn);
Run Code Online (Sandbox Code Playgroud)
但我想不出一个更脏的方式来完成我的任务.那么 - 是否有更直接,更清晰的方法来添加JsonNumber到现有的实例JsonObject?
Nimbus通常看起来很棒,但对于某些颜色组合,结果是非最佳的.在我的情况下,a的背景JPopupMenu不适合,这就是我想手动设置的原因.
我在Java 7上,有趣的是,Nimbus完全忽略了UIManager(像PopupMenu.background)中某些属性的设置.所以我唯一的选择是创建JPopupMenu该覆盖的子类paintComponent(...).我知道,那很讨厌,但至少它起作用了.
但是,如果你添加一个JMenu到另一个菜单,它嵌入它自己的实例,JPopupMenu我无法弄清楚如何用我自己的子类替换它.
即使PopupMenuUI为嵌入式实例分配自己也没有带来任何结果.如果直接从JPopupMenuoverriden paint(...)方法继承而被调用,但是,无论我做了什么,都没有绘制.如果继承的javax.swing.plaf.synth.SynthPopupMenuUI paint甚至没有被调用,结果就是我根本没有设置自己PopupMenuUI.
所以简单的问题是:如何JPopupMenu使用Nimbus作为L&F,在Java 7上调整一个或者(如果这更容易)的背景颜色?
编辑:代码示例
看一下下面的代码和结果:
public static void main(final String[] args) {
try {
UIManager.setLookAndFeel(NimbusLookAndFeel.class.getCanonicalName());
UIManager.getLookAndFeelDefaults().put("PopupMenu.background", Color.GREEN);
UIManager.getLookAndFeelDefaults().put("Panel.background", Color.RED);
UIManager.getLookAndFeelDefaults().put("List.background", Color.BLUE);
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
JList …Run Code Online (Sandbox Code Playgroud) 我花了很多时间用谷歌搜索,现在我会在这里试试.你们中的一些人可能知道Microsoft Visual Studio中可用的"区域",它们允许您将代码的任意部分折叠成一行,或多或少像
// [start] The text which will appear instead of the collapsed part
...
A bunch of lines of code
...
// [end]
Run Code Online (Sandbox Code Playgroud)
在我看来,这是一个非常好的评论代码的方法,但它似乎不适用于Java和Eclipse.但是,有是对于一个插件(点击),但它不与Eclipse赫利俄斯工作.
所以这是我的问题:你知道在当前版本的eclipse中实现这种代码折叠的方法吗?
我正在使用Autoconf来构建我的c ++项目.它使用第三方代码,也是在Autoconf/Automake的帮助下构建的.所以在我的configure.ac我有以下几行:
AC_CONFIG_SUBDIRS([subdirectoryname])
Run Code Online (Sandbox Code Playgroud)
一切正常,但我也使用该功能让测试自动make check执行 - 这也是由第三方代码完成的.因为这些测试需要一段时间,所以每次我想测试自己的代码时执行它们都很烦人.那么有什么方法可以避免将check选项传递给子目录Makefile?
更新:覆盖check-recursive似乎不是一个选项,因为我的顶级Makefile.am看起来(或多或少)像这样:
SUBDIRS=library src
Run Code Online (Sandbox Code Playgroud)
因此禁用此级别的检查也会禁用我的src文件夹内的检查.这不是我想要实现的目标.我只是想禁用library目录中的检查.
我有一段代码用于将字符串表示Class.getCanonicalName()转换为相应的实例Class.这通常可以使用ClassLoader.loadClass("className").但是,它在原始类型上失败了ClassNotFoundException.我遇到的唯一解决方案是这样的:
private Class<?> stringToClass(String className) throws ClassNotFoundException {
if("int".equals(className)) {
return int.class;
} else if("short".equals(className)) {
return short.class;
} else if("long".equals(className)) {
return long.class;
} else if("float".equals(className)) {
return float.class;
} else if("double".equals(className)) {
return double.class;
} else if("boolean".equals(className)) {
return boolean.class;
}
return ClassLoader.getSystemClassLoader().loadClass(className);
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很讨厌,所以有什么干净的办法吗?
作为定义:两组的笛卡尔乘积是这些集合的所有可能对的集合,因此{A,B} x {a,b} = {(A,a),(A,b),(B,a ),(b,b)}.
现在我想将这样的笛卡尔积插入数据库表(每对作为一行).它旨在用每个对的默认值填充表,因此此时数据(即两组)不存在于数据库中.
任何想法如何用postgresql实现这一点?
编辑:
在Grzegorz Szpetkowski的回答的帮助下,我能够生成一个能够实现我想要实现的目标的查询,但它确实不是最漂亮的查询.假设我要插入集合{1,2,3}和{'A','B','C'}的笛卡尔积.
INSERT INTO "Test"
SELECT * FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3) P
CROSS JOIN
(SELECT 'A' UNION SELECT 'B' UNION SELECT 'C') Q
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
编辑2: 接受的答案很好,但我发现另一个版本,如果它变得更复杂可能是适当的:
CREATE TEMP TABLE "Numbers" (ID integer) ON COMMIT DROP;
CREATE TEMP TABLE "Chars" (Char character varying) ON COMMIT DROP;
INSERT INTO "Numbers" (ID) VALUES (1),(2),(3);
INSERT INTO "Chars" (Char) VALUES ('A'),('B'),('C');
INSERT INTO "Test"
SELECT * FROM
"Numbers"
CROSS JOIN …Run Code Online (Sandbox Code Playgroud) 关于JSON是Object Literal Notation的子集,stackoverflow上有一些问题浮现在这里.但我找不到我的具体问题的答案.
两者之间有什么区别吗?
var obj = {keyName : "value"};
Run Code Online (Sandbox Code Playgroud)
和
var obj = {"keyName" : "value"};
Run Code Online (Sandbox Code Playgroud)
在JavaScript?
SharedWorker 接口代表一种特定类型的工作人员,可以从多个浏览上下文(例如多个窗口、iframe甚至工作人员)访问它。
对我来说,这听起来好像 SharedWorkers 应该能够直接交换消息。但是,如果我尝试从另一个 SharedWorker 中访问 SharedWorker,即使用
var worker = new SharedWorker("path/to/file.js");
Run Code Online (Sandbox Code Playgroud)
我明白了
ReferenceError:SharedWorker 未定义
我只是误读了文档,还是有其他方法可以做到这一点?
我认为这是一个简单的问题,但它让我发疯:我想从一个方法返回多个数组,调用方法事先并不知道它们的大小.所以我必须在方法中创建那些数组(与仅填充它们相反)并且我无法使用它们返回它们return.
所以我想要的是这样的方法签名:
void giveMeArray(int[] *anArray)
Run Code Online (Sandbox Code Playgroud)
方法签名只有一个参数来简化示例,请假设我也可以有一个签名
void giveMeArrays(int[] *anArray, float[] *anotherArray)
Run Code Online (Sandbox Code Playgroud)
在该方法内部,giveMeArray我将构造数组
*anArray = new int[5];
Run Code Online (Sandbox Code Playgroud)
我会用这个方法来调用
int[] result;
giveMeArray(&result);
Run Code Online (Sandbox Code Playgroud)
但是,所有这些(从方法签名开始)至少在语法上是错误的.请原谅我现在手头没有编译错误,我很确定你们中的一些人会知道什么是错的.
编辑我知道 std :: vector将是最好的(意思是最干净的)方法.然而,伙计们,这不是问题.
java ×4
c++ ×3
javascript ×2
arrays ×1
autoconf ×1
automake ×1
classloader ×1
eclipse ×1
folding ×1
jpopupmenu ×1
json ×1
nimbus ×1
node.js ×1
object ×1
plugins ×1
postgresql ×1
sql ×1
swing ×1
web-worker ×1