簡體   English   中英

添加自定義背景時,JButton和JLabel會消失

[英]JButton and JLabel dissappears when adding custom background

添加自定義背景時, 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");

背景看起來很完美,但不是JButtonJLabel

代碼到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);
    }
}

您的按鈕和標簽會添加到您的GameWindow框架中,同時應將它們添加到其contentPane, setContentPane(new StartImagePanel(RollrackLogo)); 代替。 這就是他們沒有展示的原因,他們被添加到框架中。

創建一個StartImagePanel的變量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);
}

我寧願使用JFrame的實例,而不是擴展它,正如@Andrew Thompson在另一個問題中所建議的那樣。
但是,如果要擴展它,在構造函數中調用super()可能是一個好習慣。

此外,我們可能需要知道您的StartImagePanel發生了什么。
對我來說,似乎是問題所在。

  1. 確保GameWindowStartImagePanel正確地擴展其超類(調用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的代碼,我發現您正在擴展JComponent 按照我之前的建議(調用super ),設置Layout ,然后擴展JPanel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM