JPanel zeichnet sich nicht neu

javaprogger1987

Erfahrenes Mitglied
Hi!
Ich hab folgendes Problem mit meiner GUI. Hier erstmal der Aufbau:

- JApplet (StackLayout)
- JDesktopPane (StackLayout.TOP, Null Layout)
- JInternalFrame​
- JPanel (StackLayout.TOP, BoderLayout)
- JPanel (BorderLayout.SOUTH, FlowLayout)​
- JButton (FlowLayout.LEFT)​

In der Reihenfolge auch, JApplet ist das Root-Element, da drin sind dann ein JDesktopPane und ein JPanel mit dem StackLayout übereinander.
Mein Problem ist, dass, wenn ich die JInternalFrames über den JPanel ziehe der JPanel nicht neu gezeichnet wird (JIF sollten unter dem JPanel liegen) (s. Bild).

Ich vermute das es daran liegt wie ich die JInternalFrames verschiebe, ich habe die Titelleiste entfernt und einen eigenen Listener geschrieben:
Java:
    private int xDrag, yDrag = -1;
    
    public void mouseDragged(MouseEvent e) {
        Point onFrame = e.getPoint();
        Point diff = new Point( onFrame.x - xDrag, onFrame.y - yDrag );
        Point onDesktop = getLocation();
        setLocation( onDesktop.x + diff.x, onDesktop.y + diff.y );        
    }

    public void mouseReleased(MouseEvent e) {
        xDrag = -1;
        yDrag = -1;
    }

    public void mousePressed(MouseEvent e) {
        xDrag = e.getPoint().x;
        yDrag = e.getPoint().y;
    }

So werden die Komponenten hinzugefügt:
Java:
        JDesktopPane desk = new JDesktopPane();
        bar = new JRDTaskBar();
        JButton b = new JButton("#");
        b.setOpaque(false);        
        bar.add( b );
        
        desk.add( createFrame( 0 ) );
        desk.add( createFrame( 1 ) );
        desk.add( createFrame( 2 ) );

        JPanel barPanel = new JPanel();
        barPanel.setLayout( new BorderLayout() );
        barPanel.add( bar, BorderLayout.SOUTH );
        barPanel.setOpaque(false);
        
        this.setLayout(new StackLayout());        
        this.add( desk, StackLayout.TOP );
        this.add( barPanel, StackLayout.TOP );

Wie benachrichtige ich jetzt dort den JPanel, das dieser sich neu zeichnet?
Danke schonmal
Gruß
Tobias
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    15,6 KB · Aufrufe: 41
Hallo Tobias,

Eine schlechte Teillösung wäre, wenn du in der Methode mouseDragged() die DesktopPane anschließend die Taskbar repaint()'en würdest. Allerdings gibt es dann ein Flimmern wenn du die Buttons verschiebst. Worauf ich jetzt so spontan keine Antwort weiss.


Meine Empfehlung wäre einen ganz anderen Weg einschlagen. Anstatt JInternalFrames und Buttons könntest du Buttons direkt in die LayeredPane plazieren. Damit müssten so fast alle Probleme gelöst sein.

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class LayeredApplet extends JApplet {

	private JLayeredPane lp = getLayeredPane();

	private JDragButton dl1 = new JDragButton();

	private JDragButton dl2 = new JDragButton();

	private JDragButton dl3 = new JDragButton();

	public LayeredApplet() {
		this.getContentPane().setBackground(Color.BLUE);

		lp.add(dl1, 10);
		lp.add(dl2, 15);
		lp.add(dl3, 20);

		JPanel statusZeile = new JPanel();
		statusZeile.add(new JLabel("Statuszeile: ........................"));
		this.add(statusZeile, BorderLayout.SOUTH);
	}

	public void init() {
		LayeredApplet sl = new LayeredApplet();
		sl.setVisible(true);
	}

	static class JDragButton extends JButton {
		private Point p1 = new Point(), p2 = new Point();

		public JDragButton() {
			super();

			BufferedImage iconNormal = new BufferedImage(40, 40,
					BufferedImage.TYPE_INT_ARGB);
			paintNormal(iconNormal.createGraphics());

			BufferedImage iconHover = new BufferedImage(40, 40,
					BufferedImage.TYPE_INT_ARGB);
			paintNormal(iconHover.createGraphics());
			paintHover(iconHover.createGraphics());

			this.setBorderPainted(false);
			this.setContentAreaFilled(false);
			this.setFocusPainted(false);
			this.setIcon(new ImageIcon(iconNormal));
			this.setRolloverIcon(new ImageIcon(iconHover));

			int x = (int) (Math.random() * 250);
			int y = (int) (Math.random() * 350);

			this.setBounds(x, y, 50, 50);

			this.addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					p1.setLocation(e.getPoint());
				}
			});
			this.addMouseMotionListener(new MouseMotionAdapter() {
				public void mouseDragged(MouseEvent e) {
					try {
						p2 = e.getComponent().getParent().getMousePosition();
						if (p2.y - p1.y < JDragButton.this.getParent()
								.getHeight() - 80)
							JDragButton.this.setLocation(p2.x - p1.x, p2.y
									- p1.y);
					} catch (Exception ex) {
						System.out.println(ex.getLocalizedMessage());
					}
				}
			});
		}

		private static void paintNormal(Graphics2D g) {
			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);

			g.setColor(Color.BLACK);
			g.fillOval(0, 0, 40, 40);

			g.setColor(Color.WHITE);
			Polygon p = new Polygon(new int[] { 15, 15, 28 }, new int[] { 6,
					32, 19 }, 3);
			g.fillPolygon(p);

			Color alpha1 = new Color(255, 255, 255, 100);
			Color alpha2 = new Color(255, 255, 255, 0);
			GradientPaint gp = new GradientPaint(34, 3, alpha1, 0, 40, alpha2);
			g.setPaint(gp);
			g.fillOval(3, 2, 35, 35);
		}

		private static void paintHover(Graphics2D g) {
			g.setColor(Color.WHITE);
			g.drawOval(0, 0, 39, 39);
		}
	}
}


Vg Erdal
 
Ok danke - mein eigentliches Ziel war zwar, dass der Button auch unter der Leiste liegen kann und man ihn durch eine semi-transparente Leiste sehen kann, aber von dem Gedanken habe ich mich schon verabschiedet^^ Werde das jetzt so mit einer Begrenzung machen.

Gruß
Tobias
 
Zurück