PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Hinzufügen von JLabels und Positionierung


Baalzamon
2010-05-16, 15:29:47
Hi,

ich stehe gerade irgendwie auf dem Schlauch, vielleicht liegt es auch nur daran, daß ich in letzter Zeit mehr C++ als Java programmiert habe.

Was ich erreichen möchte: Ich habe ein MainPanel und einen Create-Button. Drücke ich den Button wird ein neues JLabel im MainPanel angezeigt. Dieses JLabel kann ich nun per MouseDragging positionieren. Drücke ich jetzt erneut den Create-Button soll ein weiteres JLabel erscheinen, die Position des alten JLabels soll aber beibehalten werden.

Im Moment ist es so, dass ich das neue JLabel dem MainPanel per add(Component) mitgebe und danach ein MainPanel.revalidate() aufrufe. Dadurch wird aber das gesamte MainPanel neu ausgerichtet und die bereits vorhandenen JLabel verlieren ihre Position und werden entsprechend des Layout Managers neu ausgerichtet.

Ein MainPanel.repaint() anstatt des MainPanel.revalidate() bringt mir nicht das gewünschte Ergebniss. Das JLabel wird dann nicht sichtbar.

Ein setzen von MainPanel.setLayout(null) hat auch nicht den gewünschten Effekt. Die JLabels werden bei jedem revalidate() trotzdem wieder ausgerichtet gezeichnet.

Irgendwie kann ich mir nicht vorstellen, daß ich mir meinen eigenen LayoutManager schreiben muss um das hinzubekommen.

Gast
2010-05-16, 18:35:20
http://java.sun.com/docs/books/tutorial/uiswing/layout/none.html
http://telegraph.cs.berkeley.edu/tinydb/javadoc/net/tinyos/tinydb/awtextra/AbsoluteLayout.html

Gast
2010-05-16, 21:59:34
Netbeans hat einen sehr guten GUI Editor.

Baalzamon
2010-05-17, 11:30:26
NetBeans kenne ich, hilft mir hier aber nicht weiter.

Also läuft es darauf hinaus, das ich mir einen eigenen LayoutManager schreibe. Na gut, dann soll es halt so sein. :(

Pinoccio
2010-05-17, 11:50:03
Gibt es ein wenig Quelltext zum nachvollziehen?

mfg

Baalzamon
2010-05-17, 12:29:57
Gibt es ein wenig Quelltext zum nachvollziehen?

mfg
Na klar. :)
Das es gestern nicht mit dem setLayout(null) funktioniert hat, war aber mein Fehler. Wenn ich jetzt das Layout nulle bekomme ich nichts mehr angezeigt, aber wahrscheinlich muss ich nur die insets für die JLabels richtig setzen? Zumindest soll man sowas laut Tutorial machen. Das werde ich mal noch probieren.


public class MainPanel extends JPanel implements MouseListener, MouseMotionListener
{
private static final long serialVersionUID = 1L;

public MainPanel()
{
setBorder(BorderFactory.createLineBorder(Color.black));

// setLayout(null);

addMouseListener(this);
addMouseMotionListener(this);
}
// ....
}



public class CreateComponentAction extends AbstractAction
{
// ....
public void actionPerformed(ActionEvent event)
{
// ....
if (uniqueName != null && uniqueName.length() > 0)
{
MyComponent component = Root.getSingleton().getComponentManager().createComponent(uniqueName, configName);

Root.getSingleton().getMainWindow().getMainPanel().add(component.getIcon()); // adds a MyComponentIcon to the MainPanel JComponent
Root.getSingleton().getMainWindow().getMainPanel().validate(); // repaint() doesnt work here, but validate() reorganizes Jcomponents in MainPanel
}
}
}



public class MyComponentIcon extends JLabel implements MouseInputListener, MouseMotionListener, KeyListener
{
private static final long serialVersionUID = 1L;

public MyComponentIcon(MyComponent component)
{
// save reference to parent component
this.component = component;

// Build filesystem icon name from resource location and universal attribute icon
String iconName = Root.getSingleton().getResourceManager().getDefaultIconLocation()+component.getU niversalAttributes().getIcon();

// set Icon, Text and Tooltip from XML Universal Attributes
setIcon(new ImageIcon(iconName));
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
setPreferredSize(new Dimension(96, 96));
setText(component.getUniqueName());
setHorizontalTextPosition(CENTER);
setVerticalTextPosition(BOTTOM);
setToolTipText(component.getUniversalAttributes().getName());

// Register this Label as a MouseListener
addMouseListener(this);
addMouseMotionListener(this);

setVisible(true);
}

@Override
public void mouseDragged(MouseEvent e)
{
Point position = this.getLocation();
position.x += e.getX();
position.y += e.getY();
position.x -= getWidth() / 2;
position.y -= getHeight() / 2;
e.getComponent().setLocation(position);
Root.getSingleton().getMainWindow().getMainPanel().repaint();
}
// ....
}


Hmmm... ich denke das sollte alles sein, was für das Problem wichtig ist. Über die CreateComponentAction wird eine neue Komponente erzeugt und dessen Icon (ein extended JLabel) per add() an das MainPanel angehängt.

Der MouseListener und das repaint() beim ziehen des JLabels funktioniert auch tadellos, nur sobald ich eine neue Komponente erstelle, wird das gesamte Layout zurückgesetzt. Ist ja auch klar, ich ruf ja auch validate() auf. ;)

Eigentlich sollte das doch mit setLayout(null) funktionieren, oder nicht?

Baalzamon
2010-05-17, 12:36:22
Na klar. :)
Eigentlich sollte das doch mit setLayout(null) funktionieren, oder nicht?
Ah ja. Tut es auch. ;)

OK, Problem gelöst, da war ich gestern nur zu belämmert.

Pinoccio
2010-05-17, 13:13:49
Ah ja.Gern geschehen. ><

mfg

Baalzamon
2010-05-17, 13:42:57
Gern geschehen. ><

mfg
(y) Manchmal ist man einfach zu blind.

Hatte ich doch in der Initalisierung des MainPanel nicht meine eigene Klasse sondern ein JPanel stehen... da kann ich natürlich lange im MainPanel-Konstruktor das Layout setzen. :rolleyes: ;)