があり、JPopupMenu
それに応じて動的に内側のサイズを変更したいinner components' size
。私の SSCCE では、この問題について説明しました。
SSCCE:
public class PopupTest2 {
public static void main(String[] a) {
final JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createLineBorder(Color.RED));
final JPopupMenu menu = new JPopupMenu();
// critical step
JPanel itemPanel = new JPanel();
itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.Y_AXIS));
final JMenuItem[] items = new JMenuItem[10];
for (int i = 0; i < 10; i++) {
JMenuItem item = new JMenuItem("Item #"+String.valueOf(i));
itemPanel.add(item);
items[i] = item;
}
menu.add(itemPanel);
JToggleButton button = new JToggleButton("Press me");
button.addActionListener(new ActionListener() {
boolean pressed = false;
@Override
public void actionPerformed(ActionEvent e) {
pressed = !pressed;
if (pressed) {
for (JMenuItem item : items) {
item.setText(item.getText()+" changed");
}
} else {
for (JMenuItem item : items) {
item.setText(item.getText().substring(0, item.getText().length() - 8));
}
}
}
});
panel.add(button, BorderLayout.NORTH);
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
menu.show(panel, (int) (e.getX() - menu.getPreferredSize().getWidth()), e.getY());
}
}
});
frame.setContentPane(panel);
frame.setUndecorated(true);
frame.setBackground(new Color(50, 50, 50, 200));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setVisible(true);
}
});
}
}
ステップ 2 再現:
- 右クリックしてポップアップ メニューを表示します。
- ボタンをクリックし
Press me
ます (ウィンドウの上部にあります)。 - 右クリックしてポップアップ メニューを再度表示する (バグ #1 - ポップアップがまだ小さい)
- 右クリックしてポップアップ メニューを再度表示します (ポップアップ メニューのサイズは問題ありません)。
Press me
ボタンをもう一度クリックします。- 右クリックしてポップアップ メニューを表示します。(バグ #2 - ポップアップがまだ大きい)
JPopupMenu
表示する前にサイズを強制的に変更するにはどうすればよいですか? にアイテムを直接追加すると機能するのはなぜpopupMenu
ですか?