Java 悬而未决的重叠问题
我在Java Swing中遇到了这个问题: 品红色和绿色组件都是JButton。我用的是绝对布局。将鼠标悬停到绿色时,即使未应用布局管理器或未使用JLayeredPane,它也会与洋红色重叠 这种行为有什么原因吗?我如何确保在悬停到绿色时洋红保持在顶部 编辑2:Java 悬而未决的重叠问题,java,swing,layout-manager,null-layout-manager,Java,Swing,Layout Manager,Null Layout Manager,我在Java Swing中遇到了这个问题: 品红色和绿色组件都是JButton。我用的是绝对布局。将鼠标悬停到绿色时,即使未应用布局管理器或未使用JLayeredPane,它也会与洋红色重叠 这种行为有什么原因吗?我如何确保在悬停到绿色时洋红保持在顶部 编辑2: 为了明确我的目标,我的想法是制作一个类似于Android通知栏的UI,带有辅助触摸功能。假设通知栏是一个层,辅助触摸是最顶层。在JLayeredPane中使用透明层的问题是,如果一个层/面板即使设置为透明,也占据了整个框架,那么它下面
为了明确我的目标,我的想法是制作一个类似于Android通知栏的UI,带有辅助触摸功能。假设通知栏是一个层,辅助触摸是最顶层。在JLayeredPane中使用透明层的问题是,如果一个层/面板即使设置为透明,也占据了整个框架,那么它下面的层不会被绘制。答案很简单:不要使用绝对布局,使用真正的
布局管理器。在这种情况下,BorderLayout
似乎可以很好地完成这项工作
请参见此示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class TestLayout {
protected void initUI() {
JFrame frame = new JFrame("test");
Container cp = frame.getContentPane();
cp.setLayout(new BorderLayout());
cp.add(createColoredButton(Color.BLACK, Color.MAGENTA, "Hello World 1"), BorderLayout.NORTH);
cp.add(createColoredButton(Color.BLACK, Color.GREEN, "Hello World 2"), BorderLayout.EAST);
cp.add(createColoredButton(Color.WHITE, Color.BLUE, "Hello World 3"), BorderLayout.CENTER);
// frame.pack();
frame.setSize(600, 600);
frame.setVisible(true);
}
private JButton createColoredButton(Color fgColor, Color bgColor, final String text) {
final JButton button = new JButton(text);
button.setBorderPainted(false);
button.setFocusPainted(false);
button.setForeground(fgColor);
button.setBackground(bgColor);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(button, "You just clicked: " + text);
}
});
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestLayout().initUI();
}
});
}
}
答案很简单:不要使用绝对布局,使用真正的LayoutManager
。在这种情况下,BorderLayout
似乎可以很好地完成这项工作
请参见此示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class TestLayout {
protected void initUI() {
JFrame frame = new JFrame("test");
Container cp = frame.getContentPane();
cp.setLayout(new BorderLayout());
cp.add(createColoredButton(Color.BLACK, Color.MAGENTA, "Hello World 1"), BorderLayout.NORTH);
cp.add(createColoredButton(Color.BLACK, Color.GREEN, "Hello World 2"), BorderLayout.EAST);
cp.add(createColoredButton(Color.WHITE, Color.BLUE, "Hello World 3"), BorderLayout.CENTER);
// frame.pack();
frame.setSize(600, 600);
frame.setVisible(true);
}
private JButton createColoredButton(Color fgColor, Color bgColor, final String text) {
final JButton button = new JButton(text);
button.setBorderPainted(false);
button.setFocusPainted(false);
button.setForeground(fgColor);
button.setBackground(bgColor);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(button, "You just clicked: " + text);
}
});
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestLayout().initUI();
}
});
}
}
有一个方法setComponentZOrder
,但我不确定它在这种情况下是否有用。正确地定位按钮以使其不重叠不是更好吗?为了明确我的目标,我的目标是创建3个相互重叠的JPanel,而不使用JLayeredPane。我注意到,当鼠标悬停在某个按钮上时,它会放弃初始的Z顺序。我会检查你建议的解决方案。无论如何,谢谢。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起使用。有一种方法setComponentZOrder
,但我不确定它在这种情况下是否有用。正确地定位按钮以使其不重叠不是更好吗?为了明确我的目标,我的目标是创建3个相互重叠的JPanel,而不使用JLayeredPane。我注意到,当鼠标悬停在某个按钮上时,它会放弃初始的Z顺序。我会检查你建议的解决方案。无论如何,谢谢。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。