听起来很奇怪,但我试图重叠两个JButtons
(这里是jButton1
和jButton2
)。我正在使用NetBeans GUI构建器。没什么特别的,我正在使用JLayeredPane使其成为可能。
jLayeredPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER);
它确实重叠,但JButton
显示其自我,当被鼠标点击时。
截图将清楚说明:
(将突出显示的部分作为鼠标指针)
和
当鼠标指针在下一个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)单击时,第二个JButton不应高于第一个JButton。(解决方案,但不是如何布局按钮。)
4)可能存在混淆,点击了哪个按钮,但对我来说没问题。
答案 0 :(得分:3)
布局管理员与它有什么关系?
@Patricia Shanahan指出了重叠按钮的问题。一个解决方案是让layout完成工作。在下面的示例中,butonPanel
默认为居中FlowLayout
。它采用任何Look& amp;中按钮的首选尺寸。感觉。
附录:啊,你希望按钮重叠但保留稳定的 z - 顺序。因为渲染是由按钮的UI委托(ButtonUI
的子类)控制的,所以效果是Look&感觉依赖。例如,com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
和com.apple.laf.AquaLookAndFeel
都可以按照您的意愿行事,而其他许多则不行。如果没有创建自己的代理,显示here,您可能会尝试调整显示here的方法,该方法会隐藏按钮并使用重叠的图像。根据封闭容器的布局,FlowLayout
或GridLayout(1, 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();
}
});
}
}
答案 1 :(得分:1)
重叠按钮会产生关于单击哪个按钮的混淆。我建议调整你想要在下面的按钮,以便“隐藏”部分不再是按钮的一部分。这样,公共区域中的点击将仅转到顶部按钮。