Ich möchte meine Oberfläche zu Laufzeit anpassen. Dazu wird beim Klick mit der rechten Maustaste ein Kontextmenü geöffnet, in dem man eine Komponente auswählen kann, die dann in die Oberfläche eingefügt wird. Das funktioniert bis auf zwei Probleme ganz gut:
I: Warum funktionieren die beiden auskommentierten Zeilen (58/59) nicht? Es soll jedem Panel wieder der gleiche MouseListener hinzugefügt werden.
II: Warum ist das erzeugte SplitPane, sowie die enthaltenen Buttons winzig klein? Sie sollten das aktuelle Fenster genau teilen.
[highlight="java"]
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
public class CustomWindowNG extends JFrame implements MouseListener {
public CustomWindowNG() {
JPanel panel = new JPanel();
panel.addMouseListener(this);
getContentPane().add(panel);
setTitle("CustomWindowNG");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setMinimumSize(new Dimension(200,200));
pack();
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
if (!e.isPopupTrigger()) return;
final JPanel src = (JPanel) e.getSource();
JPopupMenu menu = new JPopupMenu();
final String[] items = {"SplitPane top/bottom", "SplitPane left/right", "Player", "Library"};
for (String s : items) {
menu.add(new AbstractAction(s) {
@Override
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
// SplitPane Horizontal
if (action.equals(items[0])) {
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
//panel1.addMouseListener(this);
//panel2.addMouseListener(this);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
src.add(splitPane);
src.validate();
}
}
});
}
menu.show(src, e.getX(), e.getY());
}
public static void main(String[] args) {
new CustomWindowNG();
}
}
[/highlight]
I: Warum funktionieren die beiden auskommentierten Zeilen (58/59) nicht? Es soll jedem Panel wieder der gleiche MouseListener hinzugefügt werden.
II: Warum ist das erzeugte SplitPane, sowie die enthaltenen Buttons winzig klein? Sie sollten das aktuelle Fenster genau teilen.
[highlight="java"]
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
public class CustomWindowNG extends JFrame implements MouseListener {
public CustomWindowNG() {
JPanel panel = new JPanel();
panel.addMouseListener(this);
getContentPane().add(panel);
setTitle("CustomWindowNG");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setMinimumSize(new Dimension(200,200));
pack();
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
if (!e.isPopupTrigger()) return;
final JPanel src = (JPanel) e.getSource();
JPopupMenu menu = new JPopupMenu();
final String[] items = {"SplitPane top/bottom", "SplitPane left/right", "Player", "Library"};
for (String s : items) {
menu.add(new AbstractAction(s) {
@Override
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
// SplitPane Horizontal
if (action.equals(items[0])) {
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
//panel1.addMouseListener(this);
//panel2.addMouseListener(this);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, panel1, panel2);
src.add(splitPane);
src.validate();
}
}
});
}
menu.show(src, e.getX(), e.getY());
}
public static void main(String[] args) {
new CustomWindowNG();
}
}
[/highlight]