1

ボタンをクリックすると、すでに表示されているJFrameにパネルが追加されます。これで、ユーザーがフレームのサイズを変更しても、パネルはその位置で一定のままになります。私が欲しいのは、パネルの位置もフレームのサイズ変更に合わせて調整する必要があるということです。それを行う方法はありますか?

問題を再生成するためのコード:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ProblemPanelLocation {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame("ProblemPanelLocation");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(250, 250);
                final JPanel panel = new JPanel();
                panel.setSize(100, 100);
                panel.setBorder(BorderFactory.createBevelBorder(1));
                final JButton button = new JButton("Add panel");
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        panel.setLocation(button.getX() - button.getWidth() - 10, button.getY());
                        frame.getLayeredPane().add(panel, JLayeredPane.MODAL_LAYER);
                    }
                });
                GroupLayout layout = new GroupLayout(frame.getContentPane());
                frame.getContentPane().setLayout(layout);
                layout.setHorizontalGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(317, Short.MAX_VALUE)
                        .addComponent(button)
                        .addContainerGap())
                );
                layout.setVerticalGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(button)
                        .addContainerGap(266, Short.MAX_VALUE))
                );
                frame.setVisible(true);
            }
        });
    }
}

シナリオ:

  1. 最初は、ボタンが入ったフレームが表示されます。
  2. それをクリックすると、パネルがフレームのレイヤードペインのフレームに追加されます。
  3. パネルの位置は、ボタンの位置に基づいて計算されます。
  4. フレームのサイズを変更すると、ボタンもフレームの右側に移動しますが、パネルは移動しません。

場所のボタンのように機能するようにパネルを追加したいと思います。出来ますか?はいの場合、どうすればそれを行うことができますか?

4

1 に答える 1

1
  1. ComponentListenerを使用します。

    frame.addComponentListener( new ComponentAdapter() {
        @Override
        public void componentResized( ComponentEvent e ) {
            panel.setLocation(button.getX() - button.getWidth() - 10, button.getY());
        }
    } );
    
  2. フレームのsetBounds()メソッドをオーバーライドし、そこでの場所を更新します。このコードは実際のサイズ変更と同じEventDispatcher-Eventで実行されるため、これはお勧めしませんが、コンポーネントリスナーを使用するときに再描画が遅くなるのを防ぐのに役立つ場合があります。

于 2012-07-20T12:07:11.253 に答える