我正在制作一个简单的Jeopardy式游戏:
使用Java Swing。它显然是一个JFrame,其中包含JPanel和行中的按钮。
现在我需要的是添加一个带有居中和包装文本的分层面板:
我可以稍后删除。我已经尝试过使用JTextPane和JTextArea以及JPanel,这些都不想显示。我用AWT Panel实现的最佳效果,它确实显示但我不能将文本居中或换行。
这是我为之道歉的一些代码,我通常会尝试使其简短易读,但由于它无法正常工作,我不知道该怎么做才能让它看起来更好:
JLabel questionLabel = new JLabel(questionList.get(randomNumber).getQuestion(), SwingConstants.CENTER);
Font font = new Font("Arial", Font.PLAIN, 20);
//------------------JTextPane--------------------
JTextPane questionPane = new JTextPane();
questionPane.setForeground(Color.WHITE);
questionPane.setSize(gameWidth, gameHeight);
questionPane.setText(questionList.get(randomNumber).getQuestion());
questionPane.setFont(font);
questionPane.setEditable(false);
//------------------AWT panel--------------------
Panel awtPanel = new Panel();
awtPanel.setBackground(Color.blue);
awtPanel.setSize(game.getWidth(),game.getHeight());
Label labelQuestion = new Label("<html>" + questionList.get(randomNumber).getQuestion() + "</html>", Label.CENTER);
labelQuestion.setFont(font);
awtPanel.setForeground(Color.white);
awtPanel.add(labelQuestion);
//------------------JPanel-----------------------
JPanel layeredPanel = new JPanel();
layeredPanel.setBackground(Color.blue);
layeredPanel.setSize(game.getWidth(),game.getHeight());
JLabel jLabelQuestion = new JLabel("<html>" + questionList.get(randomNumber).getQuestion() + "</html>", SwingConstants.CENTER);
jLabelQuestion.setFont(font);
layeredPanel.setForeground(Color.WHITE);
layeredPanel.add(jLabelQuestion, BorderLayout.CENTER);
game.getLayeredPane().add(layeredPanel, JLayeredPane.DEFAULT_LAYER);
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
button.setEnabled(false);
font = new Font("Arial", Font.PLAIN, 16);
button.add(jLabelQuestion, BorderLayout.CENTER);
button.setDisabledIcon(new ImageIcon(source.getScaledInstance(gameWidth/4, gameHeight/5, java.awt.Image.SCALE_SMOOTH)));
questionList.remove(randomNumber);
logger.info(questionList.size());
game.getLayeredPane().remove(layeredPanel);
更新:我使用了SWT而不是Swing,我使用StackLayout中包含一些复合材料,然后根据我的需要在它们之间进行更改。
答案 0 :(得分:2)
您通常可以使用JLabel解决此类问题。
我建议将上面的网格封装在另一个窗格的BorderLayout.CENTER中,也许是一个新的内容窗格。然后,将标题添加到BorderLayout.NORTH。
作为一个更切实的例子,
private void createContent() {
this.getContentPane().setLayout(new BorderLayout());
//establish the panel currently set as center, here labeled "everythingElse"
this.getContentPane().add(everythingElse, BorderLayout.CENTER);
//Create a JLabel with your caption
JLabel jlbl = new JLabel("Question");
//format that caption, most details being rather obvious, but most importantly:
jlbl.setHorizontalAlignment(SwingConstants.CENTER); //keeps text centered
this.getContentPane().add(jlbl, BorderLayout.NORTH); //add it to the top of the panel
//...other cleanup operations...
}
网格窗格的问题在于它们对可见组件数量的容忍度有限。如果你超载一个,它将不会显示。对于BorderLayout窗格,您可以轻松地将新项目换入和换出它们。
为了提高效率,我可能会建议将此JLabel编译为代码中的其他位置,并在需要时保留它。这样,您也可以避免重复创建标签对象。
最后,尽可能避免使用AWT。它被弃用了超过十年,如果你使用它,你将遇到许多涉及重量级和轻量级组件不兼容的关键问题。如果您打算使用另一个窗口工具包,请考虑使用JFXPane实现新标准JavaFX--它也更容忍HTML语法。