Java 重叠两个jbutton:问题
听起来有点奇怪,但我试图在这里重叠两个jButton1和jButton2。我使用NetBeans GUI builder来实现这一点。没什么特别的,我使用JLayeredPane使之成为可能Java 重叠两个jbutton:问题,java,swing,jbutton,overlap,jlayeredpane,Java,Swing,Jbutton,Overlap,Jlayeredpane,听起来有点奇怪,但我试图在这里重叠两个jButton1和jButton2。我使用NetBeans GUI builder来实现这一点。没什么特别的,我使用JLayeredPane使之成为可能 jLayeredPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER); 它确实是重叠的,但是当鼠标点击时,JButton会自动向上显示。 屏幕截图将清楚地显示: 将突出显示的部分作为鼠标指针 及 当鼠标指针单击下一个JButton时,它会
jLayeredPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER);
它确实是重叠的,但是当鼠标点击时,JButton会自动向上显示。
屏幕截图将清楚地显示:
将突出显示的部分作为鼠标指针
及
当鼠标指针单击下一个JButton时,它会出现,隐藏第一个JButton。
但是,我不希望第二个JButton在鼠标单击时弹出。
我该怎么做?嗯,我想这可能会很关键
以下是代码(如果需要):
public class NewJFrame1 extends javax.swing.JFrame {
public NewJFrame1() {
initComponents();
}
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLayeredPane1 = new javax.swing.JLayeredPane();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jLayeredPane2 = new javax.swing.JLayeredPane();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(51, 51, 51));
jButton1.setText("jButton1");
jButton1.setBounds(0, 40, 73, 23);
jLayeredPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER);
jButton2.setText("jButton2");
jButton2.setBounds(40, 40, 73, 23);
jLayeredPane1.add(jButton2, javax.swing.JLayeredPane.DEFAULT_LAYER);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(98, 98, 98)
.addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(139, 139, 139)
.addComponent(jLayeredPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(161, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(58, 58, 58)
.addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLayeredPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(31, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame1().setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLayeredPane jLayeredPane1;
private javax.swing.JLayeredPane jLayeredPane2;
private javax.swing.JPanel jPanel1;
}
更新:
如果我不清楚,我又来了
1我不想做单独的按钮,它们应该重叠
2重叠区域可能不同,按钮的尺寸也不同
3单击时,第二个按钮不应位于第一个按钮之上。解决方法是,但不包括如何布局按钮
4可能会出现混淆,单击了哪个按钮,但对我来说没有问题。重叠按钮会导致混淆单击了哪个按钮。我建议调整按钮的大小,使隐藏部分不再是按钮的一部分。这样,公共区域中的单击只会转到顶部按钮。重叠按钮会造成对单击哪个按钮的混淆。我建议调整按钮的大小,使隐藏部分不再是按钮的一部分。这样,公共区域中的单击只会转到顶部按钮 布局管理器与此有什么关系 @Patricia Shanahan指出了按钮重叠的问题。一种解决办法是让工人自己做这项工作。在下面的示例中,默认情况下butonPanel具有居中的FlowLayout。它采用任何外观和感觉中的首选按钮尺寸 附录:啊,你希望按钮重叠但保持稳定的z顺序。由于渲染由按钮的UI委托(ButtonUI的子类)控制,因此效果取决于外观。例如,com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel和com.apple.laf.aqualookandfeel都可以随心所欲,而其他许多则不能。如果不创建自己的代理(如图所示),您可能会尝试采用所示的方法,即隐藏按钮并使用覆盖图像。根据封闭容器的布局,FlowLayout或GridLayout1、0都可以工作 顺便说一句,不要让GUI设计师支配您的GUI设计
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see https://stackoverflow.com/a/14075990/230513 */
public class LayoutTest {
private void display() {
JFrame f = new JFrame("LayoutTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 150); // content placeholder
}
}, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(); // default: FlowLayout, centered
buttonPanel.add(new JButton("Button1"));
buttonPanel.add(new JButton("Button2"));
f.add(buttonPanel, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new LayoutTest().display();
}
});
}
}
布局管理器与此有什么关系
@Patricia Shanahan指出了按钮重叠的问题。一种解决办法是让工人自己做这项工作。在下面的示例中,默认情况下butonPanel具有居中的FlowLayout。它采用任何外观和感觉中的首选按钮尺寸
附录:啊,你希望按钮重叠但保持稳定的z顺序。由于渲染由按钮的UI委托(ButtonUI的子类)控制,因此效果取决于外观。例如,com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel和com.apple.laf.aqualookandfeel都可以随心所欲,而其他许多则不能。如果不创建自己的代理(如图所示),您可能会尝试采用所示的方法,即隐藏按钮并使用覆盖图像。根据封闭容器的布局,FlowLayout或GridLayout1、0都可以工作
顺便说一句,不要让GUI设计师支配您的GUI设计
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see https://stackoverflow.com/a/14075990/230513 */
public class LayoutTest {
private void display() {
JFrame f = new JFrame("LayoutTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 150); // content placeholder
}
}, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(); // default: FlowLayout, centered
buttonPanel.add(new JButton("Button1"));
buttonPanel.add(new JButton("Button2"));
f.add(buttonPanel, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new LayoutTest().display();
}
});
}
}
也可以考虑替换。在公共区域中的点击只会转到顶部按钮。我希望两个按钮都能按原样运行,如果我调整按钮的大小,它仍然会在顶部。我不想要。@ JoyRohan:公平的问题;我已经详细阐述了。“TrasHooT,你不会像上次一样误解我的问题吗?”JoyRohan:很可能,但是我认为帕特丽夏的观察是有用的警告。也考虑另一种选择。公共区域中的点击只会转到顶部按钮。我希望两个按钮都能按原样运行,如果我调整按钮的大小,它仍然会。来吧,我不想做的事。@joeyrohan:问得好;我已经详细阐述了。“TrasHooT,你不会像上次一样误解我的问题吗?”乔伊罗翰:很可能,但我认为帕特丽夏的观察是有用的警告。也可以考虑在相关方法中看到的布局布局。JoyRohan:我已经阐述过了。渲染是由按钮的UI代表控制的,这是ButtonUI的一个子类,效果是外观和感觉依赖1。好吧,这意味着没有捷径,我必须自己定制它?我也考虑过覆盖布局,在相关的方法中看到。@ JoyRohan:我已经阐述过了。渲染是由按钮的UI委托控制的,它是ButoNUI的一个子类,效果是外观和感觉依赖+1。这意味着没有捷径,我必须自己定制它?对吗?