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

屏幕的上部包含几个控件(文本、提交按钮等)。屏幕的下部由一个自定义PianoView组件占据,用于处理钢琴键盘的绘制。
根据MVVM原则,PianoView应该有自己的PianoViewModel,将其状态(即当前按下的键,突出显示的键等)存储在KeysStateRepository. 封闭的QuizActivity也应该有一个QuizActivityViewModel, 来处理各种控制(提交答案,跳过问题......)。将QuizActivityViewModel需要能够从查询中选择键PianoView(或者更确切地说,从它的KeysStateRepository),他们提交领域层进行评估,然后将结果发回PianoView的可视化。
换言之,所述QuizActivity的ViewModel应该拥有/是的母体PianoView的ViewModel以促进通信和数据共享。
如何建模这种父子关系以在 ViewModel 之间进行通信?
AFAIK aViewModel不能依赖于另一个ViewModel(我会通过什么ViewModelStoreOwner来获得ViewModel另一个中的 a Viewmodel?)。我认为至少用Dagger-Hilt是不可能实现的。
想到了解决此问题的三种解决方案,但都无法使用:
Android 开发文档建议使用shared ViewModel来促进两个 Fragment / Views 之间的数据共享。但是,这不适合我的用例。的PianoView(或它的视图模型)应该是其状态的具有唯一所有者Repository …
我刚刚阅读了 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)
这会通过以下方式更改输出程序集:
这会显着降低吞吐量性能。
为什么 64 位 HotSpot VM 不为long计数器执行循环展开?为什么第二种情况需要安全点,而第一种情况不需要?
我有一个方法,它接受 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 只是在扩大,所以它应该自动类型转换,不是吗?那怎么通过呢?谢谢。
我按照这个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以允许对单元格进行编辑?
我有一个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)
但只有在控制器第二次初始化后,绑定才能正常工作。我可以通过以下方式重现它:
myValue正确指定的默认值(数字 3)。myValue保持不变,仍为数字 3。整个简约但可启动/可复制的代码:
主要.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) 我想完全用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文件中使用“外包”它,但这只是给了我一个“意外的结束标记:场景”错误。
我需要从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",但整个大/小端,签名/无符号和可变长度的东西使它太混乱了.
我有一个返回一维数组的方法。我想循环调用该方法并将结果存储在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 ×6
javafx ×3
arrays ×2
fxml ×2
android ×1
bytearray ×1
dagger-hilt ×1
data-binding ×1
foreach ×1
int ×1
jit ×1
jvm-hotspot ×1
midi ×1
mvvm ×1
tableview ×1