【问题标题】:My messagebox does not work in this GridPane我的消息框在此 GridPane 中不起作用
【发布时间】:2020-04-24 10:15:12
【问题描述】:

我从书中举了一个 GridPane 的例子。这本书不是最新的。当我尝试使用 Internet 时,我不断得到 Scene Builder,这 不是 我想要使用的。我正在使用 NetBeans IDE 8.2,但这个程序有 2 个问题。在 btnOk_Click() 中,我尝试选择 Small、Medium、Large AND Thin、Thick。该程序将它们放在同一组中。另外,这个 MessageBox.show(msg, "Order Details"); //?????可能已经过时了。 btnCancel_Click() 有效,但 btnOk_Click() 不显示任何工作。这是程序:

package gridpane;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
//import javafx.event.ActionEvent;
//import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
//import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;

public class GridPane_Pizza extends Application {

//TextField
TextField txtName;
TextField txtPhone;
TextField txtAddress;
//RadioButton
RadioButton rdoSmall;
RadioButton rdoMedium;
RadioButton rdoLarge;
//RadioButton
RadioButton rdoThin;
RadioButton rdoThick;
//CheckBox
CheckBox chkPepperoni;
CheckBox chkMushrooms;
CheckBox chkAnchovies;
//private Stage state;
Stage stage;

@Override
public void start(Stage primaryStage) {

    stage = primaryStage;

    //Create Label
    Label lblName = new Label("Enter the name:\t");
    txtName = new TextField();
    txtName.setMinWidth(100);
    txtName.setPrefWidth(200);
    txtName.setMaxWidth(300);
    txtName.setPromptText("Enter the name here:\t");

    //Create phone for label and text
    Label lblPhone = new Label("Enter the phone:\t");
    txtPhone = new TextField();
    txtPhone.setMinWidth(60);
    txtPhone.setPrefWidth(120);
    txtPhone.setMaxWidth(180);
    txtPhone.setPromptText("Enter the phone here:\t");

    //Create address for label and text
    Label lblAddress = new Label("Enter the Address:\t");
    txtAddress = new TextField();
    txtAddress.setMinWidth(100);
    txtAddress.setPrefWidth(200);
    txtAddress.setMaxWidth(300);
    txtAddress.setPromptText("Enter the address here:\t");

    //Create the size pane  ??
    Label lblSize = new Label("Size:\t");  //??  \t
    rdoSmall = new RadioButton("Small");
    rdoMedium = new RadioButton("Medium");
    rdoLarge = new RadioButton("Large");

    rdoMedium.setSelected(true);

    ToggleGroup groupSize = new ToggleGroup();
    rdoSmall.setToggleGroup(groupSize);
    rdoMedium.setToggleGroup(groupSize);
    rdoLarge.setToggleGroup(groupSize);

    VBox paneSize = new VBox(lblSize, rdoSmall, rdoMedium, rdoLarge);

    paneSize.setSpacing(10);

    //Create the crust pane
    Label lblCrust = new Label("Crust");
    rdoThin = new RadioButton("Thin");
    rdoThick = new RadioButton("Thick");

    rdoThin.setSelected(true);

    ToggleGroup groupCrust = new ToggleGroup();
    rdoThin.setToggleGroup(groupSize);
    rdoThick.setToggleGroup(groupSize);


    VBox paneCrust = new VBox(lblCrust, rdoThin, rdoThick);

    paneCrust.setSpacing(10);

    Label lblToppings = new Label("Labels");
    chkPepperoni = new CheckBox("Pepperoni");
    chkMushrooms = new CheckBox("Mushrooms");
    chkAnchovies = new CheckBox("Anchovies");


    VBox paneToppings =  new VBox(lblToppings, chkPepperoni, chkMushrooms, chkAnchovies);

    paneToppings.setSpacing(10);

    Button btnOk = new Button("OK!!");
    btnOk.setPrefWidth(80);
    btnOk.setOnAction(e -> btnOk_Click());  //change to public

    Button btnCancel = new Button("Cancel!!");
    btnCancel.setPrefWidth(80);
    btnCancel.setOnAction(e -> btnCancel_Click());  //change to public

    HBox paneButtons = new HBox(10, btnOk, btnCancel);


    GridPane grid = new GridPane();

    grid.setPadding(new Insets(10));
    grid.setHgap(10);
    grid.setVgap(10);
    grid.setMinWidth(500);
    grid.setPrefWidth(500);
    grid.setMaxWidth(800);


    grid.addRow(0, lblName, txtName);
    grid.addRow(1, lblPhone, txtPhone);
    grid.addRow(2, lblAddress, txtAddress);
    grid.addRow(3, paneSize, paneCrust, paneToppings);

    grid.add(paneButtons, 2, 15);

    GridPane.setHalignment(lblName, HPos.RIGHT);  //grid or GridPane
    //grid.setHalignment(lblPhone, HPos.RIGHT);
    GridPane.setHalignment(lblPhone, HPos.RIGHT);
    GridPane.setHalignment(lblAddress, HPos.RIGHT);

    //grid.setColumnSpan(txtName, 2);
    GridPane.setColumnSpan(txtName, 2);  //grid or GridPane
    GridPane.setColumnSpan(txtPhone, 2);
    GridPane.setColumnSpan(txtAddress, 2);

    ColumnConstraints col1 = new ColumnConstraints();  //??
    col1.setPercentWidth(33);
    ColumnConstraints col2 = new ColumnConstraints();
    col2.setPercentWidth(33);
    ColumnConstraints col3 = new ColumnConstraints();
    col3.setPercentWidth(33);
    grid.getColumnConstraints().addAll(col1, col2, col3);  //??



    //
    Scene scene = new Scene(grid);
    primaryStage.setTitle("Pizza Order");
    primaryStage.setScene(scene);
    primaryStage.setMinWidth(500);
    primaryStage.setMaxWidth(1200); //900
    //primaryStage.setMaxWidth(900); //900
    primaryStage.setMaxHeight(800);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

//private void btnOk_Click() {  //public
public void btnOk_Click() {  //public    
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    String msg = "Customer:\n\n";

    msg += "\t" + txtName.getText() + "\n";
    msg += "\t" + txtPhone.getText() + "\n\n";
    msg += "\t" + txtAddress.getText() + "\n";
    msg += "You have ordered a ";

    if (rdoSmall.isSelected())   //Problem here
        msg += "small ";
    if (rdoMedium.isSelected())
        msg += "medium ";
    if (rdoLarge.isSelected())
        msg += "large ";
    //problem here
    if (rdoThin.isSelected())
        msg += "thin crust pizza with ";
    if (rdoThick.isSelected())
        msg += "thick crust pizza with ";

    String toppings = "";

    toppings = buildToppings(chkPepperoni, toppings);
    toppings = buildToppings(chkMushrooms, toppings);
    toppings = buildToppings(chkAnchovies, toppings);

    if (toppings.equals(""))
        msg += "no toppings.";
    else
        msg += "the following toppings:\n" + toppings;

    MessageBox.show(msg, "Order Details");  //?????
    //msg.show(msg, "Order Details");
    //msg
    //stage.show(msg, "Order Details");  //??????????
}

public String buildToppings(CheckBox chk, String msg)
{
    if (chk.isSelected())
    {
        if (!msg.equals(""))
        {
            msg += ", ";
        }
        msg += chk.getText();
    }
    return msg;
}

public void btnCancel_Click() {

    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    stage.close();
}

【问题讨论】:

  • 我不知道MessageBox是什么,JavaFX API中没有这样的类。也许您可以使用 AlertAlertType.INFORMATION 来代替。
  • 我觉得你说得对,但是我刚学javafx,不知道怎么用Alert或者AlertType.INFORMATION。你能帮我一下吗?
  • 这很有帮助,但我真正想做的是找到在 btnOk_Click() 中使用 Alert 的原因。这只是一个示例,我试图将它们与网格窗格放在一起。我有一个我写的组合框,它更重要,但它没有进入网格窗格/按钮。这就是为什么我试图弄清楚这个程序以便它运行。如果它运行,我可以在我的其他程序上使用它。
  • 好吧,对不起,我不明白你在问什么。祝您好运解决您的问题。

标签: javafx message messagebox gridpane


【解决方案1】:

所以我可以在您的代码中看到您将错误的组变量放在这里...

ToggleGroup groupCrust = new ToggleGroup();
rdoThin.setToggleGroup(groupSize);
rdoThick.setToggleGroup(groupSize);

如果您希望它们位于不同的组中,它应该是 groupCrust 而不是 groupSize。

就按钮的事件处理程序而言,我从未见过以您分享的方式这样做...

我会像这样添加点击事件处理程序...

btnOk.addEventHandler(MouseEvent. MOUSE_CLICKED, 
  new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent e) {
          // some code
      }
});

MessageBox 而言,查看this 似乎您可能想尝试根据您使用的版本发出警报。如果你想在你的代码上实现它,你应该参考这个代码https://stackoverflow.com/a/36137669/11547889

【讨论】:

  • 按照问题中的方式设置事件处理程序优于您提出的解决方案。该问题使用lambda event handler,更简洁。它使用setOnAction,而不是单击处理程序,因此可以通过以编程方式触发按钮或通过键盘(单击处理程序不会)来触发。此外,setOnAction 具有更好的类型安全性,它只需要 ActionEvent 作为参数,而不是像 addEventHandler 那样的任意事件。
  • 很好!!谢谢(你的)信息 :)。我已经有一段时间没有用 JavaFX 做过任何事情了
  • 感谢 ToggleGroup groupCrust 错误。我纠正了它,那部分有效。我仍然对应该如何处理 MessageBox 感到困惑。我确实看过其他地方 - stackoverflow.com/a/36137669/11547889 和警报,但我对这种类型的写作非常陌生,所以 javafx 对我来说有点难以理解,而且我使用的书没有超过警报。跨度>
  • //MessageBox.show(msg, "订单详情"); //?????? alert.setTitle("这里有消息..."); alert.setHeaderText("看,一个信息对话框"); //alert.setContentText("我有一条好消息要告诉你!"); alert.setContentText(msg, "订单详情"); alert.showAndWait();
  • 警报警报 = 新警报(Alert.AlertType.INFORMATION);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2017-03-28
相关资源
最近更新 更多