1

JButtonJLabelカスタム背景を追加すると消えます。私のプログラムには何の問題もありませんが、解決策が見つかるかもしれません! ほんの少し忘れているだけだと思いますが、わかりません。

コードは次のとおりです。

GameWindow.java:

setContentPane(new StartImagePanel(RollrackLogo));
out.println("adding JLWelcome");
JLWelcome.setText("Welcome to Rollrack, " + namewindow.name);
add(JLWelcome);
JLWelcome.setVisible(true);
out.println("JLWelcome added");
out.println("adding JBRandom");
JBRandom.setText("Random");
add(JBRandom);
JBRandom.setVisible(true);
out.println("added JBRandom");

背景は完璧に見えますが、JButtonand JLabel!

へのコードStartImagePanel.java:

public class StartImagePanel extends JComponent{
    private Image image;
    public StartImagePanel(Image image) {
        this.image = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null);
    }
}
4

2 に答える 2

2

ボタンとラベルはフレームに追加されますが、代わりにGameWindowcontentPaneに追加する必要があります。setContentPane(new StartImagePanel(RollrackLogo));そのため、表示されておらず、フレームに追加されています。

の変数を作成しStartImagePanel、それにボタンとラベルを追加すると、それらが表示されるはずです。

StartImagePanel contentPanel = new StartImagePanel(RollrackLogo);
setContentPane(contentPanel);

...

out.println("adding JLWelcome");
JLWelcome.setText("Welcome to Rollrack, " + namewindow.name);
contentPanel.add(JLWelcome);
JLWelcome.setVisible(true);
out.println("JLWelcome added");
out.println("adding JBRandom");
JBRandom.setText("Random");
contentPanel.add(JBRandom);
JBRandom.setVisible(true);
out.println("added JBRandom");

論争に答える

最初の段落の主張は明らかに間違っています。これがそれを証明する情報源です。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class AddToCustomContentPane {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new FlowLayout());
                gui.setBorder(new EmptyBorder(2, 3, 2, 3));
                gui.setBackground(Color.RED);

                JFrame f = new JFrame("Demo");
                f.setContentPane(gui);

                // Acid test.  Can we add buttons direct to the frame?
                f.add(new JButton("Button 1"));
                f.add(new JButton("Button 2"));

                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

カスタムパネルコードが与えられた後に編集する

これは、黒い画像の背景にボタンとラベルの両方を表示するために機能するスニペットです。不要なもの(リスナー)を削除しました。

public static void main(String[] v) {

class StartImagePanel extends JPanel {
  private Image image;
  public StartImagePanel(Image image) {
      this.image = image;
  }
  @Override
  protected void paintComponent(Graphics g) {
    g.drawImage(image, 0, 0, null);
  }
}

class GameWindow extends JFrame{
  public GameWindow() {
    BufferedImage RollrackLogo;
    RollrackLogo = new BufferedImage(400,200,BufferedImage.TYPE_INT_RGB);
    final JButton JBRandom = new JButton();
    final JLabel JLWelcome = new JLabel();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    StartImagePanel panel = new StartImagePanel(RollrackLogo);
    setContentPane(panel);
    setExtendedState(MAXIMIZED_BOTH);
    setVisible(true);
    JLWelcome.setText("Welcome to Rollrack");
    panel.add(JLWelcome);
    JLWelcome.setVisible(true);
    JBRandom.setText("Random");
    panel.add(JBRandom);
    JBRandom.setVisible(true);
  }
}

GameWindow window = new GameWindow();
window.pack();
window.setVisible(true);
}
于 2013-02-21T13:14:49.433 に答える
1

JFrame@Andrew Thompsonが別の質問で提案したように、私はむしろそれを拡張する代わりに a のインスタンスを使用します。ただし、拡張する場合は、コンストラクター
を呼び出すことをお勧めします。 さらに、あなたの で何が起こっているかを知る必要があるかもしれません。 私には、それが問題のようです。super()

StartImagePanel

  1. GameWindowと の両方がスーパークラスを適切にStartImagePanel拡張していることを確認します( を呼び出しますsuper();)。
  2. StartImagePanelが適切であることを確認してくださいLayout
  3. フレームを表示するに、コンポーネントを追加してください。これは、必要がないことも意味しますJLWelcome.setVisible(true);
  4. コードが EDT ( Event-Dispatch Thread ) で実行されていることを確認します。

例:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class GameWindow extends JFrame{
    BufferedImage rollrackLogo;
    JButton jbRandom;
    JLabel jlWelcome;

    public GameWindow() {
        super();
        jbRandom = new JButton("Random");
        jlWelcome = new JLabel("Welcome to Rollrack, " +
                namewindow.name);

        rollrackLogo = new BufferedImage(400, 200,
                BufferedImage.TYPE_INT_RGB);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setContentPane(new StartImagePanel(rollrackLogo));

        // Add your components.
        add(jlWelcome);
        add(jbRandom);

        addKeyListener(new KeyListener() {
            @SuppressWarnings("static-access")
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == e.VK_ESCAPE){
                    System.exit(7);
                }
            }

            @Override
            public void keyReleased(KeyEvent arg0) {}

            @Override
            public void keyTyped(KeyEvent arg0) {}
        });

        // Pack, or otherwise set fullscreen.
        pack();

        // Now, set frame visible.
        setVisible(true);
    }
}

編集:のコードを投稿したのでStartImagePanel、 を拡張していることがわかりますJComponentsuper以前のアドバイス (call )に従い、代わりに a を設定しLayoutて拡張JPanelします。

于 2013-02-21T14:40:58.923 に答える