摆动组件

时间:2014-01-29 08:30:24

标签: java swing

我正在尝试设置我提到的GUI: 将一个transperent JPanel出现在Canvas上方。 (使用JLayeredPane) 我在网上看了很多关于这个主题的内容,并意识到网格化重量级组件的问题(Canvas) 和轻量级组件(JPanel),我试图在很多方面解决这个问题,但没有一个工作。 (使用Java jdk1.6.0_45)

有没有办法让我的GUI符合要求?

示例代码:

public class main {

    public static void main(String[] args) {
            myWindow frame = new myWindow();
            frame.setSize(950, 600);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static class myWindow extends JFrame {

        private Canvas redCanvas;
        private JPanel upperPanel;
        private JLayeredPane layeredPane;

        public myWindow() {
            init();
            getContentPane().setBackground(Color.black);
            getContentPane().add(layeredPane);
            layeredPane.add(redCanvas,2);
            layeredPane.add(upperPanel, 0);
        }

        private void init() {
            layeredPane = new JLayeredPane();
            layeredPane.setLayout(null);

            upperPanel = new JPanel();
            JButton jButton = new JButton("Check");
            jButton.setSize(50, 50);
            jButton.setBounds(50, 50, 50, 50);
            upperPanel.add(jButton);
            upperPanel.setLocation(70, 5);
            upperPanel.setOpaque(false);
            upperPanel.setSize(400, 200);
            upperPanel.setBackground(new Color(0,0,0,15));

            redCanvas = new Canvas();
            redCanvas.setBackground(Color.RED);
            redCanvas.setSize(500, 500);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

“我试图按照提到的设置我的GUI:在Canvas上面出现一个transperent JPanel。”

  1. 您的猜测是正确的,不使用Canvas我将Canvas切换为JPanel

    JPanel redPanel = new JPanel();
    
  2. 您需要使用Integer而不是原始int初始化图层。参见文档

      

    将组件添加到分层窗格时,可以使用Integer指定图层。使用setLayer更改组件的图层时,使用int。您可能认为如果使用int而不是使用add方法的Integer,编译器会抱怨或您的程序会抛出非法参数异常。但是编译器没有说什么,这导致了一个常见的分层窗格问题。

    layeredPane.add(redCanvas, new Integer(0));
    layeredPane.add(upperPanel, new Integer(1));
    
  3. 附注

    • 我知道你需要在JLayeredPane中设置组件的边界和大小这可能只是练习,但你知道,你不应该设置所有组件的大小。而是使用LayoutManagers,因此您的GUI更流畅而且不僵硬。查看更多内容Laying out Components Withing a Containter,详细了解如何使用布局。
    • 您应该调用pack(),而不是将尺寸设置为框架,我们会尊重所有首选尺寸。
    • Event Dispatch Thread(EDT)运行您的Swing程序,如下所示。另请参阅Initial Threads

      public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable(){
              @Override
              public void run() {
                  myWindow frame = new myWindow();
                  ....
              }
          });
      }
      

    唉,这是您的程序 以上两个修复程序,但没有侧边注释。你可以用我给你的链接找出它们。

    import java.awt.Color;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    
    public class main {
    
        public static void main(String[] args) {
            myWindow frame = new myWindow();
            frame.setSize(950, 600);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        static class myWindow extends JFrame {
    
            private JPanel redCanvas;
            private JPanel upperPanel;
            private JLayeredPane layeredPane;
    
            public myWindow() {
                init();
                getContentPane().setBackground(Color.black);
                layeredPane.add(redCanvas, new Integer(0));
                layeredPane.add(upperPanel, new Integer(1));
                getContentPane().add(layeredPane);
    
            }
    
            private void init() {
                layeredPane = new JLayeredPane();
                layeredPane.setLayout(null);
    
                upperPanel = new JPanel();
                JButton jButton = new JButton("Check");
                jButton.setSize(50, 50);
                jButton.setBounds(50, 50, 50, 50);
                upperPanel.add(jButton);
                upperPanel.setLocation(70, 5);
                upperPanel.setOpaque(false);
                upperPanel.setSize(400, 200);
                upperPanel.setBackground(new Color(0, 0, 0, 15));
    
                redCanvas = new JPanel();
                redCanvas.setBackground(Color.RED);
                redCanvas.setOpaque(true);
    
                redCanvas.setSize(500, 500);
            }
        }
    }
    

    enter image description here