Swing JPopupMenu: Größe

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi, das folgende KSKB zeigt mein Problem, dass das PopupMenu irgendwie viel zu breit ist. Eig. müsste nach pack() seine Größe genau so klein sein, dass gerade so alle Komponenten rein passen (laut API-Doc zur pack()-Methode).

Aber es ist wesentlich breiter. Bei JMenus, die denke ich den gleichen Layout-Manager nutzen (bitte die sysouts beachten), ist das nicht der Fall..

Woran liegt's, weshalb ist das so breit? Danke

Java:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class JPopupDemo extends JFrame {

	public static void main(String[] args) {
		new JPopupDemo().setVisible(true);
	}

	public JPopupDemo() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JCheckBox box = new JCheckBox("je länger diese texte sind...");
		JMenuItem menuitem = new JMenuItem("...desto mehr Freiplatz erzeugt er");

		System.out.println("pref box width: " + box.getPreferredSize().width);
		System.out.println("pref menuitem width: "
				+ menuitem.getPreferredSize().width);

		final JPopupMenu popup = new JPopupMenu();
		popup.add(box);
		popup.add(menuitem);
		popup.pack();
		System.out.println("popup layout: " + popup.getLayout());

		JButton b = new JButton("show popup");
		b.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				popup.show(e.getComponent(), e.getX(), e.getY());
				System.out.println("popup width: " + popup.getWidth());
			}
		});

		add(b);
		pack();
	}
}
 
^^ Ein fieser "Fehler".
Du verwendest eine JCheckBox. Ersetze das mit einer JCheckBoxMenuItem und es sieht perfekt aus 😀
 
Oder folgendes machen (kann ja sein das es wirklich eine Checkbox sein soll):

Java:
box.setAlignmentX(0.0f);
menuitem.setAlignmentX(0.0f);

Der "Fehler" kommt vom BoxLayout (von dem ist das DefaultMenuLayout abgeleitet).
Alternativ kann man natürlich auch jeden anderen LayoutManager verwenden.
 
Ach, ich wusste gar nicht dass es die Klasse gibt. Also der Layout-Manager kann wohl nur "richtig" mit den entsprechenden MenuItem-Klassen umgehen..

Vielen Dank!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben