怎样在JFrame中设置背景图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在JFrame中设置背景图片相关的知识,希望对你有一定的参考价值。

而且背景图片能随窗口大小的改变而自动改变
小弟初学java,希望高手能指点哈,最好给个能看懂的例子!!

import javax.swing.*;

import java.awt.*;

/**

 * @author Hardneedl

 */

final class PictureBackgroundFrame extends JFrame 

    public String getTitle() return "frame title";

    static private final Dimension size = new Dimension(600, 400);

    public Dimension getPreferredSize() return size;

    public Dimension getMaximumSize() return size;

    public Dimension getMinimumSize() return size;

    public Dimension getSize() return size;

    private static final Image image = Toolkit.getDefaultToolkit().getImage("b.JPG");

    private static final JComponent canvas = new JComponent()

        protected void paintComponent(Graphics g) 

            super.paintComponent(g);

            Graphics gg = g.create();

            gg.drawImage(image,0,0,getWidth(),getHeight(),this);

            gg.dispose();

        

    ;

    PictureBackgroundFrame() throws HeadlessException 

        attachListeners();

        doLay();

    

    private void attachListeners() 

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    

    private void doLay() 

        Container container = getContentPane();

        container.add(canvas);

        pack();

        setVisible(true);

    

    public static void main(String[] args) new PictureBackgroundFrame();

参考技术A import java.awt.*;import javax.swing.*;import java.awt.Container;public class framebg public framebg() public static void main (String[] args) JFrame frame=new JFrame("背景图设置");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ImageIcon img = new ImageIcon("bg\\1.gif");//这是背景图片JLabel imgLabel = new JLabel(img);//将背景图放在标签里。frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置Container cp=frame.getContentPane();cp.setLayout(new BorderLayout());JButton but=new JButton("anniu");//创建按钮cp.add(but,"North");//将按钮添加入窗口的内容面板
((JPanel)cp).setOpaque(false); //注意这里,将内容面板设为透明。这样LayeredPane面板中的背景才能显示出来。frame.setSize(500,300);frame.setVisible(true);import java.awt.*;import javax.swing.*;import java.awt.Container;
public class framebg
public framebg() public static void main (String[] args) JFrame frame=new JFrame("背景图设置");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ImageIcon img = new ImageIcon("bg\\1.gif");//这是背景图片JLabel imgLabel = new JLabel(img);//将背景图放在标签里。
frame.getLayeredPane().add(imgLabel, new Integer(Integer.MIN_VALUE));//注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置Container cp=frame.getContentPane();cp.setLayout(new BorderLayout());JButton but=new JButton("anniu");//创建按钮cp.add(but,"North");//将按钮添加入窗口的内容面板
((JPanel)cp).setOpaque(false); //注意这里,将内容面板设为透明。这样LayeredPane面板中的背景才能显示出来。
frame.setSize(500,300);frame.setVisible(true);
3
通过为jframe设置背景图片,让我明白了以下的知识要点:(1)jframe窗口的组成部分,最底层是jrootpane面板。(这一点恐怕很多初学者都没有注意吧!)(2)jframe的组成如下:jrootpane中包含glasspane和layeredpane两个面板。而layeredpane面板包含contentpane和jmenubar。(没想到吧contentpane是放在contentpane中的?)(3)在jframe上添加组件,往往是添加在contentpane中。。但是在contentpane的下面还有两层面板,那就是layeredpane和jrootpane。(4)任何一本关于java的书中都会介绍contentpane,却很少提到layeredpane和jrootpane,因此使得很多的初学者产生:jframe中只要一个contentpane的错误认识。
通过解决背景设置的问题,让我对jframe中容器的“层”结构,有个更深层的了解。
参考技术B

把需要设置为JFrame中的背景图片(以zhidao.gif为例)放到与源文件相同的路径下,然后代码如下:

import java.awt.*;
import javax.swing.*;
class MyPanel extends JPanel

    ImageIcon img;
    JButton btnTest1,btnTest2;
    MyPanel()
    
        img=new ImageIcon("zhidao.gif");
        btnTest1=new JButton("btnTest1");
        btnTest2=new JButton("btnTest2");
        this.setLayout(new FlowLayout());
        add(btnTest1);
        add(btnTest2);
    
    public void paint(Graphics g)
    
        g.drawImage(img.getImage(),0,0,this.getWidth(),this.getHeight(),this);
    

class mainApp

    public static void main(String[] args)
    
        JFrame fm=new JFrame("BackGround Image Test");
        MyPanel panel=new MyPanel();
        fm.getContentPane().add(panel);
        fm.show();
    

Java 在 JFrame 中设置/获取所有组件的文本

【中文标题】Java 在 JFrame 中设置/获取所有组件的文本【英文标题】:Java set/get all component's text in a JFrame 【发布时间】:2017-04-08 02:53:24 【问题描述】:

我正在尝试访问 JFrame 中所有组件的文本,但使用我发现的方法我做不到。

    for(Component c : this.getComponents()) 
        c.setText(TRNASLATE(c.getText()));
        // does not work: no set and getText methods
    

有没有办法获取或设置组件的文本?

在你问之前:我正在尝试翻译 JFrame 上的元素,而不是手动列出其组件并设置它们的文本(逐个列出它们需要很长时间)

对不起我的英语。

【问题讨论】:

我觉得你可以用instanceof 【参考方案1】:

这应该适用于 Java Swing 的任何对象

public static void setSwingObjectText(Object object, String text) 
    if (object instanceof javax.swing.AbstractButton)
        ((javax.swing.AbstractButton)object).setText(text);
    else if (object instanceof javax.swing.JEditorPane)
        ((javax.swing.JEditorPane)object).setText(text);
    else if (object instanceof javax.swing.JLabel)
        ((javax.swing.JLabel)object).setText(text);
    else if (object instanceof javax.swing.text.JTextComponent)
        ((javax.swing.text.JTextComponent)object).setText(text);
    else if (object instanceof java.awt.Frame)
        ((java.awt.Frame)object).setTitle(text);
    else if (object instanceof java.awt.Dialog)
        ((java.awt.Dialog)object).setTitle(text);
    else if (object instanceof javax.swing.JInternalFrame)
        ((javax.swing.JInternalFrame)object).setTitle(text);
    else if (object instanceof javax.swing.border.TitledBorder)
        ((javax.swing.border.TitledBorder)object).setTitle(text);

public static String getSwingObjectText(Object object) 
    if (object instanceof javax.swing.AbstractButton)
        return ((javax.swing.AbstractButton)object).getText();
    else if (object instanceof javax.swing.JEditorPane)
        return ((javax.swing.JEditorPane)object).getText();
    else if (object instanceof javax.swing.JLabel)
        return ((javax.swing.JLabel)object).getText();
    else if (object instanceof javax.swing.text.JTextComponent)
        return ((javax.swing.text.JTextComponent)object).getText();
    else if (object instanceof java.awt.Frame)
        return ((java.awt.Frame)object).getTitle();
    else if (object instanceof java.awt.Dialog)
        return ((java.awt.Dialog)object).getTitle();
    else if (object instanceof javax.swing.JInternalFrame)
        return ((javax.swing.JInternalFrame)object).getTitle();
    else if (object instanceof javax.swing.border.TitledBorder)
        return ((javax.swing.border.TitledBorder)object).getTitle();
    else
        return null; //no match

【讨论】:

【参考方案2】:

您可以使用instanceof 来检查组件是否为某种类型,并将该类型转换为它。大多数组件都有一个 getText() 方法。

例子:

for(Component c : this.getComponents()) 
       if(c instanceof JLabel)
           JLabel label = (JLabel) c;
           String text = label.getText();
       

根据需要使用尽可能多的组件类型重复 instanceof

【讨论】:

以上是关于怎样在JFrame中设置背景图片的主要内容,如果未能解决你的问题,请参考以下文章

如何在jframe中的jpanel中设置单选按钮?

怎样在hbuilder中设置图片路径

qt中怎样在stylesheet中设置按钮的背景色

android怎样在代码中设置颜色

如何在卡片背景中设置多种不同的颜色

如何在OpenGL中设置背景颜色