1

可能重复:
如何在 java 的 Swing GUI 中将图像设置为 Frame 的背景?

我无法弄清楚如何在我的窗口上设置背景图像。我不确定我的代码有什么问题。该图像称为 Background.jpg
有谁知道我的代码做错了什么以及如何修复它

//apples code  

import javax.swing.JFrame;
import java.applet.*;
import javax.swing.*;
import java.awt.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;

class  Apples{

public static void main(String[] args) {
  gui go = new gui();
  go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  go.setSize(200,290);
  go.setVisible(true);



 }
}



 //Gui Code

    import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class gui extends JFrame{
     private JButton A;
     private JButton B;
     private JButton C;
     private JButton D;
     private JButton E;
     private JButton F;
     private JButton G;
     private JButton H;
     private JButton I;
     private JButton J;
     private JButton K;
     private JButton L;
     private JButton M;
     private JButton N;
     private JButton O;
     private JButton P;
     private JButton Q;
     private JButton R;
     private JButton S;
     private JButton T;
     private JButton U;
     private JButton V;
     private JButton W;
     private JButton X;
     private JButton Y;
     private JButton Z;

     public gui(){
        super("APUSH ABCs");
        setLayout(new FlowLayout());

        A = new JButton("A");
        add(A);
        B = new JButton("B");
        add(B);
        C = new JButton("C");
        add(C);
        D = new JButton("D");
        add(D);
        E = new JButton("E");
        add(E);
        F = new JButton("F");
        add(F);
        G = new JButton("G");
        add(G);
        H = new JButton("H");
        add(H);
        I = new JButton("I");
        add(I);
        J = new JButton("J");
        add(J);
        K = new JButton("K");
        add(K);
        L = new JButton("L");
        add(L);
        M = new JButton("M");
        add(M);
        N = new JButton("N");
        add(N);
        O = new JButton("O");
        add(O);
        P = new JButton("P");
        add(P);
        Q = new JButton("Q");
        add(Q);
        R = new JButton("R");
        add(R);
        S = new JButton("S");
        add(S);
        T = new JButton("T");
        add(T);
        U = new JButton("U");
        add(U);
        V = new JButton("V");
        add(V);
        W = new JButton("W");
        add(W);
        X = new JButton("X");
        add(X);
        Y = new JButton("Y");
        add(Y);
        Z = new JButton("Z");
        add(Z);

        HandlerClass handler = new HandlerClass();
        A.addActionListener(handler);
        B.addActionListener(handler);
        C.addActionListener(handler);
        D.addActionListener(handler);
        E.addActionListener(handler);
        F.addActionListener(handler);
        G.addActionListener(handler);
        H.addActionListener(handler);
        I.addActionListener(handler);
        J.addActionListener(handler);
        K.addActionListener(handler);
        L.addActionListener(handler);
        M.addActionListener(handler);
        N.addActionListener(handler);
        O.addActionListener(handler);
        P.addActionListener(handler);
        Q.addActionListener(handler);
        R.addActionListener(handler);
        S.addActionListener(handler);
        T.addActionListener(handler);
        U.addActionListener(handler);
        V.addActionListener(handler);
        W.addActionListener(handler);
        X.addActionListener(handler);
        Y.addActionListener(handler);
        Z.addActionListener(handler);
    }
      private class HandlerClass implements ActionListener{
  public void actionPerformed(ActionEvent event){

     Object button = event.getSource();

     if(button == A){
String text = "asaasas ";
  JTextArea textArea = new JTextArea(text);

  textArea.setColumns(30);
  textArea.setLineWrap( true );
  textArea.setWrapStyleWord( true );
  textArea.setSize(textArea.getPreferredSize().width, 1);
Font font = new Font("Verdana", Font.BOLD, 12);
textArea.setFont(font);
textArea.setForeground(Color.BLUE);
  JOptionPane.showMessageDialog(
   null, textArea, "Appomattox Court House", JOptionPane.PLAIN_MESSAGE);

     }else if(button == B){
     String text = "Duriing the last days of the Civil War, Robert E. Lee had abandoned the Confederate capital of Richmond and city of Petersburg, hoping to escape with the remnants of his Army of Northern Virginia to meet up with additional Confederate forces in North Carolina and resume fighting. Union Forces cut him off and finally the Continental army had to surrender. The Appomattox Courthouse is the locaiton where General Robert E. Lee of the Confederate Army surrendered his approximately 28,000 troops to Ulysses S. Grant and the Union Army on April 9, 1865, ending the American Civil War. ";
  JTextArea textArea = new JTextArea(text);

  textArea.setColumns(30);
  textArea.setLineWrap( true );
  textArea.setWrapStyleWord( true );
  textArea.setSize(textArea.getPreferredSize().width, 1);
Font font = new Font("Verdana", Font.BOLD, 12);
textArea.setFont(font);
textArea.setForeground(Color.BLUE);
  JOptionPane.showMessageDialog(
   null, textArea, "Appomattox Court House", JOptionPane.PLAIN_MESSAGE);
     } else if(button == C){

String text = "Duriing the last days of the Civil War, Robert E. Lee had abandoned the Confederate capital of Richmond and city of Petersburg, hoping to escape with the remnants of his Army of Northern Virginia to meet up with additional Confederate forces in North Carolina and resume fighting. Union Forces cut him off and finally the Continental army had to surrender. The Appomattox Courthouse is the locaiton where General Robert E. Lee of the Confederate Army surrendered his approximately 28,000 troops to Ulysses S. Grant and the Union Army on April 9, 1865, ending the American Civil War. ";
  JTextArea textArea = new JTextArea(text);

  textArea.setColumns(30);
  textArea.setLineWrap( true );
  textArea.setWrapStyleWord( true );
  textArea.setSize(textArea.getPreferredSize().width, 1);
Font font = new Font("Verdana", Font.BOLD, 12);
textArea.setFont(font);
textArea.setForeground(Color.BLUE);
  JOptionPane.showMessageDialog(
   null, textArea, "Appomattox Court House", JOptionPane.PLAIN_MESSAGE);     
       }

      }
}
4

1 回答 1

1

这个...

public void paint(Graphics g)
{
    // Draws the img to the BackgroundPanel.
    g.drawImage(img, 0, 0, null);
}

从来都不是一个好主意。你没有尊重油漆链。油漆链是一组复杂的方法,可以完成很多重要的工作。

一个更好的主意是使用paintComponent

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    // Draws the img to the BackgroundPanel.
    g.drawImage(img, 0, 0, null);
}

您将遇到的另一个问题是您没有让组件有机会监视图像的状态。因为您正在使用Toolkit.getDefaultToolkit().createImage("Background.jpg")它,所以方法可能会使用后台线程来加载图像。您需要一些方法来告诉组件图像已完成加载并准备好绘画......

g.drawImage(img, 0, 0, this);

这将让组件监控图像的状态并根据需要更新自身。

Toolkit#createImage可能不是加载图像的最佳选择。如果无法加载图像,该方法不会抛出异常。

更好用ImageIO#read。如果类无法加载图像,这不仅会抛出异常,而且还保证返回完全限定的图像(也就是说,它会阻塞直到图像被实际加载)。

你还没有告诉我们 的位置Background.jpg。图片是否为嵌入式资源。如果图像只是一个文件(在应用程序的执行上下文中),那么您尝试加载文件就可以了,如果它是嵌入式资源(包含在应用程序 Jar 中),那么您需要使用Class#getResource...

img = ImageIO.read(getClass().getResource("/Background.jpg"));

您没有为BackgroundPanel. 一些布局管理器将无法按照您期望的方式布局此容器。

public Dimension getPreferredSize() {
    return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(this), img.getHeight(this));
}

此外,正如已经开始提到的,不要忘记将面板添加到您的 UI ;)

更新了示例

我还注意到您似乎在混合 Swing 和 AWT 组件,这绝不是一个好主意,如果可以避免,请这样做(Panel是 AWT/重量级组件)。

在此处输入图像描述

public class Apples {

    public static void main(String[] args) {
        new Apples();
    }

    public Apples() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BackgroundPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BackgroundPanel extends JPanel {

        Image img;

        public BackgroundPanel() {
            try {
                img = ImageIO.read(getClass().getResource("/Background.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            // Draws the img to the BackgroundPanel.
            if (img != null) {
                g.drawImage(img, 0, 0, null);
            }
        }

        public Dimension getPreferredSize() {
            return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(this), img.getHeight(this));
        }
    }
}
于 2012-12-19T03:37:53.070 回答