我正在使用来自Jython的Swing制作GUI.事件处理似乎从Jython特别优雅,只是设置
JButton("Push me", actionPerformed = nameOfFunctionToCall)
Run Code Online (Sandbox Code Playgroud)
但是,在课堂上尝试同样的事情变得困难.天真的尝试
JButton("Push me", actionPerformed = nameOfMethodToCall)
Run Code Online (Sandbox Code Playgroud)
要么
JButton("Push me", actionPerformed = nameOfMethodToCall(self))
Run Code Online (Sandbox Code Playgroud)
从类的GUI构造方法不起作用,因为要调用的方法的第一个参数应该是self,以便访问类的数据成员,另一方面,它不可能通过通过AWT事件队列的事件处理程序的任何参数.唯一的选择似乎是使用lambda(在http://www.javalobby.org/articles/jython/上建议),结果是这样的:
JButton("Push me", actionPerformed = lambda evt : ClassName.nameOfMethodToCall(self))
Run Code Online (Sandbox Code Playgroud)
它有效,但优雅已经消失.所有这一切只是因为被调用的方法需要从某个地方进行自引用.还有其他方法吗?
我需要一个方法来返回提供的类类型的实例.让我们假设提供的类型被限制为可以创建它们的"空"实例.例如,supply String.class将返回一个空String,提供一个Integer.class返回一个初始值为零的Integer,依此类推.但是我如何动态创建(盒装)原始类型?像这样?
public Object newInstance(Class<?> type) {
if (!type.isPrimitive()) {
return type.newInstance(); // plus appropriate exception handling
} else {
// Now what?
if (type.equals(Integer.class) || type.equals(int.class)) {
return new Integer(0);
}
if (type.equals(Long.class) // etc....
}
}
Run Code Online (Sandbox Code Playgroud)
迭代所有可能的原始类型的唯一解决方案,还是有更简单的解决方案?请注意两者
int.class.newInstance()
Run Code Online (Sandbox Code Playgroud)
和
Integer.class.newInstance()
Run Code Online (Sandbox Code Playgroud)
抛出一个InstantiationException(因为他们没有nullary构造函数).
JDBC ResultSet提供了getObject,getInt,getString等方法,而PreparedStatement具有类似的setter.除了类型编译时类型安全之外,类型特定的getter/setter是否具有任何(dis)优势,或者可以在任何地方使用getObject/setObject吗?
请考虑以下代码段:
public class ReflectionTest {
public static void main(String[] args) {
ReflectionTest test = new ReflectionTest();
String object = new String("Hello!");
// 1. String is accepted as an Object
test.print(object);
// 2. The appropriate method is not found with String.class
try {
java.lang.reflect.Method print
= test.getClass().getMethod("print", object.getClass());
print.invoke(test, object);
} catch (Exception ex) {
ex.printStackTrace(); // NoSuchMethodException!
}
}
public void print(Object object) {
System.out.println(object.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
getMethod()显然不知道a String可以被提供给一个期望的方法Object(事实上,它的文档说它寻找具有指定名称和完全相同的形式参数类型的方法).
是否有一种直接的方法来反复查找方法,就像getMethod()这样,但考虑到多态性,以便上面的反射示例可以print(Object)在查询 …
http://java.sun.com/products/jfc/tsc/articles/mixing/index.html建议如何制作JPopupMenu重量级人物.只需设置属性:
setLightWeightPopupEnabled(false);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我在弹出窗口中有子菜单,作为JMenu项目实现,它们似乎不会继承弹出窗口的重量级.JMenu没有让自己重量级的方法,并且使用AWT Menu不是一个选项,因为我想把Swing项目放入其中.
我如何使子菜单重量级?
根据Serializable javadoc,readResolve()用于替换从流中读取的对象.(?),但你肯定不具备更换对象,因此,它是确定以使用它恢复瞬态字段,并返回原来的参考,像这样:
private Object readResolve() {
transientField = something;
return this;
}
Run Code Online (Sandbox Code Playgroud)
而不是使用readObject():
private void readObject(ObjectInputStream s) {
s.defaultReadObject();
transientField = something;
}
Run Code Online (Sandbox Code Playgroud)
当用于恢复瞬态场时,是否有任何理由选择其他?实际上我倾向于readResolve()因为它不需要参数,因此在构造"正常"时也可以很容易地使用它,在构造函数中如下:
class MyObject {
MyObject() {
readResolve();
}
...
}
Run Code Online (Sandbox Code Playgroud) 我正在使用命令行PHP来离线构建一些文件.要捕获脚本输出,我使用标准的ob_start:
ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file
Run Code Online (Sandbox Code Playgroud)
但是,我还想将一些消息打印到终端(例如,警告),同时将"主输出"收集到缓冲区中.有没有办法做到这一点?似乎暂时不能暂停缓冲以打印终端消息,然后从剩下的位置继续缓冲.这有什么解决方法吗?
我不明白这段代码的基本原理,取自javax.swing.event.EventListenerList docs:
protected void fireFooXXX() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==FooListener.class) {
// Lazily create the event:
if (fooEvent == null)
fooEvent = new FooEvent(this);
((FooListener)listeners[i+1]).fooXXX(fooEvent);
}
}
}
Run Code Online (Sandbox Code Playgroud)
事件触发在javax.swing.tree.DefaultTreeModel等中以这种方式实现,所以显然我只是没有得到什么.
我正在创建一个TableModel,它将具有固定数量的列,但行数将会发生变化(大多数情况下,随着时间的推移而增加).哪种方法可以更好地存储数据,
ArrayList[] columns = new ArrayList[numberOfColumns];
// Each array element is one column. Fill each of them with a new ArrayList.
...
public Object getValueAt(int row, int column) {
return columns[column].get(row);
}
Run Code Online (Sandbox Code Playgroud)
即创建一个ArrayLists 数组,每个数组ArrayList代表一列,或者:
ArrayList<Object[]> rows = new ArrayList<Object[]>();
// Each ArrayList element is one row.
public Object getValueAt(int row, int column) {
return rows.get(row)[column];
}
Run Code Online (Sandbox Code Playgroud)
即创建一个包含数组的ArrayList,每个数组代表一行.
有哪些想法在速度或存储方面更有效?备选方案1要求ArrayList在每个添加的行中扩展N s,而备选方案2要求仅扩展一个,ArrayList但也创建长度为N的新数组(以表示新行).还是有一个明显的,更好的解决方案?
在第一次导入模块时,Jython 在与相应文件相同的目录中创建$py.class文件(相当于Jython .pyc).py.
当进程没有写入该目录的权限时(一切正常,但没有$py.class文件,以及下次的过度编译),就会出现问题.一般来说,我感到不安的是,一个进程自动被认为对该目录有写权限,从中读取要运行的代码.
是否有任何技巧使Jython将编译后的文件写入某个专用缓存目录?此问题之前已在Jython邮件列表中提出过,但到目前为止还没有回复......
java ×7
swing ×3
jython ×2
types ×2
arraylist ×1
arrays ×1
boxing ×1
class ×1
command-line ×1
jdbc ×1
php ×1
polymorphism ×1
popup ×1
primitive ×1
pyc ×1
python ×1
reflection ×1
submenu ×1
tablemodel ×1
transient ×1