Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义警报框中的滚动条不工作JavaFX_Javafx_Resize_Alert_Scrollpane - Fatal编程技术网

自定义警报框中的滚动条不工作JavaFX

自定义警报框中的滚动条不工作JavaFX,javafx,resize,alert,scrollpane,Javafx,Resize,Alert,Scrollpane,有没有一种简单的方法可以将滚动条放在警报框中并让它实际滚动?我正在将网格窗格添加到滚动窗格中。当警报框处于活动状态时,我会根据用户的请求添加和删除内容。不幸的是,我可以添加的内容有限,因为警报框超出了屏幕高度。因此需要滚动窗格。问题是,即使内容在屏幕下方,它似乎也不认为需要滚动 我尝试了很多方法,但每次滚动条都会随着滚动窗格的增长而增长。我甚至尝试了James_D建议的定制滚动窗格,但仍然不走运 任何帮助都会很棒 以下是自定义警报框的代码 import java.util.ArrayList;

有没有一种简单的方法可以将滚动条放在警报框中并让它实际滚动?我正在将网格窗格添加到滚动窗格中。当警报框处于活动状态时,我会根据用户的请求添加和删除内容。不幸的是,我可以添加的内容有限,因为警报框超出了屏幕高度。因此需要滚动窗格。问题是,即使内容在屏幕下方,它似乎也不认为需要滚动

我尝试了很多方法,但每次滚动条都会随着滚动窗格的增长而增长。我甚至尝试了James_D建议的定制滚动窗格,但仍然不走运

任何帮助都会很棒

以下是自定义警报框的代码

import java.util.ArrayList;
import java.util.List;

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XmlVisitor.TextPredictor;    
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.DialogPane;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;

public class SettingsChangeWindow extends Alert {

    public enum SETTING_TYPE {SINGLE, MULTIPLE};

    private SETTING_TYPE type = null;

    private IndexedGridPane parentGrid;
    private SettingBean bean;
    private DialogPane parentPane;


    public SettingsChangeWindow(SettingBean bean) {
        super(AlertType.CONFIRMATION);
        this.bean = bean;
        this.type = bean.getType();
        SizeableScrollPane scroll = new SizeableScrollPane();
        scroll.setHbarPolicy(ScrollBarPolicy.ALWAYS);
        scroll.setVbarPolicy(ScrollBarPolicy.ALWAYS);
        scroll.setFitToHeight(true);
        scroll.setFitToWidth(true);
        parentGrid = new IndexedGridPane();
        scroll.setContent(parentGrid);
        this.parentPane = getDialogPane();
        setResizable(true);

        if(type == SETTING_TYPE.SINGLE){
            FriendlyVBox vbox = new FriendlyVBox();
            setTitle("Change " + bean.getName());
            setHeaderText("Change the " + bean.getName() + " value by changing the value in the box");
            parentGrid.setPadding(new Insets(20, 150, 0, 10));
            vbox.getChildren().addAll(new Label(bean.getName()), new AutoTextBox(bean.getValue()));
            parentGrid.add(vbox, 0, 0);
        }else{
            setTitle("Change " + bean.getName());
            String header = "Change the " + bean.getName() + " value by changing the value in the box\n";
            header += "You may add and delete value sets (may require resizing)";
            setHeaderText(header);
            parentGrid.add(new AddButton(), 1, 0);
            parentGrid.add(new RemoveButton(), 2, 0);
            addMultipleValues();
        }

        this.parentPane.setContent(scroll);

//      parentPane.setMinHeight(GridPane.USE_PREF_SIZE);
//      parentPane.setMinWidth(GridPane.USE_PREF_SIZE);
//      getDialogPane().getChildren().stream().forEach(node -> ((Label)node).setMinHeight(Region.USE_PREF_SIZE));

    }

    public SettingBean getValue(){
        return bean;
    }

    private void addMultipleValues(){
        List<Object> values = bean.getChildren();

        if(bean.getName().equals("TSPAddressPostal") || bean.getName().equals("SchemeOperatorAddressPostal")){
            for(Object addr : values){
                PhysicalAddressBean address = (PhysicalAddressBean)addr;
                addPhysicalAddress(address);
            }           
        }else{
            for(Object uri : values){
                addURI((String)uri);
            }
        }


    }

    public void saveValue(){
        if(type == SETTING_TYPE.SINGLE){
            List<Node> children = parentGrid.getChildren();
            for(Node child : children){
                if(child instanceof FriendlyVBox){
                    // cast to FriendlyVBox
                    String value = ((FriendlyVBox)child).getTextField().getText();
                    this.bean.setValue(value);
                }
            }
        }else{
            saveMultipleValues();
        }
    }

    /**
     * For values in XML that can have multiple child nodes
     */
    private void saveMultipleValues(){
        switch(bean.getName()){
        case "TSPAddressPostal" :
            savePostalAddress();
            break;
        case "SchemeOperatorAddressPostal":
            savePostalAddress();
            break;
        default:
            saveURI();
            break;
        }
    }

    /**
     * If the setting bean is encapsulating a list of physical address
     * (when the name is: PostalAddress) populate via predefined structure
     */
    private void savePostalAddress(){
        List<Object> addresses = new ArrayList<>();
        List<Node> children = parentGrid.getChildren();
        for(Node child : children){
            if(child instanceof IndexedGridPane){
                IndexedGridPane pane = (IndexedGridPane) child;
                PhysicalAddressBean add = new PhysicalAddressBean();

                // each address attribute in the order listed in Trust List XML
                add.setStreetAddress(((FriendlyVBox)pane.get(0, 1)).getTextField().getText());
                add.setLocality(((FriendlyVBox)pane.get(0, 2)).getTextField().getText());
                add.setPostalCode(((FriendlyVBox)pane.get(0, 3)).getTextField().getText());
                add.setCountryName(((FriendlyVBox)pane.get(0, 4)).getTextField().getText());

                // add address bean to list
                addresses.add(add);
            }
        }

        bean.setChildren(addresses);
    }

    /**
     * used to store any values in the XML that can have multiple child URI values
     */
    private void saveURI(){
        List<Object> uris = new ArrayList<>();
        List<Node> children = parentGrid.getChildren();
        for(Node child : children){
            if(child instanceof FriendlyVBox){
                FriendlyVBox vBox = (FriendlyVBox) child;
                uris.add(vBox.getTextField().getText());
            }
        }

        bean.setChildren(uris);
    }

    private void addURI(String uri){
        int newSlot = parentGrid.getRowCount();
        FriendlyVBox vBox = new FriendlyVBox();
        vBox.getChildren().addAll(new Label("\n" + bean.getName()), new AutoTextBox(""));
        parentGrid.add(vBox, 0, newSlot);
    }

    private void addPhysicalAddress(){
        int newSlot = parentGrid.getRowCount();
        IndexedGridPane pane = new IndexedGridPane();
        Label label = new Label("\nPostal Address");
        pane.add(label, 0, 0);
        label.setFont(Font.font("system", FontWeight.BOLD, 12));

        FriendlyVBox postal = new FriendlyVBox();
        postal.getChildren().addAll(new Label("Street Address"), new AutoTextBox(""));
        FriendlyVBox local = new FriendlyVBox();
        local.getChildren().addAll(new Label("Locale"), new AutoTextBox(""));
        FriendlyVBox postalCode = new FriendlyVBox();
        postalCode.getChildren().addAll(new Label("Postal Code"), new AutoTextBox(""));
        FriendlyVBox country = new FriendlyVBox();
        country.getChildren().addAll(new Label("Country Name"), new AutoTextBox(""));


        pane.add(postal, 0, 1);
        pane.add(local, 0, 2);
        pane.add(postalCode, 0, 3);
        pane.add(country, 0, 4);

        parentGrid.add(pane, 0, newSlot);


    }

    private void addPhysicalAddress(PhysicalAddressBean address){
        int newSlot = parentGrid.getRowCount();
        IndexedGridPane pane = new IndexedGridPane();
        Label label = new Label("\nPostal Address");
        pane.add(label, 0, 0);
        label.setFont(Font.font("system", FontWeight.BOLD, 12));
        FriendlyVBox street = new FriendlyVBox();
        street.getChildren().addAll(new Label("Street Address"), new AutoTextBox(address.getStreetAddress()));
        FriendlyVBox local = new FriendlyVBox();
        local.getChildren().addAll(new Label("Locale"), new AutoTextBox(address.getLocality()));
        FriendlyVBox postalCode = new FriendlyVBox();
        postalCode.getChildren().addAll(new Label("Postal Code"), new AutoTextBox(address.getPostalCode()));
        FriendlyVBox country = new FriendlyVBox();
        country.getChildren().addAll(new Label("Country Name"), new AutoTextBox(address.getCountryName()));


        pane.add(street, 0, 1);
        pane.add(local, 0, 2);
        pane.add(postalCode, 0, 3);
        pane.add(country, 0, 4);

        parentGrid.add(pane, 0, newSlot);

    }



    private class IndexedGridPane extends GridPane{



        public  Node get(final int row, final int column) {
            Node result = null;
            ObservableList<Node> childrens = super.getChildren();

            for (Node node : childrens) {
                if(super.getRowIndex(node) == row && super.getColumnIndex(node) == column) {
                    result = node;
                    break;
                }
            }

            return result;
        }

        public int getRowCount() {
            int numRows = getRowConstraints().size();
            for (int i = 0; i < getChildren().size(); i++) {
                Node child = getChildren().get(i);
                if (child.isManaged()) {
                    Integer rowIndex = GridPane.getRowIndex(child);
                    if(rowIndex != null){
                        numRows = Math.max(numRows,rowIndex+1);
                    }
                }
            }
            return numRows;
        }
    }

    private class AutoTextBox extends TextField{

        public AutoTextBox(String contents){
            setMinWidth(Region.USE_PREF_SIZE);
            setMaxWidth(Region.USE_PREF_SIZE);
            textProperty().addListener(new AutoAdjustText());
            setText(contents);
        }

        private class AutoAdjustText implements ChangeListener<String>{

            @Override
            public void changed(ObservableValue<? extends String> ov,
                    String prevText, String currText) {
                Platform.runLater(() -> {
                    Text text = new Text(currText);
                    text.setFont(getFont()); // Set the same font, so the size is the same
                    double width = text.getLayoutBounds().getWidth() // This big is the Text in the TextField
                            + getPadding().getLeft() + getPadding().getRight() // Add the padding of the TextField
                            + 2d; // Add some spacing
                    setPrefWidth(width); // Set the width
                    positionCaret(getCaretPosition()); // If you remove this line, it flashes a little bit
                });

            }

        }
    }

    private class FriendlyVBox extends VBox{

        public TextField getTextField(){
            List<Node> children = getChildren();
            for(Node child : children){
                if(child instanceof TextField){
                    return (TextField)child;
                }
            }

            return null;
        }
    }

    private class AddButton extends Button{
        public AddButton(){
            setText("Add+");
            onActionProperty().set(new AddValue());
        }

        private class AddValue implements EventHandler<ActionEvent>{

            @Override
            public void handle(ActionEvent event) {
                if(bean.getName().equals("TSPAddressPostal") || bean.getName().equals("SchemeOperatorAddressPostal")){
                    addPhysicalAddress();
                }else{
                    addURI("Add URI here");
//                  parentPane.setContent(parentGrid);
                }

                parentPane.getScene().getWindow().sizeToScene();
            }
        }
    }

    private class RemoveButton extends Button{
        public RemoveButton(){
            setText("Remove");
            onActionProperty().set(new RemoveValue());
        }

        private class RemoveValue implements EventHandler<ActionEvent>{

            @Override
            public void handle(ActionEvent event) {
                int rowCount = parentGrid.getRowCount();
                parentGrid.getChildren().remove(rowCount);
                parentPane.getScene().getWindow().sizeToScene();
            }
        }
    }


    private class SizeableScrollPane extends ScrollPane{
        public SizeableScrollPane() {
            viewportBoundsProperty().addListener(new Resizer());
            hvalueProperty().addListener(new Resizer());
            vvalueProperty().addListener(new Resizer());
        }


        private class Resizer implements ChangeListener<Object> {

            @Override
            public void changed(ObservableValue<? extends Object> observable, Object oldValue, Object newValue) {
                double hmin = getHmin();
                double hmax = getHmax();
                double hvalue = getHvalue();
                double contentWidth = getContent().getLayoutBounds().getWidth();
                double viewportWidth = getViewportBounds().getWidth();

                double hoffset = 
                    Math.max(0, contentWidth - viewportWidth) * (hvalue - hmin) / (hmax - hmin);

                double vmin = getVmin();
                double vmax = getVmax();
                double vvalue = getVvalue();
                double contentHeight = getContent().getLayoutBounds().getHeight();
                double viewportHeight = getViewportBounds().getHeight();

                double voffset = 
                    Math.max(0,  contentHeight - viewportHeight) * (vvalue - vmin) / (vmax - vmin);

                System.out.printf("Offset: [%.1f, %.1f] width: %.1f height: %.1f %n", 
                        hoffset, voffset, viewportWidth, viewportHeight);


            }
        }
    }






}
import java.util.ArrayList;
导入java.util.List;
导入com.sun.xml.internal.bind.v2.runtime.unmarshaller.XmlVisitor.TextPredictor;
导入javafx.application.Platform;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Bounds;
导入javafx.geometry.Insets;
导入javafx.scene.Node;
导入javafx.scene.control.Alert;
导入javafx.scene.control.Button;
导入javafx.scene.control.DialogPane;
导入javafx.scene.control.Label;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.control.ScrollPane.ScrollBarPolicy;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Region;
导入javafx.scene.layout.VBox;
导入javafx.scene.text.Font;
导入javafx.scene.text.FontWeight;
导入javafx.scene.text.text;
公共类设置更改窗口扩展警报{
公共枚举设置_类型{SINGLE,MULTIPLE};
私有设置_TYPE=null;
私有IndexedGridPane父网格;
私家菜豆;
私有对话框窗格父窗格;
公共设置更改窗口(设置bean bean){
超级(AlertType.CONFIRMATION);
this.bean=bean;
this.type=bean.getType();
SizeableScrollPane scroll=新的SizeableScrollPane();
scroll.setHbarPolicy(ScrollBarPolicy.ALWAYS);
scroll.setVbarPolicy(ScrollBarPolicy.ALWAYS);
scroll.setFitToHeight(true);
scroll.setFitToWidth(true);
parentGrid=newindexedgridpane();
scroll.setContent(parentGrid);
this.parentPane=getDialogPane();
可设置大小(真);
if(type==设置_type.SINGLE){
FriendlyVBox vbox=新建FriendlyVBox();
setTitle(“Change”+bean.getName());
setHeaderText(“通过更改框中的值来更改“+bean.getName()+”值”);
setPadding(新的插入(20,150,0,10));
vbox.getChildren().addAll(新标签(bean.getName()),新自动文本框(bean.getValue());
parentGrid.add(vbox,0,0);
}否则{
setTitle(“Change”+bean.getName());
String header=“通过更改框中的值来更改“+bean.getName()+”值\n”;
header+=“您可以添加和删除值集(可能需要调整大小)”;
setHeaderText(标题);
添加(newaddButton(),1,0);
添加(新的RemoveButton(),2,0);
addMultipleValues();
}
this.parentPane.setContent(滚动);
//parentPane.setMinHeight(GridPane.USE_PREF_SIZE);
//parentPane.setMinWidth(GridPane.USE\u PREF\u SIZE);
//getDialogPane().getChildren().stream().forEach(节点->((标签)节点).setMinHeight(Region.USE_PREF_SIZE));
}
公共设置bean getValue(){
返回豆;
}
私有void addMultipleValues(){
列表值=bean.getChildren();
if(bean.getName().equals(“TSPAddressPostal”)| | bean.getName().equals(“SchemeOperatorAddressPostal”)){
用于(对象地址:值){
PhysicalAddressBean地址=(PhysicalAddressBean)addr;
addPhysicalAddress(地址);
}           
}否则{
for(对象uri:值){
addURI((字符串)uri);
}
}
}
public void saveValue(){
if(type==设置_type.SINGLE){
List children=parentGrid.getChildren();
用于(节点子节点:子节点){
if(FriendlyVBox的子实例){
//投给友好的VBox
字符串值=((FriendlyVBox)子级.getTextField().getText();
this.bean.setValue(value);
}
}
}否则{
savemultiplevalue();
}
}
/**
*对于XML中可以有多个子节点的值
*/
私有void saveMultipleValues(){
开关(bean.getName()){
案例“TSPAddressPostal”:
savePostalAddress();
打破
案例“SchemeOperatorAddressPostal”:
savePostalAddress();
打破
违约:
saveURI();
打破
}
}
/**
*如果设置bean正在封装物理地址列表
*(名称为:PostLadAddress时)通过预定义结构填充
*/
私人无效储值邮资(){
列表地址=新的ArrayList();
List children=parentGrid.getChildren();
用于(节点子节点:子节点){
if(IndexedGridPane的子实例){
IndexedGridPane=(IndexedGridPane)子级;
PhysicalAddressBean add=新的PhysicalAddressBean();
//每个地址属性按信任列表XML中列出的顺序排列
add.setStreetAddress(((FriendlyVBox)pane.get(0,1)).getTextField().getText());
add.setLocality(((FriendlyVBox)pane.get(0,2)).getTextField().getText());
add.setPostalCode(((FriendlyVBox)pane.get(0,3)).getTextField().getText());
    scroll.setHbarPolicy(ScrollBarPolicy.ALWAYS);
    scroll.setVbarPolicy(ScrollBarPolicy.ALWAYS);
    scroll.setFitToHeight(true);
    scroll.setFitToWidth(true);
    parentPane.getScene().getWindow().sizeToScene();