如何调整JavaFX8中Swing
内的SwingNode
控件的大小?
有时,我在SwingNode
内调整了控件的大小。但是SwingNode
似乎抵制了这一点。
在resize()
apidoc中说,
应用程序不应直接调用此方法。如果申请 需要直接设置SwingNode的大小,应该设置 Swing组件的最小/首选/最大大小限制 将相应地传播到SwingNode及其父级 将在布局期间兑现这些设置。
但显然它不起作用。
示例代码如下。
问题是:如何让控制变得更大?
public class Try_Sizes_01 extends Application {
private static final Logger log = LoggerFactory.getLogger(Try_Sizes_01.class);
private static final String text = "Very Long Text For Appear On Button ";
private static int position = 7;
//private JButton button = new JButton("short");
private JButton button = new JButton(text.substring(0, position));
private SwingNode swingNode = new SwingNode();
{
swingNode.setContent(button);
}
@Override
public void start(Stage stage) throws Exception {
Group group = new Group();
group.getChildren().add(swingNode);
Scene scene = new Scene(group);
stage.setTitle("Try_Sizes_01");
stage.setScene(scene);
stage.show();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
/*
button.setText(button.getText() + text.charAt(position));
position++;
if( position >= text.length() ) {
position=0;
}
*/
button.setPreferredSize(new Dimension((int)button.getPreferredSize().getWidth()+10, (int)button.getPreferredSize().getHeight()));
button.setMinimumSize(new Dimension((int)button.getPreferredSize().getWidth(), (int)button.getPreferredSize().getHeight()));
//button.revalidate();
//button.setBounds(0, 0, (int)button.getBounds().getWidth()+10, (int)button.getBounds().getHeight());
Platform.runLater(new Runnable() {
@Override
public void run() {
//swingNode.autosize(); // does not work
//swingNode.resize(button.getBounds().getWidth(), button.getBounds().getHeight()); // does not work and cancels button resizing
//swingNode.setContent(button); // works sometimes but imperfect
}
});
log.info("Swing thread");
log.info("Preferred width is now = {}", button.getPreferredSize().getWidth());
log.info("Bounds width is now = {}", button.getBounds().getWidth());
}
}).start();
}
});
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:4)
在基本相同的问题上打了几个小时之后,我终于弄清楚发生了什么。
基本上,问题是SwingNode的父级在布局发生时尝试根据父级的大小设置其大小。因此,当您调整按钮大小,然后触发布局时,SwingNode的父级会将其设置回其默认大小。之所以发生这种情况是因为SwingNode会覆盖isResizable()方法以返回true,从而为其父对象提供调整大小的权限。
为了避免这种情况,你可以:
或:
如果要在FXML中定义类,可能需要使用后一种技术。
顺便说一句,请注意,即使它将isResizable()重写为false,您仍然可以在SwingNode上调用resize(width,height)。
答案 1 :(得分:0)
我不确定它是否完全相同,但似乎与使用父容器正确调整摆动组件的意义相关。在我的情况下,我有一个包含JFreeChart(ChartPanel)的SwingNode,当父框架(SplitPane中的边框窗格)本身已调整大小时,我无法正确调整大小。最后,我只是为高度/宽度属性添加了一个监听器:
pane.widthProperty().addListener((w,o,n)->c.resizeChart((int)n.intValue(), (int)pane.getHeight()));
pane.heightProperty().addListener((w,o,n)->c.resizeChart((int)pane.getWidth(), (int)n.intValue()));
我尝试的其他任何事情都无法模仿。 感谢
答案 2 :(得分:-1)
我发现窗格监听器有帮助,但由于我的组件的专有性质,它仍然没有调整大小。我正在使用fxml并尝试将SwingNode放在窗格中以进行布局。然后我注意到一些示例使用的是StackPane,而不仅仅是一个Pane,突然之间只是对代码的修改进行了改动。这是在AnchorPane内部,它似乎也确保组件的初始显示填充所有可用空间。总之,AnchorPane中的所有Anchor设置为0的StackPane确保了所有初始可用空间的受控填充,然后完成所有调整大小,当手动调整大小的侦听器时,所有这些都开始工作。
pane.widthProperty().addListener((w,o,n)->c.resizeChart((int)n.intValue(), (int)pane.getHeight()));
pane.heightProperty().addListener((w,o,n)->c.resizeChart((int)pane.getWidth(), (int)n.intValue()));