小编Joo*_*kka的帖子

使用Jython和Swing处理事件

我正在使用来自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)

它有效,但优雅已经消失.所有这一切只是因为被调用的方法需要从某个地方进行引用.还有其他方法吗?

python java user-interface swing jython

8
推荐指数
1
解决办法
2567
查看次数

在知道类时创建(盒装)原始实例

我需要一个方法来返回提供的类类型的实例.让我们假设提供的类型被限制为可以创建它们的"空"实例.例如,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构造函数).

java primitive boxing types class

8
推荐指数
1
解决办法
2136
查看次数

JDBC get/setObject与get/setSpecificType

JDBC ResultSet提供了getObject,getInt,getString等方法,而PreparedStatement具有类似的setter.除了类型编译时类型安全之外,类型特定的getter/setter是否具有任何(dis)优势,或者可以在任何地方使用getObject/setObject吗?

java types jdbc

8
推荐指数
1
解决办法
3003
查看次数

使用java.lang.reflect.getMethod和多态方法

请考虑以下代码段:

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)在查询 …

java reflection polymorphism

8
推荐指数
1
解决办法
3045
查看次数

使JPopupMenu的子菜单重量级

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项目放入其中.

我如何使子菜单重量级?

swing popup submenu

8
推荐指数
1
解决办法
1125
查看次数

readObject()与readResolve()一起恢复瞬态字段

根据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)

java serialization transient

7
推荐指数
1
解决办法
4368
查看次数

在CLI PHP脚本中使用输出缓冲时打印到终端

我正在使用命令行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)

但是,我还想将一些消息打印到终端(例如,警告),同时将"主输出"收集到缓冲区中.有没有办法做到这一点?似乎暂时不能暂停缓冲以打印终端消息,然后从剩下的位置继续缓冲.这有什么解决方法吗?

php command-line

6
推荐指数
2
解决办法
7619
查看次数

为什么EventListenerList在fireFooXXX()中向后遍历?

我不明白这段代码的基本原理,取自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)
  1. 为什么列表会向后移动?
  2. 为什么只有每一个听众被叫?

事件触发在javax.swing.tree.DefaultTreeModel等中以这种方式实现,所以显然我只是没有得到什么.

java swing event-listener

6
推荐指数
2
解决办法
1388
查看次数

ArrayList的数组与ArrayLists的数组相似

我正在创建一个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的新数组(以表示新行).还是有一个明显的,更好的解决方案?

java arrays arraylist tablemodel data-structures

6
推荐指数
1
解决办法
1万
查看次数

如何控制$ py.class文件的位置?

在第一次导入模块时,Jython 在与相应文件相同的目录中创建$py.class文件(相当于Jython .pyc).py.

当进程没有写入该目录的权限时(一切正常,但没有$py.class文件,以及下次的过度编译),就会出现问题.一般来说,我感到不安的是,一个进程自动被认为对该目录有写权限,从中读取要运行的代码.

是否有任何技巧使Jython将编译后的文件写入某个专用缓存目录?此问题之前已在Jython邮件列表中提出过,但到目前为止还没有回复......

jython pyc

6
推荐指数
1
解决办法
2381
查看次数