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

时间:2014-02-25 14:46:09

标签: java swing jbutton nimbus

我有一个JFrame。在那我用过:

  1. JTabbed窗格。
  2. 的JButton。
  3. 在JPAnel中添加的Jlabel中的背景图像。
  4. Nimbus的外观和感觉。
  5. 我的问题是每当我使用Nimbus时,只要添加了背景图像,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 个答案:

答案 0 :(得分:4)

通过使用空布局,然后在另一个组件之上添加一个组件,基本上将其中一个组件(JButton)与另一个组件(带有图像的JLabel)覆盖在一起,您对Swing GUI的使用是不可能的。

  • 不要像你一样使用null布局。虽然使用null布局和setBounds的新手似乎是创建复杂GUI的最佳方式,但是你处理Swing GUI创建的越多,你会发现这样做会让你的GUI成为一个直夹克,将它绘制成一个非常好的狭窄的角落,使其很难扩展或增强。只是不要这样做。
  • 请勿在同一容器中添加一个组件。
  • 而是给你的JLabel图像一个布局管理器。
  • 然后将JButton添加到JLabel。
  • 然后将JLabel添加到JTabbedPane。

修改
您的最新编辑未使用JLabel作为上面建议的容器。因此,如果您使用单独的容器,则按钮和标签将并排显示。要解决此问题,您需要为JLabel提供布局管理器,然后按照上面的建议将按钮添加到 it ,或直接在JPanel的{{1}中绘制}方法,并将按钮添加到JPanel。

关于后者的一个例子:

paintComponent(...)

enter image description here

答案 1 :(得分:1)

我认为在JLabel中设置背景图像,然后在添加容器后添加按钮是一个非常复杂的问题。相信我尝试过,这是一项非常复杂的任务。你可以通过直接绘制来做这件事,就像Hovercraft建议的那样,但是请记住,用这种方法得到的图像质量不会那么好。 : - |