0

私は単純なジェパディ風のゲームを作っています:

ここに画像の説明を入力

Java Swing を使用します。これは明らかに、JPanel と行のボタンを含む JFrame です。

ここで必要なのは、テキストが中央に配置され、折り返されたレイヤード パネルを追加することです。

ここに画像の説明を入力

後で削除できます。私はすでに JTextPane と JTextArea と JPanel を使ってみましたが、どれも表示したくありません。AWT パネルで達成した最高の効果は表示されますが、テキストを中央に配置したり、折り返したりすることはできません。

ここに私がお詫びするいくつかのコードがあります。私は通常、短くて読みやすいものにしようとしますが、機能しないため、見栄えを良くするためにどうすればよいかわかりません。

    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);

更新: Swing ではなく SWT に変更しました。いくつかのコンポジットを含む StackLayout を使用し、必要に応じてそれらを変更します。

4

1 に答える 1

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 をコードの別の場所で final としてコンパイルし、必要な場合に備えて保持することをお勧めします。このようにして、ラベル オブジェクトを繰り返し作成することによるオーバーヘッドも回避できます。

最後に、できる限り AWT を避けてください。これは 10 年以上にわたって廃止されており、実際に使用すると、重量コンポーネントと軽量コンポーネントの非互換性を含む多くの重大な問題に遭遇します。別のウィンドウ キットを使用する場合は、JFXPane を使用して新しい標準 JavaFX を実装することを検討してください。JavaFX は、HTML 構文に対してもはるかに寛容です。

于 2013-11-05T20:57:51.220 に答える