当前位置: 首页 > 知识库问答 >
问题:

在使用Nimbus外观和感觉时,如果有背景图像,JButton在JFrame中完全消失

楚勇
2023-03-14

我有一个JFrame。我使用了:

  1. JTabbed窗格。
  2. JButton。
  3. 在JPanel中添加的Jtag中的背景图像。
  4. 光轮的外观和感觉。

我的问题是,每当我使用Nimbus look and feel时,只有在添加了背景图像时,JButton才会消失。但这不会发生在其他外观上。有人能帮我把按钮弄清楚吗?

以下是我的代码:

import javax.swing.ImageIcon;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JFrame; 
import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;

import java.awt.*;
import java.awt.event.*;

class ImageTest 
{
JTabbedPane tp;
JLabel lab1;
JPanel  welcome;
JFrame frame;
ImageIcon image2;
JButton b1;
public void createUI()
{
    frame=new JFrame("JTabbedPane Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    b1=new JButton();
    welcome= new JPanel(null);
    welcome.setPreferredSize(new Dimension(1366,786));
    ImageIcon icon = new ImageIcon(ImageTest.class.getResource("icloud.jpg"));

    tp=new JTabbedPane();
            Container pane = frame.getContentPane();
    pane.add(tp);
    tp.addTab("Welcome", welcome);
            lab1=new JLabel();
    lab1.setIcon(icon);

    b1.setBounds(100,100,100,100);
    lab1.setBounds(0,0,1500,700);
            welcome.add(lab1);
            welcome.add(b1);
            b1.setVisible(true);
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setTitle("I-Cloud");

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

      try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception e) {

    }   
      ImageTest w = new ImageTest();
      w.createUI();   

     }
    }

编辑:

 import javax.swing.ImageIcon;
 import javax.swing.JTabbedPane;
 import javax.swing.JTextField;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
 import javax.swing.UIManager.LookAndFeelInfo;

 import java.awt.*;
 import java.awt.event.*;

 class ImageTest 
  {
 JTabbedPane tp;
 JLabel lab1;
 JPanel  welcome,w;
 JFrame frame;
 ImageIcon image2;
 JButton b1;

public void createUI()
{
    frame=new JFrame("JTabbedPane Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    b1=new JButton();
    welcome= new JPanel(new GridLayout(1,1,15,15));
    w=new JPanel (new GridLayout(1, 1, 15, 15));
    welcome.setPreferredSize(new Dimension(1366,786));

    ImageIcon icon = new ImageIcon(ImageTest.class.getResource("icloud.jpg"));

    tp=new JTabbedPane();
            Container pane = frame.getContentPane();
    pane.add(tp);


    lab1=new JLabel();
    lab1.setIcon(icon);
    w.setOpaque(false);
    w.add(b1);


    b1.setVisible(true);
            welcome.add(lab1);
            welcome.add(w);
            tp.addTab("Welcome", welcome);

    frame.setSize(500,500);
    frame.pack();
    frame.setVisible(true);
    frame.setTitle("I-Cloud");

}   
public static void main(String[] args) 
{
    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception e) {

    }

        ImageTest w = new ImageTest();
        w.createUI();   

    }
  }

谢谢。

共有2个答案

秦时铭
2023-03-14

我认为在JLabel中设置一个背景图片,然后在添加容器后再添加按钮是一个非常复杂的问题。相信我尝试过,这是一个非常复杂的任务。你可以像气垫船建议的那样直接画图,但是记住用那种方法你不会得到很好的图像质量。:-|

史同化
2023-03-14

通过使用空布局,然后在另一个组件上添加一个组件,基本上用另一个(带有图像的JLabel)覆盖了一个组件(JButton),您对Swing GUI的使用失去了平衡。

    < li >不要像现在这样使用空布局。虽然对于一个新手来说,使用空布局和setBounds似乎是创建复杂GUI的最佳方式,但是你处理Swing GUI创建的越多,你就越会发现这样做会把你的GUI放在一个笔直的夹克里,把它画在一个非常狭窄的角落里,使它很难扩展或增强。别这么做。 < li >不要在同一容器中将一个组件添加到另一个组件之上。 < li >相反,应该给带有图像的JLabel一个布局管理器。 < li >然后将JButton添加到JLabel中。 < li >然后将JLabel添加到JTabbedPane。

编辑
您的最新编辑没有像上面建议的那样使用JLabel作为容器。因此,如果您使用单独的容器,则按钮和标签将并排显示。要解决这个问题,您需要为JLabel提供一个布局管理器,然后按照上面的建议将按钮添加到其中,或者直接在JPanel的(...)方法中绘制,并将按钮添加到JPanel。

后者的一个例子:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

public class MyImageTest extends JPanel {
   // public static final String SPEC = "https://duke.kenai.com/SunRIP/.Midsize/SunRIP.jpg.png";
   public static final String SPEC = "http://upload.wikimedia.org/wikipedia/commons/3/37/"
         + "Mandel_zoom_14_satellite_julia_island.jpg";
   private static final int PREF_H = 786;
   private static final int GAP = 100;
   private BufferedImage img;

   public MyImageTest() {
      try {
         URL imgUrl = new URL(SPEC);
         img = ImageIO.read(imgUrl);
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
      setLayout(new FlowLayout(FlowLayout.LEADING));
      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      JButton b = new JButton();
      b.setPreferredSize(new Dimension(GAP, GAP));
      add(b);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (img != null) {
         g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      if (img == null) {
         return super.getPreferredSize();
      } else {
         int width = (img.getWidth() * PREF_H) / img.getHeight();
         return new Dimension(width, PREF_H);
         // return new Dimension(img.getWidth(), img.getHeight());
      }
   }

   private static void createAndShowGui() {
      try {
         for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
               UIManager.setLookAndFeel(info.getClassName());
               break;
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      MyImageTest mainPanel = new MyImageTest();

      JFrame frame = new JFrame("MyImageTest");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
 类似资料:
  • 在Java Swing应用程序中,我正在尝试nimbus外观。它在JdesktopPane控件中看起来非常棒,但我希望我的所有桌面都有不同的颜色,但主题很好。 有没有办法改变灵气观感的背景颜色? 下面是应用nimbus外观的示例代码。

  • 问题内容: 我想为应用程序中的所有JPanel使用不同的背景色。使用Nimbus外观时该如何做? 我遵循“ 更改颜色主题”来更改Nimbus外观中的组件的颜色。 它有时只是 随机地 起作用。如果在更改颜色之前设置,则仅通知 一次 。 这是一些测试代码: 问题答案:

  • 问题内容: 我学习Java已有几周了,在将背景图像应用于JFrame时,我真的很困惑。我遇到的每个教程都不像我那样创建Frames(我扩展了JFrame),或者如果这样做,说明还不够清楚,我无法理解。 下面的代码来自我自己的项目,因此可以帮助我练习到目前为止所学的内容。请您能否以下面的代码为基础,并向我说明要添加的内容和位置,所以我可能以图像作为框架的背景? 我真正要感谢的一件事是,如果您能解释事

  • 问题内容: 可以说我创建了一个带有jbutton的2d瓦片地图,然后在地图顶部创建了单位,当单位(也是jbutton)位于瓦片顶部时,有一种方法可以显示地图背景,因为现在单元的背景只是被涂成红色,是否可以通过jbuttons而不是jbuttons来做到这一点? 问题答案: 可能,是的,建议这样做,嗯,可能不是。 我相信您将需要将标题按钮的布局更改为可以控制的内容(这将取决于您的视觉要求)。 我个人

  • 问题内容: 我正在尝试使用在photoshop中制作的图像作为GUI的背景。我怎么做?我也做了一些我想在执行操作后显示在按钮背景中的图像… 问题答案: 对于JButton,请使用以下命令: 小组更加有趣。不过,这是一个好方法: