我正在尝试设置我提到的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);
}
}
}
答案 0 :(得分:1)
“我试图按照提到的设置我的GUI:在Canvas上面出现一个transperent JPanel。”
您的猜测是正确的,不使用Canvas
我将Canvas
切换为JPanel
JPanel redPanel = new JPanel();
您需要使用Integer
而不是原始int
初始化图层。参见文档
将组件添加到分层窗格时,可以使用Integer指定图层。使用setLayer更改组件的图层时,使用int。您可能认为如果使用int而不是使用add方法的Integer,编译器会抱怨或您的程序会抛出非法参数异常。但是编译器没有说什么,这导致了一个常见的分层窗格问题。
layeredPane.add(redCanvas, new Integer(0));
layeredPane.add(upperPanel, new Integer(1));
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);
}
}
}