
试图移植到Ubuntu我的SWT应用程序,在windows中正常工作,我遇到了overlay scrollbars的问题。 当我从Eclipse下运行应用程序时,一切正常,滚动条看起来和行为正常。 但是,当我将应用程序打包到JAR并执行这个JAR ,应用程序中的滚动条将变成“叠加滚动条” ,看起来像一条细小的橙色条带,我需要处理的滚动条事件应该有一些奇怪的字段值,所以我的应用程序完全忽略它们。 这对我来说是不可接受的,对于我的应用来说,以一种特殊的,非标准的方式来处理滚动条是非常重要的,所以我需要正常的滚动条和正常的事件。
这个问题很容易通过将export liBOVERLAY_SCRolLbar=0添加到~/.profile来export liBOVERLAY_SCRolLbar=0 ,但我不想强制最终用户为了运行我的应用程序而自定义系统设置,我希望他们能够运行只需点击JAR即可。
我是linux编程新手,我不知道如何以编程方式设置环境。 配售
System.setProperty("liBOVERLAY_SCRolLbar","0");
在我的代码开始没有效果,也没有
Eclipse远程deBUGging无法连接到X服务器
Eclipse不使用.bashrc中设置的path
GDB在eclipse中不显示一些值
我可以运行在具有JRE 1.6的系统上使用Java 1.8构build的应用程序吗?
Ubuntu上Eclipse中的巨大选项卡
new ProcessBuilder("export liBOVERLAY_SCRolLbar=0").start();
如何从我的代码禁用此“重叠滚动条” ?
任何其他语言的PS解决scheme也许可能是一个线索
检测在Java中读取的文件
Eclipse内存usuage在windows Vs linux
Eclipse ADB错误
Eclipse返回错误消息“Java已启动,但返回退出代码= 1”
gdb远程deBUGging奇怪地失败
改变当前进程的环境变量(你的Java程序)是困难的,可能并不总是工作。 你可以做什么,是分发一个你的jar的shell脚本,linux上的人可以用它来启动你的应用程序。 像这样的事情应该做的伎俩:
#!/bin/sh export liBOVERLAY_SCRolLbar=0 java -jar yourjar.jar
有一些方法可以为当前正在运行的虚拟机设置环境变量,例如:
private static voID setEnv(Map<String,String> newEnv) throws Exception { Map<String,String> env = System.getenv(); Class<?> cl = env.getClass(); FIEld fIEld = cl.getDeclaredFIEld("m"); fIEld.setAccessible(true); @SuppressWarnings("unchecked") Map<String,String> envMap = (Map<String,String>) fIEld.get(env); envMap.putAll(newEnv); }
(这个想法来自于如何从Java设置环境变量的答案? )
然而在我的情况下,我需要env vars影响虚拟机外部执行的库,所以这种方法不能解决我的问题。
想了一下后,我意识到我想为JVM的父进程设置环境,所以我需要首先设置所需的变量,然后递归运行另一个JVM实例来执行我的应用程序 – 然后变量会影响即使他们的代码是在虚拟机之外执行的。
所以逻辑应该如下:
if (required vars are absent) { start a process that { set required vars; run another instance of the JVM with the application insIDe; } exit; } // here the vars already set do whatever we need in the proper environment
就Java而言,代码可能如下所示:
public class SecondVM { public static voID main(String[] args) { if ( System.getenv("SWT_GTK3") == null || System.getenv("liBOVERLAY_SCRolLbar") == null ) { URL classResource = SecondVM.class.getResource("SecondVM.class"); boolean fromJar = classResource.getProtocol().equals("rsrc"); String exePath = ClassLoader.getSystemClassLoader().getResource(".").getPath(); exePath = new file(exePath).getabsolutePath().replaceFirst("\.$","").replaceFirst("bin$",""); if (!exePath.endsWith(System.getProperty("file.separator"))) exePath += System.getProperty("file.separator"); String[] script = { "/bin/bash","-c","export SWT_GTK3=0; " + "export liBOVERLAY_SCRolLbar=0; " + (fromJar? // Todo: Put the proper paths,packages and class names here "java -jar " + exePath + "SecondVM.jar" : // if runs from jar "java -cp ./bin/:../Extlibs/swt_linux64/swt.jar " // if runs from under Eclipse or somewhat alike + "com.m_v.test.SecondVM") }; try { Process p = new ProcessBuilder(script).start(); // When jar is run from a bash script,it kills the second VM when exits. // Let it has some time to take a breath p.waitFor(12,TimeUnit.HOURS); } catch (Exception e) { e.printstacktrace(); } System.exit(0); } // Now the env vars are OK. We can use SWT with normal scrollbars display display = display.getDefault(); // .... do watever we need } }
在从shell脚本运行jar的情况下,我们必须等待子进程完成,然后才能退出原始进程,因此此解决方案会导致同时运行两个JVM实例的开销。 如果不需要提供从脚本运行的可能性,则p.waitFor(12,TimeUnit.HOURS); 可以用p.waitFor(12,TimeUnit.MILliSECONDS);替换p.waitFor(12,TimeUnit.MILliSECONDS); 或者也许根本就没有被删除(我没有测试过),所以我们可以有一个JVM的单一实例,就像通常的Java程序一样。
带有text小部件和scrollbar工作片段位于http://IDeone.com/eRjePQ
总结以上是内存溢出为你收集整理的如何以编程方式禁用重叠滚动条(Ubuntu Java)全部内容,希望文章能够帮你解决如何以编程方式禁用重叠滚动条(Ubuntu Java)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)