对a应用过滤JTree以避免某些节点/叶子出现在渲染版本中JTree.理想情况下,我正在寻找一个允许动态过滤器的解决方案,但如果我能让静态过滤器工作,我会很高兴.
为了使它更容易一些,让我们假设JTree只支持渲染,而不是编辑.应该可以移动,添加,删除节点.
一个例子是a上面的搜索字段JTree,而在键入时,JTree只显示带有匹配的子树.
一些限制:它将用于可以访问JDK和SwingX的项目中.我想避免包含其他第三方库.
我已经想到了一些可能的解决方案,但这些都不是理想的
基于模型的过滤
TreeModel以过滤掉一些值.快速而简单的版本很容易编写.过滤掉节点,并且在过滤器或委托TreeModel的每次更改时,装饰器都可以触发整个树发生变化的事件(treeStructureChanged根节点作为节点).将它与恢复选择状态和扩展状态的侦听器相结合JTree,你会得到一个或多或少有效的版本,但是来自它的事件TreeModel都搞砸了.这或多或少是这个问题中使用的方法TreeModel但尝试点燃正确的事件.我(还)没有设法提出这个的工作版本.它似乎需要委托的副本,TreeModel以便能够在从委托模型中删除节点时使用正确的子索引触发事件.我认为有更多的时间我可以让它工作,但它只是感觉不对(过滤感觉像视图应该做的事情,而不是模型)TreeModel.但是,这完全是不可重用的,并且可能和编写装饰器一样困难TreeModel基于视图的过滤
这似乎是要走的路.过滤不应影响模型,只影响视图.
我看了RowFilter上课.虽然javadoc似乎建议你可以结合使用它JTree:
当与JTree相关联时,条目对应于节点.
我找不到RowFilter(或RowSorter)和JTree班级之间的任何联系.RowFilterSwing教程的标准实现似乎表明RowFilter只能直接使用JTable(参见参考资料JTable#setRowSorter).没有类似的方法可供选择JTree
JXTreejavadoc.它有一个ComponentAdapter可用的,并且javadoc ComponentAdapter表示RowFilter可以与目标组件进行交互,但我看不出如何建立RowFilter和之间的链接JTreeJTable使用RowFilter …我有一个实用程序方法,遍历各种类并递归检索字段.我想检查该字段是否为Collection.以下是一些示例代码:
void myMethod(Class<?> classToCheck)
Field[] fields = classToCheck.getDeclaredFields();
for(Field field:fields)
{
// check if field if a Collection<?>
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
我正在寻找一种方法,通过单元测试将文件/多个文件拖放到我的应用程序中.例如,在Windows资源管理器中选择一些文件,将它们拖放到我的应用程序中.
我能够在我的应用程序中测试两个组件之间的拖放行为(见下文 - 随意指出你是否知道更好的方法),但我不知道如何在数据必须来自时做同样的事情在我的申请之外.
Transferable当我手动执行拖放操作时,我想过使用调试器来检查'文件' ,但是必须有更好的方法然后硬编码完整Transferable.
组件之间的拖放测试示例
import org.junit.Test;
import javax.swing.Action;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import java.awt.event.ActionEvent;
import static org.junit.Assert.assertEquals;
public class DragAndDropTest {
@Test
public void dragAndDropBetweenTwoTextFields() {
JTextField firstField = new JTextField();
JTextField secondField = new JTextField();
String testText = "Test text";
firstField.setText( testText );
firstField.selectAll();
Action copyAction = TransferHandler.getCopyAction();
copyAction.actionPerformed( new ActionEvent( firstField, ActionEvent.ACTION_PERFORMED, "Copy" ) );
Action pasteAction = TransferHandler.getPasteAction();
pasteAction.actionPerformed( new ActionEvent( secondField, ActionEvent.ACTION_PERFORMED, "Paste" ) );
assertEquals( "Text is not copied", …Run Code Online (Sandbox Code Playgroud) 违背我的期望,以下方案
import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.List;
public class StackTest {
public static void main(String[] args) {
Object object1 = new Object();
Object object2 = new Object();
List<Object> objects = Arrays.asList(object1, object2);
WeakReference<Object> ref1 = new WeakReference<>(object1);
WeakReference<Object> ref2 = new WeakReference<>(object2);
for (Object o : objects) {
System.out.println(o);
}
objects = null;
object1 = null;
object2 = null;
System.gc();
System.gc();
System.gc();
System.out.println("ref1: " + ref1.get());
System.out.println("ref2: " + ref2.get());
}
}
Run Code Online (Sandbox Code Playgroud)
仍打印出来
ref1: java.lang.Object@15db9742
ref2: java.lang.Object@6d06d69c
Run Code Online (Sandbox Code Playgroud)
这意味着object1和 …
我正在调查死锁,并在线程转储中看到以下内容
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XRobotPeer.setup(Native Method)
- locked <0x00000000a633fbd0> (a java.lang.Class for sun.awt.X11.XRobotPeer)
at sun.awt.X11.XRobotPeer.<init>(XRobotPeer.java:24)
at sun.awt.X11.XToolkit.createRobot(XToolkit.java:683)
at java.awt.Robot.init(Robot.java:119)
at java.awt.Robot.<init>(Robot.java:77)
Run Code Online (Sandbox Code Playgroud)
这是由呼叫引起的 Robot robot = new Robot();
这个调用需要一个lock(SunToolkit.awtLock),我想知道还有谁在使用那个锁,如果我把那个new Robot()调用移到EDT 会更好.该名称表明AWT使用它是单线程的.如果EDT上的某些内容也采用了这种锁(例如Swing组件),那么当我创建RobotEDT 时,我遇到死锁的几率会增加.
另一方面,正如在这个问题中讨论的那样,许多Robot方法被设计为在EDT上调用时抛出异常.如果您最好Robot在EDT上创建实例,这会让人讨厌.
存在同样的问题,Toolkit.getDefaultToolkit().getScreenResolution()所以不需要只关注这个Robot类:
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XToolkit.getScreenResolution(XToolkit.java:999)
Run Code Online (Sandbox Code Playgroud)
所以我想要清理的是:
当我打电话时JTable#scrollRectToVisible,我想要显示的行在某些情况下隐藏在标题下方.
这个问题的其余部分仅在使用以下代码时才有意义.这是一个非常简单的程序,我用它来说明问题.它显示了一个UI JSplitPane,其上部包含一些控制按钮,下部包含一个JTable包裹在a中的JScrollPane(参见本文底部的屏幕截图).
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class DividerTest {
private final JSplitPane fSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
private final JTable fTable;
private final JScrollPane fScrollPane;
private boolean fHideTable = false;
public DividerTest() {
fTable = new JTable( createTableModel(50));
fScrollPane = new JScrollPane(fTable);
fSplitPane.setBottomComponent(fScrollPane);
fSplitPane.setTopComponent(createControlsPanel());
fSplitPane.setDividerLocation(0.5);
}
private JPanel createControlsPanel(){
JPanel result = new JPanel();
result.setLayout(new BoxLayout(result, BoxLayout.PAGE_AXIS));
final JCheckBox checkBox …Run Code Online (Sandbox Code Playgroud) 有没有人知道JDK1.6和JDK1.7之间的拖放行为的差异?将URL从浏览器拖放到需要支持JDK1.5,JDK1.6和JDK1.7的应用程序时,我遇到了不同(如下图所示).我现在想知道是否存在其他差异以及是否在某处记录了这些差异.
我遇到的不同行为是通过点击并拖动URL到Java应用程序来拖放来自浏览器(而不是来自地址栏但来自页面)的URL.在JDK1.6上,Transferable不支持它DataFlavor.javaFileListFlavor和它在JDK1.7上(尽管在请求它的传输数据时你得到一个空列表).以下代码说明了该问题.它打开一个JFrame可以拖放URL,如http://www.google.com,并打印出是否使用文件列表风格或URI列表风格
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.TransferHandler;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class DragAndDropTester {
private static DataFlavor URI_LIST_FLAVOR = null;
static {
try {
URI_LIST_FLAVOR = new DataFlavor( "text/uri-list;class=java.lang.String" );
}
catch ( ClassNotFoundException ignore ) {
}
}
public static void main( String[] args ) {
try {
EventQueue.invokeAndWait( new Runnable() {
public …Run Code Online (Sandbox Code Playgroud) 我有一个自定义Icon其使用TexturePaint的油漆,并调用fillPolygon一个上Graphics2D对象.
这段代码在JDK6和JDK7上运行良好,但在64位Linux的JDK8下失败(在64位Linux上尝试了最新的JDK1.8).在Windows上,这适用于JDK8.
java -version用于重现问题的JDK命令的输出.
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
重现问题的代码:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class TexturePaintIconTest {
private static class CustomIcon implements Icon{
private static final int[] sXArray = new int[]{2, 5, 7, 12, 12, 4, 1, 1, 2};
private static final int[] sYArray = new int[]{4, 4, 2, 2, 11, 11, 8, 5, 4}; …Run Code Online (Sandbox Code Playgroud) 假设我有以下课程
public abstract class Foo{
public int bar(){
//implementation
}
public abstract int bar2();
}
Run Code Online (Sandbox Code Playgroud)
和一个基类,以便更容易为此类编写装饰器
public class FooWrapper{
private final Foo delegate;
protected FooWrapper( Foo delegate ){
this.delegate = delegate;
}
@Override
public int bar(){
return delegate.bar()
}
@Override
public int bar2(){
return delegate.bar2();
}
}
Run Code Online (Sandbox Code Playgroud)
该类FooWrapper允许您编写装饰器,Foo只覆盖您需要的方法.
现在我想编写一个测试FooWrapper,检查是否默认委派所有方法.当然我可以写一些类似的东西
@Test
public void barShouldBeDelegated(){
Foo delegate = Mockito.mock( Foo.class );
FooWrapper wrapper = new FooWrapper( delegate );
wrapper.bar();
Mockito.verify( delegate ).bar();
}
Run Code Online (Sandbox Code Playgroud)
但这需要我在每次添加方法时添加新的测试方法Foo.我希望每次添加一个 …
我有一个基于 Typescript 的项目,其中包含多个.d.ts文件,我想将这些文件导出为npm包并在另一个项目中使用。
在另一个项目中,我希望能够调用:
import {Foo} from "@my-company/project-name/x/y/Foo"
Run Code Online (Sandbox Code Playgroud)
我的项目结构如下:
<project_root>
|_ node_modules
|_ src
| |_ x
| |_ y
| | |_ Foo.ts
| |_ Bar.ts
|_ package.json
|_ tsconfig.json
Run Code Online (Sandbox Code Playgroud)
我的tsconfig.json文件:
{
"compilerOptions": {
"module": "es2015",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"declaration": true
},
"lib": ["es2015"],
"include": [
"src"
],
"exclude": [
"node_modules"
]
}
Run Code Online (Sandbox Code Playgroud)
运行的结果是创建tsc了一个dist包含d.ts文件和.js文件的文件夹。运行时npm pack,我最终得到一个.tgz …
java ×9
swing ×6
awt ×2
decorator ×1
graphics2d ×1
java-2d ×1
java-7 ×1
jsplitpane ×1
jtable ×1
jtree ×1
junit ×1
junit4 ×1
jvm ×1
memory-leaks ×1
mockito ×1
node-modules ×1
node.js ×1
npm ×1
reflection ×1
swingx ×1
types ×1
typescript ×1
unit-testing ×1