java内容不局限于JPanel
我在JavaFX项目的锚定窗格中有一个JPanel。我遇到的问题是,面板中加载的内容并不局限于面板,一旦文本到达面板边缘,就会将其切掉,而不是移动到下一行
不过,如果我在Jframe中测试面板,这是可以的
锚面板是使用Scene Builder for JavaFX创建并放置在用户界面中的。 下面是我制作各种字体大小的标签(这是为了创建一个单词云)并将它们放在一个JPanel中,然后返回这个面板的代码
public JPanel nnsePairWordCloud() throws SQLException, InstantiationException, IllegalAccessException {
Database databaseConnection = new Database();
databaseConnection.getConnection();
ResultSet nnsePairs = databaseConnection.getNNSEPairInfoFromDatabase();
ResultSet nnseScores = databaseConnection.getNNSESimilarityResultsFromDatabase();
//adding words from the database to the array that will make up the word cloud
while(nnsePairs.next()) {
String wordPair = nnsePairs.getString(1);
WORDS.add(wordPair);
}
//adding each pairs weighting from the database - this will determine the size of the word
while(nnseScores.next()) {
Double wordResult = nnseScores.getDouble(1);
WEIGHTINGS.add(wordResult);
}
System.out.println("cloud data got");
JPanel panel = new JPanel();
panel.setSize(380, 275);
Cloud cloud = new Cloud();
// cloud.setMinWeight(-1);
//cloud.setMaxWeight(1);
cloud.setMaxTagsToDisplay(300);
//Random random = new Random();
for (int i =0; i<WORDS.size(); i++) {
cloud.addTag(new Tag(WORDS.get(i), WEIGHTINGS.get(i)));
}
for (Tag tag : cloud.tags()) {
final JLabel label = new JLabel(tag.getName());
label.setOpaque(false);
label.setFont(label.getFont().deriveFont((float) tag.getWeight() * 10));
panel.add(label);
}
//frame.add(panel);
//frame.setSize(800, 600);
//frame.setVisible(true);
return panel;
}
下面是返回并设置面板的代码——首先创建SwingNode,然后加载内容。我必须这样做,这样才能在JavaFXUI中加载内容
final SwingNode nodeForWordCloud = new SwingNode();
createAndSetSwingContentForWordCloud(nodeForWordCloud);
wordCloudBox.getChildren().add(nodeForWordCloud);
private void createAndSetSwingContentForWordCloud(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
swingNode.setContent(new WordCloud().initUI());
} catch (SQLException ex) {
Logger.getLogger(WordNetPairPageController.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(WordNetPairPageController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(WordNetPairPageController.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
# 1 楼答案
我知道了
如果我使用JavaFX FlowPane,那么它可以解决我遇到的两个问题。内容现在在窗格中流动,不会被切断,内容会直接加载,因为它不再是swing组件,因此不必在单独的线程上运行
任何有类似问题的人都可以查看JavaFX中不同的布局是如何工作的,因为这将帮助您确定使用哪种布局。这些面板的工作原理与Swing中的非常不同