小编Rob*_*bin的帖子

过滤JTree

问题

对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和之间的链接JTree
  • 我还没有看到如何JTable使用RowFilter …

java swing jtree swingx

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

Java:如何检查Field是否为java.util.Collection类型

我有一个实用程序方法,遍历各种类并递归检索字段.我想检查该字段是否为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)

在此先感谢您的帮助.

java reflection types

21
推荐指数
2
解决办法
3万
查看次数

测试拖放文件到应用程序

我正在寻找一种方法,通过单元测试将文件/多个文件拖放到我的应用程序中.例如,在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)

java junit swing drag-and-drop junit4

18
推荐指数
1
解决办法
2507
查看次数

堆栈上无法访问的对象无法进行垃圾回收

违背我的期望,以下方案

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和 …

java garbage-collection jvm memory-leaks

9
推荐指数
1
解决办法
544
查看次数

SunToolkit.awtLock:需要在EDT上调用需要这种锁的代码

我正在调查死锁,并在线程转储中看到以下内容

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)

所以我想要清理的是:

  • 那个锁中谁是有兴趣的人?
  • 这个锁是否只是为了尝试使Swing/AWT多线程(或者至少更多线程安全)而被引入,但推荐的方法是避免在另一个线程上接受EDT的锁定吗?
  • 是否有可用的正式Oracle/Sun文档(类似于Swin中的Concurrency指南),我可以参考吗?我的谷歌技能在此失败了.

java swing awt

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

JTable#scrollRectToVisible与JSplitPlane组合显示错误的行

当我打电话时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)

java swing jtable jsplitpane

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

拖放JDK1.6和JDK1.7之间的差异

有没有人知道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)

java swing drag-and-drop java-7

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

带有TexturePaint的图标会抛出InternalError:Surface无法缓存

我有一个自定义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)

java swing awt java-2d graphics2d

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

检查单元测试是否委派了所有方法

假设我有以下课程

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.我希望每次添加一个 …

java unit-testing decorator mockito

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

如何从我的包用户的导入语句中删除输出文件夹?

我有一个基于 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 …

node.js npm node-modules typescript

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