小编Sam*_*yer的帖子

使用JavaFX在任何地方处理鼠标事件

我有一个JavaFX应用程序,我想在场景中的任何地方添加一个鼠标单击的事件处理程序.以下方法可以正常工作,但不完全按我想要的方式工作.这是一个说明问题的示例:

public void start(Stage primaryStage) {
    root = new AnchorPane();
    scene = new Scene(root,500,200);
    scene.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("mouse click detected! "+event.getSource());
        }
    });

    Button button = new Button("click here");
    root.getChildren().add(button);

    primaryStage.setScene(scene);
    primaryStage.show();
}
Run Code Online (Sandbox Code Playgroud)

如果我单击空白处的任何位置,则EventHandler调用该handle()方法,但如果单击buttonhandle()方法,则不会调用该方法.我的应用程序中有许多按钮和其他交互元素,因此我需要一种方法来捕获这些元素的点击,而无需为每个元素手动添加新的处理程序.

java javafx event-handling mouseevent

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

R测试单元测试数据和辅助函数约定

我正在写一个R包,我正在使用testthat进行单元测试.我的许多单元测试用于测试特定于我的包的特定对象的函数.对于这些测试,我已经创建了一个帮助函数来设置模拟对象.我还有一些其他辅助函数来减少单元测试中的代码量.

目前这些辅助函数位于我的R/文件夹中,因为它们可用于我的单元测试文件(在其中tests/testthat/).我发现放置仅用于R/文件夹中的单元测试的函数有点奇怪.如果可以将它们放在tests/文件夹中的某个位置会很好.但似乎这样做会使单元测试期间无法使用它们.请注意,这些辅助函数用于几个不同的测试文件,因此只需将辅助函数放在包含单元测试的一个文件的顶部就不是解决方案.

另一个相关问题是放置用于单元测试的数据文件的位置.例如,我的一些函数处理ExpressionSet来自limma包的对象(在Bioconductor上可用),我在使用该load()函数进行单元测试期间将其加载到R中.目前我将它们放在inst/extdata文件夹中,因为我可以system.file()在单元测试期间访问它们.此文件夹还包含其他数据文件,这些文件适用于程序包的用户.我觉得把我的测试数据放在与最终用户相同的位置,这与最终用户无关.

所以我的问题是,是否可以将单元测试辅助函数和测试数据全部放在tests/目录中.如果是这样,我如何从单元测试中访问这些文件?单元测试助手和单元测试数据的最佳实践/约定是什么?

unit-testing r testthat

15
推荐指数
1
解决办法
2185
查看次数

我可以使用输入模块在python中为类型构造函数创建类型别名吗?

从python版本3.5开始,您可以使用类型提示来指示函数期望的参数类型.我发现这些类型提示对于文档目的非常有价值,所以我尝试尽可能多地使用它们.它们还有助于linter,因此可以定期使我免受代码更改引入的错误的影响.

例如,在我的代码中,我有一些函数将零参数函数作为参数.例如:

def onReady(f: Callable[[], Any]) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

要么

def checkIfReady(f: Callable[[], Bool]) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个类似的别名(下面的代码是无效的python):

Action[A] = Callable[[], A]
Run Code Online (Sandbox Code Playgroud)

然后我可以缩短上面参数的类型:

def onReady(f: Action[Any]) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

我知道我可以为特定实例创建一个类型别名,例如:

ActionBool = Callable[[], bool]
Run Code Online (Sandbox Code Playgroud)

我知道是否存在等的NewTypetyping的模块,但这些都不似乎推广到更高阶的类型.

python

10
推荐指数
1
解决办法
392
查看次数

如何解构SNat(单身人士)

我正在试验Haskell中的从属类型,并在"单身人士"包的文章中遇到以下内容:

replicate2 :: forall n a. SingI n => a -> Vec a n
replicate2 a = case (sing :: Sing n) of
  SZero -> VNil
  SSucc _ -> VCons a (replicate2 a)
Run Code Online (Sandbox Code Playgroud)

所以我试着自己实现这个,只是想知道它是如何工作的:

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE KindSignatures      #-}
{-# LANGUAGE TypeOperators       #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}

import           Data.Singletons
import           Data.Singletons.Prelude
import           Data.Singletons.TypeLits

data V :: Nat -> * -> * where
  Nil  :: V 0 a …
Run Code Online (Sandbox Code Playgroud)

singleton haskell type-theory

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

javaFX MediaPlayer getCurrentTime()不可靠

要播放mp3文件,我正在使用该javafx.scene.media.MediaPlayer课程.但我注意到使用该seek()方法后currentTimeProperty不可靠.

initMediaPlayer()当用户选择mp3文件时,将调用下面代码中的方法.播放时间显示在时间滑块(=timeSlider)中,用户可以从该滑块中移动以从歌曲中的任何一点开始播放.歌曲中的当前位置也显示在标签(=timeLabel)中.

当我开始播放时play(),当我用pause()或暂停或重启歌曲时stop(),一切正常.

问题是使用后seek()currentTimeProperty长度不正确.这在歌曲结束时变得非常明显,然后currentTimeProperty有时比歌曲的总时间长4秒.

这个问题的原因是什么,有办法解决这个问题吗?

private void initMediaPlayer() {
    try {
        audio = new Media(audioFile.toURI().toURL().toString());
        audioPlayer = new MediaPlayer(audio);
    } catch (MalformedURLException ex) {
        Logger.getLogger(MainWindowController.class.getName())
            .log(Level.SEVERE, null, ex);
    }

    audioPlayer.currentTimeProperty().addListener(new InvalidationListener() {
        public void invalidated(Observable ov) {
            Duration time = audioPlayer.getCurrentTime();
            Duration total = audioPlayer.getTotalDuration();

            if (!timeSlider.isValueChanging() &&
                total.greaterThan(Duration.ZERO)){

                timeSlider.setValue(time.toMillis() / total.toMillis() * 100);
            }

            timeLabel.setText(formatTime(time,total));
        }
    });

    timeSlider.valueChangingProperty().addListener(new …
Run Code Online (Sandbox Code Playgroud)

java javafx media-player

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

自定义fastapi查询参数验证

有没有办法在 FastAPI 查询参数中拥有自定义验证逻辑?

例子

我有一个FastAPI应用程序,其中有一堆请求处理程序,将Path组件作为查询参数。例如:

def _raise_if_non_relative_path(path: Path):
    if path.is_absolute():
        raise HTTPException(
            status_code=409,
            detail=f"Absolute paths are not allowed, {path} is absolute."
        )

@app.get("/new",)
def new_file(where: Path):
    _raise_if_non_relative_path(where)
    # do save a file
    return Response(status_code=requests.codes.ok)

@app.get("/new",)
def delete_file(where: Path):
    _raise_if_non_relative_path(where)
    # do save a file
    return Response(status_code=requests.codes.ok)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法确保当给定的文件路径是绝对路径时甚至不会调用处理程序。现在我必须到处重复自己_raise_if_non_relative_path

我尝试过什么

  • fastapi.Query
    这仅允许非常基本的验证(字符串长度和正则表达式)。我可以在这个例子中定义一个绝对路径正则表达式。但正则表达式解决方案确实不通用,我想使用自定义函数进行验证。
  • pathlib.Path带有验证逻辑的子类__init__
    这不起作用,类型签名中给出的类型将被忽略,并且我的处理程序中的对象是常规的pathlib.PosixPath.
  • 使用@app.middleware
    这可以工作,但似乎有点矫枉过正,因为并非我所有的请求处理程序都处理Path对象。
  • class RelativePath(pydantic.Basemodel)
    即定义一个具有单个path字段的类,我可以根据需要对其进行验证。不幸的是,这不适用于查询参数。如果我这样做,请求处理程序会坚持使用 json 内容主体。或者至少 …

python fastapi

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

如何在 Juno 中启用调试消息(Julia 编辑器)

Julia 文档非常清楚如何启用@debug宏的调试消息,即在启动 Julia 之前运行export JULIA_DEBUG=mymoduleexport JULIA_DEBUG=all在命令行上。但是,是否有一种简单的方法可以在 Juno 内部(或者更一般地说,在 Julia 运行时)启用调试?

我尝试摆弄Base.CoreLogging.disable_logging,Base.CoreLogging.BelowMinLevelBase.CoreLogging._min_enabled_level没有成功。

我知道我可以在 Juno 设置中为 Julia 设置环境变量。但这使用起来有点烦人,因为它需要重新启动 Julia。我真的希望在交互工作时具有以下工作流程:

  1. 在 REPL 中输入一行
  2. 偶然发现您自己的代码中的一个您没有预见到的错误。
  3. 启用调试。
  4. 再次运行该行。
  5. 查看调试日志。
  6. 修复你的代码。
  7. 再次禁用调试日志记录。

我认为这比到处评论和取消评论的常见做法更好printf

debugging julia juno-ide

4
推荐指数
1
解决办法
1179
查看次数