Hallöchen, ich habe folgendes Problem, das mich schon den ganzen Tag zum Verzweifeln bringt:
Ich möchte nichts anderes als 3 JLabels unterschiedlicher Größen ineinander verschachteln. D.h., Label 3 (Farbe: rot, 10x10 Pixel) befindet sich im Label 2, Label 2 (Farbe: gelb, 30x30 Pixel) ist im Label 1 (Farbe: grün, 90x90 Pixel). Jedes JLabel soll zunächst im Zentrum der jeweiligen Elternkomponente liegen.
Es soll das Null-Layout verwendet werden. Das kleine rote Label muss ich mit der Maus bewegen können, weshalb es auf Mouse-Events horchen muss.
Folgender Code funktioniert nicht:
Das erste Problem ist, dass das Platzieren der Komponenten mit Null-Layout garnicht so einfach ist. Wie im Quelltext zu sehen ist, sollen die Labels jeweils zentral ineinander liegen. Jedoch ist keines der drei Labels nach dem Programmstart zu sehen. Nur wenn ich folgendes eingebe:
l1.setBounds(0,0,90,90);
l2.setBounds(0,0,30,30);
l3.setBounds(0,0,10,10);
werden die Labels dort platziert wo sie hin müssen, nämlich oben links im Fenster. Wenn ich dann aber versuche, das kleine rote Label zu verschieben, wird es mit größeren Koordinaten komischerweise kleiner. Ich schätze, das hat auch mit dem Aufruf von setBounds() zu tun.
Hat hier vielleicht jemand eine Ahnung, was ich falsch mache? Habe ich das Null-Layout falsch verstanden oder warum funktioniert bei mir das Setzen der Position mit setBounds() nicht?
Danke schon mal im Voraus!
Ich möchte nichts anderes als 3 JLabels unterschiedlicher Größen ineinander verschachteln. D.h., Label 3 (Farbe: rot, 10x10 Pixel) befindet sich im Label 2, Label 2 (Farbe: gelb, 30x30 Pixel) ist im Label 1 (Farbe: grün, 90x90 Pixel). Jedes JLabel soll zunächst im Zentrum der jeweiligen Elternkomponente liegen.
Es soll das Null-Layout verwendet werden. Das kleine rote Label muss ich mit der Maus bewegen können, weshalb es auf Mouse-Events horchen muss.
Folgender Code funktioniert nicht:
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.AWTEvent;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Fenster extends JFrame
{
public Fenster()
{
setSize(270,270);
getContentPane().setLayout(null);
MyLabel l1 = new MyLabel(Color.GREEN, false);
MyLabel l2 = new MyLabel(Color.YELLOW, false);
MyLabel l3 = new MyLabel(Color.RED, true);
l1.setLayout(null);
l2.setLayout(null);
l3.setLayout(null);
l1.setBounds(90,90,90,90);
l2.setBounds(30,30,30,30);
l3.setBounds(10,10,10,10);
getContentPane().add(l1);
l1.add(l2);
l2.add(l3);
setVisible(true);
}
public static void main (String argv[])
{
new Fenster();
}
private class MyLabel extends JLabel
{
Color color;
int prevX, prevY, deltaX, deltaY;
public MyLabel(Color clr, boolean enable)
{
color = clr;
if(enable)
{
enableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK );
}
}
public void paintComponent(Graphics g)
{
g.setColor(color);
g.fillRect(getBounds().x,getBounds().y,getBounds().width,getBounds().height);
super.paintComponent(g);
}
protected void processMouseEvent(MouseEvent e)
{
super.processMouseEvent(e);
switch(e.getID())
{
case MouseEvent.MOUSE_PRESSED:
prevX = e.getX();
prevY = e.getY();
break;
default: break;
}
}
protected void processMouseMotionEvent(MouseEvent e)
{
super.processMouseMotionEvent(e);
switch(e.getID())
{
case MouseEvent.MOUSE_DRAGGED:
deltaX = e.getX() - prevX;
deltaY = e.getY() - prevY;
setBounds(getBounds().x + deltaX,
getBounds().y + deltaY,
getBounds().width,
getBounds().height);
break;
default: break;
}
}
}
}
Das erste Problem ist, dass das Platzieren der Komponenten mit Null-Layout garnicht so einfach ist. Wie im Quelltext zu sehen ist, sollen die Labels jeweils zentral ineinander liegen. Jedoch ist keines der drei Labels nach dem Programmstart zu sehen. Nur wenn ich folgendes eingebe:
l1.setBounds(0,0,90,90);
l2.setBounds(0,0,30,30);
l3.setBounds(0,0,10,10);
werden die Labels dort platziert wo sie hin müssen, nämlich oben links im Fenster. Wenn ich dann aber versuche, das kleine rote Label zu verschieben, wird es mit größeren Koordinaten komischerweise kleiner. Ich schätze, das hat auch mit dem Aufruf von setBounds() zu tun.
Hat hier vielleicht jemand eine Ahnung, was ich falsch mache? Habe ich das Null-Layout falsch verstanden oder warum funktioniert bei mir das Setzen der Position mit setBounds() nicht?
Danke schon mal im Voraus!