将滚动条添加到文本字段
Add scrollbar to textfield
假设我有两个文本字段,并且两个文本字段都包含一个长度相同的文本。文本可以比文本字段大得多。如果有人使用光标或通过标记文本滚动浏览此文本字段,则两个文本字段应该滚动完全相同。
我想添加一个滚动条来表示文本字段的文本。如果文本小于文本字段,那么滚动条应该是满的(拇指不能移动)。文本字段和滚动条中的文本在滚动时都应该相应地表现。
整个事情看起来像这样:
如何将所有三个控件的滚动事件相互绑定?
如何设置最小值和最大值以及绑定滚动条的值?
这是一种解决方案。此示例采用两个 TextFields
和一个水平 ScrollBar
并将它们添加到一个组中。然后根据当前ScrollBar
值移动TextFields'
光标位置
Controller
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TextField;
/**
*
* @author Sedrick
*/
public class FXMLDocumentController implements Initializable {
@FXML TextField tfOne, tfTwo;
@FXML ScrollBar sbMain;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
sbMain.setMin(0);
sbMain.setMax(tfOne.getText().length());
tfOne.setOnKeyReleased(keyEvent ->{
if(tfOne.getText().length() <= tfTwo.getText().length())
{
sbMain.setMax(tfOne.getText().length());
}
});
tfTwo.setOnKeyReleased(keyEvent ->{
if(tfTwo.getText().length() <= tfOne.getText().length())
{
sbMain.setMax(tfOne.getText().length());
}
});
sbMain.valueProperty().addListener((obs, oldVal, newVal)->{
System.out.println(newVal);
tfOne.positionCaret(newVal.intValue());
tfTwo.positionCaret(newVal.intValue());
});
}
}
FXML
<?import javafx.scene.Group?>
<?import javafx.scene.control.ScrollBar?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="375.0" prefWidth="460.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication34.FXMLDocumentController">
<children>
<Group />
<ScrollBar fx:id="sbMain" layoutX="137.0" layoutY="209.0" prefHeight="18.0" prefWidth="187.0" />
<TextField fx:id="tfOne" layoutX="137.0" layoutY="178.0" text="SDadsaSasdasASasADSasASDadsadadA" />
<TextField fx:id="tfTwo" layoutX="137.0" layoutY="147.0" text="SDadsaSasdasASasADSasASDadsadadA" />
</children>
</AnchorPane>
假设我有两个文本字段,并且两个文本字段都包含一个长度相同的文本。文本可以比文本字段大得多。如果有人使用光标或通过标记文本滚动浏览此文本字段,则两个文本字段应该滚动完全相同。
我想添加一个滚动条来表示文本字段的文本。如果文本小于文本字段,那么滚动条应该是满的(拇指不能移动)。文本字段和滚动条中的文本在滚动时都应该相应地表现。
整个事情看起来像这样:
如何将所有三个控件的滚动事件相互绑定?
如何设置最小值和最大值以及绑定滚动条的值?
这是一种解决方案。此示例采用两个 TextFields
和一个水平 ScrollBar
并将它们添加到一个组中。然后根据当前ScrollBar
值移动TextFields'
光标位置
Controller
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TextField;
/**
*
* @author Sedrick
*/
public class FXMLDocumentController implements Initializable {
@FXML TextField tfOne, tfTwo;
@FXML ScrollBar sbMain;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
sbMain.setMin(0);
sbMain.setMax(tfOne.getText().length());
tfOne.setOnKeyReleased(keyEvent ->{
if(tfOne.getText().length() <= tfTwo.getText().length())
{
sbMain.setMax(tfOne.getText().length());
}
});
tfTwo.setOnKeyReleased(keyEvent ->{
if(tfTwo.getText().length() <= tfOne.getText().length())
{
sbMain.setMax(tfOne.getText().length());
}
});
sbMain.valueProperty().addListener((obs, oldVal, newVal)->{
System.out.println(newVal);
tfOne.positionCaret(newVal.intValue());
tfTwo.positionCaret(newVal.intValue());
});
}
}
FXML
<?import javafx.scene.Group?>
<?import javafx.scene.control.ScrollBar?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="375.0" prefWidth="460.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication34.FXMLDocumentController">
<children>
<Group />
<ScrollBar fx:id="sbMain" layoutX="137.0" layoutY="209.0" prefHeight="18.0" prefWidth="187.0" />
<TextField fx:id="tfOne" layoutX="137.0" layoutY="178.0" text="SDadsaSasdasASasADSasASDadsadadA" />
<TextField fx:id="tfTwo" layoutX="137.0" layoutY="147.0" text="SDadsaSasdasASasADSasASDadsadadA" />
</children>
</AnchorPane>