Program Tip

JavaFX 2.0에서 공통 대화 상자 (오류, 경고, 확인)를 만들고 표시하는 방법은 무엇입니까?

programtip 2020. 11. 6. 19:03
반응형

JavaFX 2.0에서 공통 대화 상자 (오류, 경고, 확인)를 만들고 표시하는 방법은 무엇입니까?


JavaFX 2.0에서 일반적인 대화 상자 (오류, 경고, 확인)를 만들고 표시하려면 어떻게합니까? Dialog, DialogBox등의 "표준"클래스를 찾을 수 없습니다 Message.


최근 릴리스 된 JDK 1.8.0_40 은 JavaFX 대화 상자 , 경고 등에 대한 지원을 추가했습니다 . 예를 들어 확인 대화 상자를 표시하려면 Alert 클래스를 사용합니다.

Alert alert = new Alert(AlertType.CONFIRMATION, "Delete " + selection + " ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL);
alert.showAndWait();

if (alert.getResult() == ButtonType.YES) {
    //do stuff
}

이 릴리스에 추가 된 클래스 목록은 다음과 같습니다.


편집 : 대화 지원이 JavaFX에 추가되었습니다. https://stackoverflow.com/a/28887273/1054140 참조


2011 년에는 일반적인 대화 지원이 없었습니다. new Stage()다음 을 만들어 직접 작성해야했습니다 .

Stage dialogStage = new Stage();
dialogStage.initModality(Modality.WINDOW_MODAL);

VBox vbox = new VBox(new Text("Hi"), new Button("Ok."));
vbox.setAlignment(Pos.CENTER);
vbox.setPadding(new Insets(15));

dialogStage.setScene(new Scene(vbox));
dialogStage.show();

최신 정보

공식 표준 대화 상자는 RT-12643 구현의 일부로 릴리스 8u40에서 JavaFX에 제공 됩니다. 이들은 2015 년 3 월경에 최종 릴리스 형식으로 , 현재 JavaFX 개발 저장소의 소스 코드 형식으로 제공 될 입니다.

그동안 아래 ControlsFX 솔루션을 사용할 수 있습니다.


ControlsFX 는 JavaFX에서 공통 대화 지원 (오류, 경고, 확인 등)을위한 사실상의 표준 타사 라이브러리입니다.

다른 답변에서 지적한 것처럼 일반적인 대화 상자 지원을 제공하는 다른 타사 라이브러리가 많이 있으며 Sergey의 답변의 샘플 코드를 사용하여 쉽게 자신의 대화 상자를 만들 수 있습니다.

그러나 ControlsFX 는 현재 사용 가능한 최고 품질의 표준 JavaFX 대화 상자를 쉽게 제공 한다고 생각합니다 . 다음은 ControlsFX 설명서의 몇 가지 샘플입니다 .

표준 대화 상자

명령 링크


Sergey가 맞지만, 호출 한 동일한 코드 블록에서 평가를 위해 집에서 만든 대화 상자에서 응답을 받아야하는 경우 .show ()가 아닌 .showAndWait ()를 사용해야합니다. 다음은 Swing의 OptionPane에서 제공되는 몇 가지 대화 상자 유형을 표현한 것입니다.

public class FXOptionPane {

public enum Response { NO, YES, CANCEL };

private static Response buttonSelected = Response.CANCEL;

private static ImageView icon = new ImageView();

static class Dialog extends Stage {
    public Dialog( String title, Stage owner, Scene scene, String iconFile ) {
        setTitle( title );
        initStyle( StageStyle.UTILITY );
        initModality( Modality.APPLICATION_MODAL );
        initOwner( owner );
        setResizable( false );
        setScene( scene );
        icon.setImage( new Image( getClass().getResourceAsStream( iconFile ) ) );
    }
    public void showDialog() {
        sizeToScene();
        centerOnScreen();
        showAndWait();
    }
}

static class Message extends Text {
    public Message( String msg ) {
        super( msg );
        setWrappingWidth( 250 );
    }
}

public static Response showConfirmDialog( Stage owner, String message, String title ) {
    VBox vb = new VBox();
    Scene scene = new Scene( vb );
    final Dialog dial = new Dialog( title, owner, scene, "res/Confirm.png" );
    vb.setPadding( new Inset(10,10,10,10) );
    vb.setSpacing( 10 );
    Button yesButton = new Button( "Yes" );
    yesButton.setOnAction( new EventHandler<ActionEvent>() {
        @Override public void handle( ActionEvent e ) {
            dial.close();
            buttonSelected = Response.YES;
        }
    } );
    Button noButton = new Button( "No" );
    noButton.setOnAction( new EventHandler<ActionEvent>() {
        @Override public void handle( ActionEvent e ) {
            dial.close();
            buttonSelected = Response.NO;
        }
    } );
    BorderPane bp = new BorderPane();
    HBox buttons = new HBox();
    buttons.setAlignment( Pos.CENTER );
    buttons.setSpacing( 10 );
    buttons.getChildren().addAll( yesButton, noButton );
    bp.setCenter( buttons );
    HBox msg = new HBox();
    msg.setSpacing( 5 );
    msg.getChildren().addAll( icon, new Message( message ) );
    vb.getChildren().addAll( msg, bp );
    dial.showDialog();
    return buttonSelected;
}

public static void showMessageDialog( Stage owner, String message, String title ) {
    showMessageDialog( owner, new Message( message ), title );
}
public static void showMessageDialog( Stage owner, Node message, String title ) {
    VBox vb = new VBox();
    Scene scene = new Scene( vb );
    final Dialog dial = new Dialog( title, owner, scene, "res/Info.png" );
    vb.setPadding( new Inset(10,10,10,10) );
    vb.setSpacing( 10 );
    Button okButton = new Button( "OK" );
    okButton.setAlignment( Pos.CENTER );
    okButton.setOnAction( new EventHandler<ActionEvent>() {
        @Override public void handle( ActionEvent e ) {
            dial.close();
        }
    } );
    BorderPane bp = new BorderPane();
    bp.setCenter( okButton );
    HBox msg = new HBox();
    msg.setSpacing( 5 );
    msg.getChildren().addAll( icon, message );
    vb.getChildren().addAll( msg, bp );
    dial.showDialog();
}

}


여기 답변에서 수정 : https://stackoverflow.com/a/7505528/921224

javafx.scene.control.Alert

For a an in depth description of how to use JavaFX dialogs see: JavaFX Dialogs (official) by code.makery. They are much more powerful and flexible than Swing dialogs and capable of far more than just popping up messages.

import javafx.scene.control.Alert
import javafx.scene.control.Alert.AlertType;
import javafx.application.Platform;

public class ClassNameHere
{

    public static void infoBox(String infoMessage, String titleBar)
    {
        /* By specifying a null headerMessage String, we cause the dialog to
           not have a header */
        infoBox(infoMessage, titleBar, null);
    }

    public static void infoBox(String infoMessage, String titleBar, String headerMessage)
    {
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle(titleBar);
        alert.setHeaderText(headerMessage);
        alert.setContentText(infoMessage);
        alert.showAndWait();
    }
}

One thing to keep in mind is that JavaFX is a single threaded GUI toolkit, which means this method should be called directly from the JavaFX application thread. If you have another thread doing work, which needs a dialog then see these SO Q&As: JavaFX2: Can I pause a background Task / Service? and Platform.Runlater and Task Javafx.

To use this method call:

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");

or

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");

This works since java 8u40:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();


JavaFX UI Controls Project 에서 제공하는 대화 상자를 제공 할 수 있습니다 . 나는 그것이 당신을 도울 것이라고 생각합니다

Dialogs.showErrorDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage,  "Main line", "Name of Dialog box");

public myClass{

private Stage dialogStage;



public void msgBox(String title){
    dialogStage = new Stage();
    GridPane grd_pan = new GridPane();
    grd_pan.setAlignment(Pos.CENTER);
    grd_pan.setHgap(10);
    grd_pan.setVgap(10);//pading
    Scene scene =new Scene(grd_pan,300,150);
    dialogStage.setScene(scene);
    dialogStage.setTitle("alert");
    dialogStage.initModality(Modality.WINDOW_MODAL);

    Label lab_alert= new Label(title);
    grd_pan.add(lab_alert, 0, 1);

    Button btn_ok = new Button("fermer");
    btn_ok.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            // TODO Auto-generated method stub
            dialogStage.hide();

        }
    });
    grd_pan.add(btn_ok, 0, 2);

    dialogStage.show();

}



}

참고 URL : https://stackoverflow.com/questions/8309981/how-to-create-and-show-common-dialog-error-warning-confirmation-in-javafx-2

반응형