javafx拖放控制目标布局

问题描述 投票:0回答:2

我们正在尝试实现这种布局,骰子的行是TextField,当单击“随机按钮”时,该骰子填充有骰子侧面的字母之一我们有一个目标TextField,它由duh TextField组成。当用户将其中一个骰子拖到目标时,将填充目标。问题是源与目标的关系为1到1,并且用户事先不知道需要将源放置在何处。接下来,我们尝试使用Button来表示骰子,并将Button拖放到newPane(即AnchorPane)上。当我们尝试添加第二个按钮时,尝试将重复的子项添加到窗格时出现错误

问题是1.我们可以将源与目标建立一对多关系吗?如果是这样,我们该如何编码?如果可能的话,看起来好像是虚幻的代码行

  1. 如何使用newPane概念克服问题?

  2. OR还有更好的方法来设计吗?我们知道我们可以单击Button并构建一个单词并将其添加到ListView中,这不是我们想要的。

我们将使用Button的代码发布到newPane上,但它可以正常工作,但是当我们为第二个Button复制此代码时,会收到如上所述的错误

    @Override
public void initialize(URL url, ResourceBundle rb) {

    // Add mouse event handlers for the source
    btnOK.setOnMousePressed((MouseEvent event) -> {
        btnOK.setMouseTransparent(true);
        event.setDragDetect(true);
    });

    btnOK.setOnMouseReleased((MouseEvent event) -> {
        btnOK.setMouseTransparent(false);
    });

    btnOK.setOnMouseDragged((MouseEvent event) -> {
        event.setDragDetect(false);
    });

    btnOK.setOnDragDetected((MouseEvent event) -> {
        btnOK.startFullDrag();
    });

    // Add mouse event handlers for the target
    // =======================================
     newPane.setOnMouseDragEntered((MouseDragEvent event) -> {
    });
    btnOK.setOnMouseDragEntered((MouseDragEvent event) -> {
    });
    newPane.setOnMouseDragOver((MouseDragEvent event) -> {
    });

    newPane.setOnMouseDragReleased((MouseDragEvent event) -> {
    System.out.println(event.getX());
    System.out.println(event.getY());
    double h = event.getX();
    double v = event.getY();
    newPane.getChildren().add(btnOK);
    btnOK.setLayoutX(h);
    btnOK.setLayoutY(v);
        t1.setText(s1.getText());
        t1.setStyle("-fx-background-color: lightblue;");
        //newPane.getChildren().add(s1);
    });
    tosswordPane.setOnMouseDragExited((MouseDragEvent event) -> {
    });
}

以下是我们正在尝试实现的布局的屏幕截图enter image description here

javafx drag-and-drop
2个回答
1
投票

我们可以将其转变为两步(舞蹈)过程,并使之易于管理可管理的部分包括将目标文本字段减少为10行乘8列这意味着每个骰子仅需要80乘6行代码,总共需要6720行代码。不太好但是可以复制并粘贴您的心OH在我们的野性代码的顶部,您将看到没有意义的悬停方法它的工作原理如下:按住鼠标按钮并在目标上释放我们在目标区域中使用了onMouseReleased,您可以使用onMouseClicked

     @FXML
 private void onHover(){
     t4.setText(s4.getText());
 }

String move;// needs to be global
@Override
public void initialize(URL url, ResourceBundle rb) {

    s6.setOnMouseClicked((MouseEvent e)->{
      move = s6.getText();
      //s6.setVisible(false);
    });

    t1.setOnMouseReleased((MouseEvent event)->{
        if(s6.isVisible()){
        t1.setText(move);
        s6.setVisible(false);
        }
    });

    t2.setOnMouseReleased((MouseEvent e)->{
        if(s6.isVisible()){
        t2.setText(move);
        s6.setVisible(false);
        }
    });

快乐的复制粘贴哈哈


0
投票

原始问题涉及使用鼠标拖放来模拟手动播放Toss Word。这种拖放方法效果不佳,因此这是新方法该游戏是Krack Games于1948年复制撰写的产品,由Adie E. Giessow撰写。投掷单词有14个骰子,骰子上的字母如下。

d1 =“ GHDCEI”; d2 =“ IKLHIG”; d3 =“ TARSMV”; d4 =“ EYIUAO”; d5 =“ SABODY”;d6 =“ BACEFD”; d7 =“ MNKLIT”; d8 =“ LMONIP”; d9 =“ IEOHRF”; d10 =“ MEORSN”;d11 =“ EAXWYZ”; d12 =“ SEAUWT”; d13 =“取消”; d14 =“ PROSTQ”;

折腾字规则玩家轮流滚动字母骰子,并从所得字母中形成单词。单词必须至少包含3个字母,并且没有专有名称。对于构成单词的每个字母得分一分。奖励:使用全部14个字母将计为25,而不是14。奖励:“ GAME”一词将计为50分。

游戏设计我们使用TextFields表示骰子和目标游戏板我们使用最少的字符来命名这些源(s1)和目标(t1)我们使用“单击鼠标时”事件来模拟将骰子字母放置在目标游戏板上然后,我们使用On Mouse Pressed Event允许删除Dice字母,以便将其放置在新位置

游戏开始后,我们使用布尔PLAY = false来禁止掷骰子为了模拟掷骰子,我们使用一个随机数生成器和一个线性lambda要选择骰子,我们将一个lambda表达式放入initialize(URL url,ResourceBundle rb)这似乎让Dice选择过程充当了侦听器大回溯到目标游戏板设计是每个TextField需要117行代码我们将目标玩板减少到10行乘8列,以便为玩板上的每个TextField制作大约9360行非常冗余的代码]

[如果有人对目标游戏板有更好的布局设计,随时发表评论!

一行非常整齐的CSS样式声明不是我的创作所用,而是在SO上找到的应用颜色样式时,可以防止丢失TextField周围的边界这是t2.setStyle(“-fx-control-inner-background:lightblue”)我们将发布随机数生成器和Dice的选择的代码段我们将为一个游戏板互动发布完整的代码]

滚动骰子

 @FXML
 private void onRandom() throws NoSuchFieldException{
    //new Random().ints(7, 1, 7).forEach(System.out::println);
    makeEnabled();
    if(PLAY == true){
        btnOK.requestFocus();
        return;
    }
    makeVisible();
    new Random().ints(1, 1, 7).forEach(ints -> {
    int V = ints;
    String d1 = "GHDCEI";
    String S1 = String.valueOf(d1.charAt(V-1));
    s1.setText(S1);
    });<br>

选择骰子

    @Override
public void initialize(URL url, ResourceBundle rb) {

    s1.setOnMouseClicked((MouseEvent )->{
    move = s1.getText();
    s1.setVisible(false);
    PLAY = true;
    });
    s2.setOnMouseClicked((MouseEvent )->{
    move = s2.getText();
    s2.setVisible(false);
    PLAY = true;
    });<br>

从游戏板上放置和删除字母

    @FXML
private void onMC2(){
if(PLAY == false){
    t2.setStyle("-fx-control-inner-background:red");
    return;
}
t2.setText(move);
move = "";
btnOK.requestFocus();
if(t2.getText().isEmpty()){
    t2.setStyle("-fx-control-inner-background:white");
}else{;
    t2.setStyle("-fx-control-inner-background:lightblue");
}
// Code above error traps and places dice on Play Field
// Code below removes the dice to permit moving to alternate target location

t2.setOnMousePressed((MouseEvent event) -> { 
    if(t2.getText().equals(s1.getText())){
        if(!s1.isVisible()){
        s1.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s2.getText())){
        if(!s2.isVisible()){
        s2.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s3.getText())){
        if(!s3.isVisible()){
        s3.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s4.getText())){
        if(!s4.isVisible()){
        s4.setVisible(true);
        t2.setText("");
         return;
        }
    }
    if(t2.getText().equals(s5.getText())){
        if(!s5.isVisible()){
        s5.setVisible(true);
        t2.setText("");
        return; 
        }
    }
    if(t2.getText().equals(s6.getText())){
        if(!s6.isVisible()){
        s6.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s7.getText())){
        if(!s7.isVisible()){
        s7.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s8.getText())){
        if(!s8.isVisible()){
        s8.setVisible(true);
        t2.setText("");
        return;
        }            
    }
    if(t2.getText().equals(s9.getText())){
        if(!s9.isVisible()){
        s9.setVisible(true);
        t2.setText("");
        return;
        }  
    }
    if(t2.getText().equals(s10.getText())){
        if(!s10.isVisible()){
        s10.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s11.getText())){
        if(!s11.isVisible()){
        s11.setVisible(true);
        t2.setText("");
        return;
        } 
    }
    if(t2.getText().equals(s12.getText())){
        if(!s12.isVisible()){
        s12.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s13.getText())){
        if(!s13.isVisible()){
        s13.setVisible(true);
        t2.setText("");
        return;
        }
    }
    if(t2.getText().equals(s14.getText())){
        if(!s14.isVisible()){
        s14.setVisible(true);
        t2.setText("");
        return;
        }   
    }
});
}<br>

[一次我们正在考虑使用一种过程来从掷骰子的结果中生成可能的单词。这是从骰子滚动生成搜索组合的代码。然后针对带有流的字典运行此命令我们没有将其纳入游戏中,似乎击败了游戏的构想认为是哪个

构建搜索词的代码

Private Void buildSearchWords(){
   String W = "ILRYADIIEMASHT".toLowerCase();
   int L = W.length();
   ArrayList<String> rearange = new ArrayList<>();
   for(int i = 1; i <= L; i++){

   String firstLetter = W.substring(0, i); 
   String endLetter = W.substring(L - (L-i), L);
   String endLetterNew = W.substring(L-i);

   StringBuilder sb = new StringBuilder(W);
   sb.replace(0, i, endLetterNew);
   sb.replace(L-i, L, firstLetter);

   rearange.add(sb.toString());

   }
    for(int X = 0; X < rearange.size();X++){
        String A = rearange.get(X);
        txaInput.appendText(A);
        txaInput.appendText(" ");
    }  

与字典进行比较的代码

        List<String> dictionary = Arrays.asList(dictionaryArray);
    ArrayList<String> list = new ArrayList<>();

    int W = txtMonitor.getText().length();

    String newFirstLetter = txtMonitor.getText().substring(0, 1).toLowerCase();

    String newEndLetter = txtMonitor.getText().substring(W - 2, W);
    }

    dictionary.stream().filter(s -> s.startsWith(searchString)
            || s.startsWith(nF, 0)
            && s.length() > 1 && s.length() <= W+3 
            && s.endsWith(nE))
            .forEach(list :: add);
© www.soinside.com 2019 - 2024. All rights reserved.