【问题标题】:Overlapping two JButtons : Issue重叠两个 JButton:问题
【发布时间】:2012-12-13 21:38:49
【问题描述】:

听起来有点奇怪,但我试图重叠两个JButtons(这里是jButton1jButton2)。我正在为此使用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)可能会出现混淆,点击了哪个按钮,但对我来说没问题。

【问题讨论】:

    标签: java swing jbutton overlap jlayeredpane


    【解决方案1】:

    布局管理器与它有什么关系?

    @Patricia Shanahan 指出了重叠按钮的问题。一种解决方案是让layout 完成这项工作。在下面的示例中,butonPanel 默认具有居中的FlowLayout。它采用任何外观和感觉中按钮的首选大小。

    附录:啊,您希望按钮重叠但保持稳定的z-顺序。因为渲染由按钮的 UI 委托(ButtonUI 的子类)控制,所以效果取决于外观。例如,com.sun.java.swing.plaf.nimbus.NimbusLookAndFeelcom.apple.laf.AquaLookAndFeel 都可以随心所欲,而其他许多则不然。如果没有创建您自己的委托,如here 所示,您可能会尝试调整here 所示的方法,该方法隐藏按钮并使用叠加图像。根据封闭容器的布局,FlowLayoutGridLayout(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();
                }
            });
        }
    }
    

    【讨论】:

    • 还可以考虑OverlayLayout,在other 相关方法中看到here
    • @joeyrohan:我已经在上面详细说明了。
    • rendering is controlled by the button's UI delegate, a subclass of ButtonUI, the effect is Look & Feel dependent +1。嗯,也就是说没有捷径,我必须自己定制?对吗?
    【解决方案2】:

    重叠的按钮会让人混淆点击的是哪个按钮。我建议调整您想要位于下方的按钮的大小,以便“隐藏”部分不再是按钮的一部分。这样,公共区域中的点击将只转到顶部按钮。

    【讨论】:

    • 另外考虑一个备用layout manager
    • clicks in the common area will go only to the top button 我希望两个按钮都能按原样运行,如果我调整按钮大小,它仍然会出现在顶部。我不想这样做。
    • @joeyrohan:公平的问题;我已经详细说明了here
    • @trashgod 你是不是像上次一样误解了我的问题?
    • @joeyrohan:很有可能,但我认为 Patricia 的观察是一个有用的警告。
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多