为了解决边距内的打印问题,我尝试缩放我的表单,使其缩小到将要打印到的纸张大小。
Printable.java
VBox
内部
public void scaleToFit(){
double maxWidth = 497.0;
this.requestLayout();
double width = this.getWidth();
if(width > maxWidth){
double widthFrac = maxWidth / width;
this.setScaleX(widthFrac);
}
System.out.println(this.getWidth());
//edited out same process for height
}
Printable
将保留在HashMap data.table
中。加载打印窗口后,我为每个窗口运行scaleToFit
。 main
是ScrollPane。
ModPrintCycle.java
内部
//inside constructor
main.sceneProperty().addListener(new ChangeListener<Scene>(){
@Override
public void changed(ObservableValue<? extends Scene> observable, Scene oldValue, Scene newValue) {
System.out.println("new Scene");
newValue.windowProperty().addListener(new ChangeListener<Window>(){
public void changed(ObservableValue<? extends Window> arg0, Window arg1, Window arg2) {
System.out.println("new Window");
arg2.setOnShown(new EventHandler<WindowEvent>(){
@Override
public void handle(WindowEvent event) {
Platform.runLater(new Runnable(){
@Override
public void run() {
System.out.println(event.toString());
lookingAt = data.tables.size();
while(lookingAt-1 >= 0 ){
showNext(-1);
}
}
});
}
});
}
});
}
});
仅针对此示例,我还在按钮中添加了scaleToFit()
,这些按钮在Printable
之间发生了变化。 [编辑:添加了明确显示使用scaleToFit()的脚本]注意data.tables
是包含Printables的HashMap。
ModPrintCycle.java
内部继续private void showNext(int move){
boolean k = false;
if(move > 0 && lookingAt+move < data.tables.size()){
k = true;
}
else if(move < 0 && lookingAt+move >=0){
k = true;
}
if(k){
lookingAt+= move;
}
show();
}
private void show(){
if(data.tables.size() > 0){
if(lookingAt >= 0 && lookingAt < data.tables.size()){
//tableOrder is an ArrayList<String> for the arrangement of data.tables
if(tableOrder.size() > 0){
Printable pt = data.tables.get(tableOrder.get(lookingAt));
main.setContent(pt);
pt.scaleToFit();
}
}
else{
if(lookingAt < 0){
lookingAt = 0;
show();
}
else if(lookingAt >= data.tables.size()){
lookingAt = data.tables.size()-1;
show();
}
}
txtStatus.setText((lookingAt+1) + " / " + data.tables.size());
}else{
main.setContent(null);
txtStatus.setText("Empty");
}
}
public void printAll(ArrayList<String> pageList){
//PrinterJob pj is global
//conditions and try declarations
pj = PrinterJob.createPrinterJob(curP);
PageLayout pp = curP.createPageLayout(Paper.LEGAL, PageOrientation.PORTRAIT, MarginType.DEFAULT);
PageLayout pl = curP.createPageLayout(Paper.LEGAL, PageOrientation.LANDSCAPE, MarginType.DEFAULT);
for(String p : pageList){
Printable pt = data.tables.get(p);
pt.scaleToFit();
if(pt.isLandscape()){
pj.printPage(pl,pt);
}
else{
pj.printPage(pp,pt);
}
}
pj.endJob();
// catch statements
}
但是,每当第一次调用scaleToFit()
时(加载ModPrintCycle
时),它会告诉我宽度为0,因此不会缩放。它第二次被调用(当我第一次在它们之间进行切换时),它仍然为0.当它最终运行第三次时(当我回顾Printable
时),它终于有效了并根据需要更改宽度。
由于需要打印这些Printable
,我无法确保表单被缩放,直到有人查看所有表单两次。
如何在加载表单之前强制表单占用它们?
答案 0 :(得分:1)
由于您发布的代码不是完全可执行的(即不是MCVE或SSCCE),因此无法再现该问题。也很难猜出原因。但是我看到了你的目的,所以我建议不要手动缩放它,让可打印的缩放本身通过监听器自动缩放:
@Override
public void start( Stage stage )
{
ScrollPane scrollPane = new ScrollPane( new Printable( new Label( "looong loooong loooooong looooong loooong text" ) ) );
stage.setScene( new Scene( scrollPane ) );
stage.show();
}
class Printable extends VBox
{
public Printable( Node... children )
{
super( children );
Printable me = this;
this.widthProperty().addListener( new ChangeListener<Number>()
{
@Override
public void changed( ObservableValue<? extends Number> observable, Number oldValue, Number newValue )
{
double maxWidth = 100.0;
double width = newValue.doubleValue();
if ( width > maxWidth )
{
double widthFrac = maxWidth / width;
me.setScaleX( widthFrac );
}
}
} );
}
}