小编Lep*_*aun的帖子

如何在 Android MVVM 虚拟机中模拟父子关系?

我正在开发一个 Android 钢琴“测验”应用程序 - 用户点击钢琴键,然后单击黄色的“检查”按钮提交答案进行评估,并查看在钢琴上绘制的正确答案。主要QuizActivity有这样的布局: 在此处输入图片说明

屏幕的上部包含几个控件(文本、提交按钮等)。屏幕的下部由一个自定义PianoView组件占据,用于处理钢琴键盘的绘制。

根据MVVM原则,PianoView应该有自己的PianoViewModel,将其状态(即当前按下的键,突出显示的键等)存储在KeysStateRepository. 封闭的QuizActivity也应该有一个QuizActivityViewModel, 来处理各种控制(提交答案,跳过问题......)。将QuizActivityViewModel需要能够从查询中选择键PianoView(或者更确切地说,从它的KeysStateRepository),他们提交领域层进行评估,然后将结果发回PianoView的可视化。

换言之,所述QuizActivityViewModel应该拥有/是的母体PianoViewViewModel以促进通信和数据共享。

如何建模这种父子关系以在 ViewModel 之间进行通信?

AFAIK aViewModel不能依赖于另一个ViewModel(我会通过什么ViewModelStoreOwner来获得ViewModel另一个中的 a Viewmodel?)。我认为至少用Dagger-Hilt是不可能实现的。

想到了解决此问题的三种解决方案,但都无法使用:

1 - 视图之间共享数据的官方方式

Android 开发文档建议使用shared ViewModel来促进两个 Fragment / Views 之间的数据共享。但是,这不适合我的用例。的PianoView(或它的视图模型)应该是其状态的具有唯一所有者Repository …

java android mvvm android-viewmodel dagger-hilt

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

为什么 Hotspot JIT 不为长计数器执行循环展开?

我刚刚阅读了 Java Magazine 文章Loop Unrolling。作者在那里演示了for带有int计数器的简单循环是通过循环展开优化编译的:

private long intStride1()
{
    long sum = 0;
    for (int i = 0; i < MAX; i += 1)
    {
        sum += data[i];
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

但是,他们随后通过将计数器类型切换为 来显示一切都发生了变化long

private long longStride1()
{
    long sum = 0;
    for (long l = 0; l < MAX; l++)
    {
        sum += data[(int) l];
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

这会通过以下方式更改输出程序集:

  1. 介绍安全点
  2. 不执行展开

这会显着降低吞吐量性能。

为什么 64 位 HotSpot VM 不为long计数器执行循环展开?为什么第二种情况需要安全点,而第一种情况不需要?

java jit jvm-hotspot compiler-optimization loop-unrolling

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

为什么我不能在java中传递一个short数组到接受int数组的方法?

我有一个方法,它接受 int[] 参数。我想给它传递一系列短裤。但我得到的只是“不兼容的类型:short[] 无法转换为 int[]”。这是为什么?一个例子:

short[] arr = new short[2];
arr[0] = 8;
arr[1]=9;
example(arr);

example(int[] anArray){
}
Run Code Online (Sandbox Code Playgroud)

据我所知,short to int 只是在扩大,所以它应该自动类型转换,不是吗?那怎么通过呢?谢谢。

java arrays parameter-passing

5
推荐指数
1
解决办法
514
查看次数

如何在FXML中定义可编辑的TableCell?

我按照这个Oracle教程在FXML中创建了一个TableView.但是,没有关于如何使单元格可编辑的信息.我已经尝试过其他教程,建议firstNameCol.setOnEditCommit( new EventHandler ...在控制器代码中添加类似的东西,但它不起作用.无论我如何单击鼠标或敲击键盘,表格单元格都不会变为"可编辑的文本框",如下所示:

在此输入图像描述

这是我对表的FXML定义:

<TableView fx:id="tvAlgorithmSteps" editable="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="200.0" VBox.vgrow="ALWAYS">
    <columns>
        <TableColumn editable="true" prefWidth="150.0" sortable="false" text="Step">
            <cellValueFactory>
                <PropertyValueFactory property="stepName" />
            </cellValueFactory>
        </TableColumn>
        ...
Run Code Online (Sandbox Code Playgroud)

自动完成允许我onEditCommit=""在FXML中设置TableColumn,但我不知道该放什么.

我应该如何编辑FXML以允许对单元格进行编辑?

javafx tableview fxml

5
推荐指数
1
解决办法
2533
查看次数

为什么我的 Spinner 在第一次初始化时不更新其绑定属性?

我有一个Spinner控制器:

@FXML
private Spinner<Integer> spnMySpinner;
Run Code Online (Sandbox Code Playgroud)

和一个SimpleIntegerProperty控制器:

private static final SimpleIntegerProperty myValue = 
new SimpleIntegerProperty(3); //load a default value
Run Code Online (Sandbox Code Playgroud)

我已在控制器的方法中将它们绑定在一起initialize

spnMySpinner.getValueFactory().valueProperty().bindBidirectional(myValueProperty().asObject());
Run Code Online (Sandbox Code Playgroud)

但只有在控制器第二次初始化后,绑定才能正常工作。我可以通过以下方式重现它:

  1. 我使用关联的控制器打开舞台,它会加载属性中myValue正确指定的默认值(数字 3)。
  2. 我单击微调器上的增量按钮将其设置为 4。它更改了微调器的 value 属性中的值,但绑定属性myValue保持不变,仍为数字 3。
  3. 我关闭舞台/窗户。
  4. 我重新打开它,微调器的值再次变为 3。
  5. 我再次增加它。现在绑定工作了,我在微调器和绑定属性内都有一个“4”。

整个简约但可启动/可复制的代码:

主要.java:

package spinnerpoc;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        Parent root  = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
        Scene scene = new …
Run Code Online (Sandbox Code Playgroud)

data-binding javafx

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

如何在FXML中定义Stage?

我想完全用FXML定义我的GUI。我从JavaFX模板开始,从Oracle文档到Netbeans模板到处都有。在这些模板中,没有在FXML中定义的舞台,而是其中包含UI控件的实际场景。就像是:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxskuska.FXMLDocumentController">
    <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
    </children>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)

直到我要更改的第一件事-设置窗口的名称之前,这似乎还可以。那时我意识到Scene不是Window(或JFrame类比),而Stage是。当我尝试将所有这些内容包装到元素中时,我无法将fx:controller属性设置为AnchorPane,因为它不再是根元素。我什至尝试通过fx:include在Stage文件中使用“外包”它,但这只是给了我一个“意外的结束标记:场景”错误。

  1. 如何在FXML中定义Stage?
  2. Stage是JFrame的JFX类比吗?

java javafx fxml

2
推荐指数
1
解决办法
2142
查看次数

如何从MetaMessage.getData()返回的字节数组中获取整数值?

我需要从midi文件中获取速度值.我发现,set_tempo命令的值为0x51,所以我有这段代码:

    for (int i = 0; i < tracks[0].size(); i++) {
        MidiEvent event = tracks[0].get(i);
        MidiMessage message = event.getMessage();
        if (message instanceof MetaMessage) {
            MetaMessage mm = (MetaMessage) message;
            if(mm.getType()==SET_TEMPO){
                // now what?
                mm.getData();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但方法getData()返回一个字节数组!我怎样才能将它转换为普通的人形,又称整数?我已经读过它以这样的格式存储:"tt tt tt",但整个大/小端,签名/无符号和可变长度的东西使它太混乱了.

java int midi bytearray javax.sound.midi

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

为什么不能使用foreach周期将1D数组分配给2D数组?

我有一个返回一维数组的方法。我想循环调用该方法并将结果存储在2D数组中。当使用foreach循环不起作用时,数组结果充满了空指针。

//this doesn't work
...
double[][] results = new double[20][];
for(double[] result : results){
        result = method();
}
...
public double[] method(){
        double[] ret = new double[15];
        //populate ret and do other stuff...
        return ret;
}
Run Code Online (Sandbox Code Playgroud)

但是,当使用常规的“ for”循环遍历数组时,它神奇地起作用了!

...
double[][] results =  new double[20][];
for(int i=0;i<20;i++){
        results[i]=method();
}
...   
public double[] method(){
        double[] ret = new double[15];
        //populate ret and do other stuff...
        return ret;
}
Run Code Online (Sandbox Code Playgroud)

为什么?

java arrays foreach

0
推荐指数
1
解决办法
111
查看次数