2

少し奇妙に聞こえますが、2 つJButtons(ここjButton1jButton2) をオーバーラップさせようとしています。これには NetBeans GUI ビルダーを使用しています。特別なことは何もありません。JLayeredPane を使用してそれを可能にしています。

 jLayeredPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER);

重なっていJButtonますが、マウスでクリックすると上に表示されます。スクリーンショットはそれを明確にします:

ここに画像の説明を入力

(ハイライト部分をマウスポインタとする)

マウス ポインターが次のボタンをクリックするとJButton、最初の JButton が非表示になって表示されます。 ここに画像の説明を入力

しかし、マウスでクリックしたときに2番目がポップアップ(1番目と重なる)したくありません。どうすればこれを行うことができますか??まあ、これは重大になる可能性があると思います。JButtonJButton

必要に応じて、コードは次のとおりです。

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) 2 番目の JButton は、クリックされたときに 1 番目の JButton の上に来てはなりません (これに対する解決策ですが、ボタンのレイアウト方法についてではありません)。

4) どのボタンがクリックされたのか混乱するかもしれませんが、私にとっては問題ありません。

4

2 に答える 2

3

レイアウトマネージャーはそれと何の関係がありますか?

@Patricia Shanahan は、ボタンのオーバーラップに関する問題を指摘しました。解決策の 1 つは、レイアウトに任せることです。以下の例でbutonPanelは、デフォルトで が中央FlowLayoutに配置されています。任意のルック アンド フィールでボタンの推奨サイズを採用します。

補遺: ああ、ボタンをオーバーラップさせたいが、安定したzオーダーを保持したい。レンダリングは のサブクラスであるボタンの UI デリゲートによって制御されるためButtonUI、効果はルック アンド フィールに依存します。たとえば、 と の両方が思いどおりcom.sun.java.swing.plaf.nimbus.NimbusLookAndFeelcom.apple.laf.AquaLookAndFeel動作しますが、他の多くはそうではありません。ここに示すように独自のデリゲートを作成しない場合は、ここに示すように、ボタンを非表示にし、オーバーレイされた画像を使用するアプローチを適用してみてください。囲んでいるコンテナーのレイアウトに応じて、 または のいずれかが機能するはずです。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();
            }
        });
    }
}
于 2012-12-28T21:25:06.093 に答える
1

ボタンを重ねると、どのボタンがクリックされたかについて混乱が生じます。「隠れた」部分がボタンの一部ではなくなるように、下に配置するボタンのサイズを変更することをお勧めします。そうすれば、共通領域のクリックはトップ ボタンにのみ移動します。

于 2012-12-28T16:35:20.260 に答える