Rahmen zum editieren der Größe eines JComponents?

Status
Nicht offen für weitere Antworten.

Novanic

Bekanntes Mitglied
Hi Leute,

gibt es in Swing/Awt eigentlich einen Border oder etwas vergleichbares, mit dem man per Maus die Größe eines JComponents verändern kann?

Ich dachte an etwas ähnliches wie z.B. hier zu sehen ist (Rahmen mit viereckigen Punkten, zum Ändern der Größe):
ChangeSizeBorder

Danke im Voraus! :)

Gruß Nova
 

kaie

Bekanntes Mitglied
Einen einfachen Border kann man dafür leider nicht verwenden, der ist nur grafische Beigabe und kann keine Events abfangen (was zum Vergrößern/Verkleinern notwendig wäre). Die einfachste Lösung scheint mir eine Container-Klasse zu sein, die die Größenänderung verwaltet und den Rahmen zeichnet:
Code:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class ChangeSizePanel extends JPanel implements ComponentListener,
        MouseListener, MouseMotionListener
{
    
    // Attribute
    private JComponent child    = null;
    private int        dragMode = 0;
    private int        dragX    = 0;
    private int        dragY    = 0;

    // Konstruktor
    public ChangeSizePanel()
    {
        addComponentListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        child.paint(g);

        // Rahmen zeichnen
        g.setColor(new Color(100, 100, 100));
        g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

        // Kasten oben links
        g.setColor(dragMode == 1 ? Color.red : Color.black);
        g.fillRect(0, 0, 5, 5);

        // Kasten oben mitte
        g.setColor(dragMode == 2 ? Color.red : Color.black);
        g.fillRect(getSize().width / 2 - 3, 0, 5, 5);

        // Kasten oben rechts
        g.setColor(dragMode == 3 ? Color.red : Color.black);
        g.fillRect(getSize().width - 6, 0, 5, 5);

        // Kasten mitte links
        g.setColor(dragMode == 4 ? Color.red : Color.black);
        g.fillRect(0, getSize().height / 2 - 3, 5, 5);

        // Kasten mitte rechts
        g.setColor(dragMode == 5 ? Color.red : Color.black);
        g.fillRect(getSize().width - 6, getSize().height / 2 - 3, 5, 5);

        // Kasten unten links
        g.setColor(dragMode == 6 ? Color.red : Color.black);
        g.fillRect(0, getSize().height - 6, 5, 5);

        // Kasten unten mitte
        g.setColor(dragMode == 7 ? Color.red : Color.black);
        g.fillRect(getSize().width / 2 - 3, getSize().height - 6, 5, 5);

        // Kasten unten rechts
        g.setColor(dragMode == 8 ? Color.red : Color.black);
        g.fillRect(getSize().width - 6, getSize().height - 6, 5, 5);
    }

    // fügt zu einer Komponente einen Rahmen hinzu
    public void addChild(JComponent child)
    {
        this.child = child;
        Rectangle r = child.getBounds();
        Container c = child.getParent();
        c.remove(child);
        c.add(this);
        setBounds(r);
    }

    // läßt den Rahmen um die Komponente verschwinden
    public void releaseChild()
    {
        Rectangle r = getBounds();
        Container c = getParent();
        c.remove(this);
        c.add(child);
        child.setBounds(r);
    }

    // ComponentListener-Methoden
    public void componentResized(ComponentEvent arg0)
    {
        child.setBounds(0, 0, getSize().width, getSize().height);
        repaint();
    }

    public void componentMoved(ComponentEvent arg0)
    {
        child.setBounds(0, 0, getSize().width, getSize().height);
        repaint();
    }

    public void componentShown(ComponentEvent arg0)
    {
    }

    public void componentHidden(ComponentEvent arg0)
    {
    }

    // MouseListener- und MouseMotionListener-Methoden
    public void mouseMoved(MouseEvent me)
    {
        int x = me.getX();
        int y = me.getY();
        int old = dragMode;
        dragMode = 9;
        int toleranz = 8;
        if (x <= toleranz && y <= toleranz)
            dragMode = 1;
        if (x >= getSize().width / 2 - toleranz / 2
                && x <= getSize().width / 2 + toleranz / 2 && y <= toleranz)
            dragMode = 2;
        if (x >= getSize().width - toleranz && y <= toleranz)
            dragMode = 3;
        if (x <= toleranz && y >= getSize().height / 2 - toleranz / 2
                && y <= getSize().height / 2 + toleranz / 2)
            dragMode = 4;
        if (x >= getSize().width - toleranz
                && y >= getSize().height / 2 - toleranz / 2
                && y <= getSize().height / 2 + toleranz / 2)
            dragMode = 5;
        if (x <= toleranz && y >= getSize().height - toleranz)
            dragMode = 6;
        if (x >= getSize().width / 2 - toleranz / 2
                && x <= getSize().width / 2 + toleranz / 2
                && y >= getSize().height - toleranz)
            dragMode = 7;
        if (x >= getSize().width - toleranz && y >= getSize().height - toleranz)
            dragMode = 8;
        dragX = x;
        dragY = y;
        if (dragMode != old)
            repaint();
    }

    public void mouseReleased(MouseEvent me)
    {
        dragMode = 0;
        repaint();
    }

    public void mouseExited(MouseEvent me)
    {
        if (me.getModifiers() == 0)
        {
            dragMode = 0;
            repaint();
        }
    }

    public void mouseDragged(MouseEvent me)
    {
        int dx = me.getX() - dragX;
        int dy = me.getY() - dragY;
        dragX = me.getX();
        dragY = me.getY();
        int dleft = 0;
        int dtop = 0;
        int dwidth = 0;
        int dheight = 0;
        if (dragMode == 1)
        {
            dleft = dx;
            dtop = dy;
            dwidth = -dx;
            dheight = -dy;
        }
        if (dragMode == 2)
        {
            dtop = dy;
            dheight = -dy;
        }
        if (dragMode == 3)
        {
            dwidth = dx;
            dtop = dy;
            dheight = -dy;
        }
        if (dragMode == 4)
        {
            dleft = dx;
            dwidth = -dx;
        }
        if (dragMode == 5)
        {
            dwidth = dx;
        }
        if (dragMode == 6)
        {
            dleft = dx;
            dwidth = -dx;
            dheight = dy;
        }
        if (dragMode == 7)
        {
            dheight = dy;
        }
        if (dragMode == 8)
        {
            dwidth = dx;
            dheight = dy;
        }
        if (dragMode == 9)
        {
            dleft = dx;
            dtop = dy;
        }
        Rectangle r = getBounds();
        r.x += dleft;
        r.y += dtop;
        r.width += dwidth;
        r.height += dheight;
        setBounds(r);
        dragX -= dleft;
        dragY -= dtop;
    }

    public void mouseEntered(MouseEvent me)
    {
    }

    public void mouseClicked(MouseEvent me)
    {
        if (me.getClickCount() == 2)
            releaseChild();
    }

    public void mousePressed(MouseEvent me)
    {
    }

    
    // Hauptmethode
    public static void main(String[] args)
    {
        JFrame f = new JFrame("Komponenten können ihre Größe ändern!");
        f.getContentPane().setLayout(null);

        // JButton erzeugen
        JButton b = new JButton("Hallo!");
        b.setBounds(50, 50, 100, 100);
        f.getContentPane().add(b);

        // JTree erzeugen
        JTree t = new JTree();
        t.setBounds(300, 150, 150, 300);
        f.getContentPane().add(t);

        // zwei Rahmen erzeugen
        new ChangeSizePanel().addChild(b);
        new ChangeSizePanel().addChild(t);

        f.setSize(500, 700);
        f.setVisible(true);
    }

}
Diese Klasse kann mit der Methode addChild um jede beliebige JComponent gelegt werden. Über releaseChild verschwindet der Rahmen wieder. Zum Testen habe ich in diesem Beispiel ebenfalls ein Verschwinden bei einem Doppelklick eingebaut.

Bei dieser Lösung MUSS man beachten, dass das Hauptfenster bzw. der Container, in dem die Komponenten verschoben werden sollen, KEINEN LayoutManager besitzen (setLayout(null)) darf. Sonst würde dieser jede Größenänderung wieder zunichte machen!

Hilft Dir das weiter?

kaie
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
S JavaFX Tab-content-area Rahmen AWT, Swing, JavaFX & SWT 7
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
F JTextArea hat keinen Rahmen AWT, Swing, JavaFX & SWT 10
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
S Swing Automatisch 2px Rahmen in Windows 8 AWT, Swing, JavaFX & SWT 0
R Rahmen von/für DrawRoundRect AWT, Swing, JavaFX & SWT 3
D 2D-Grafik Rechteck befindet sich unter dem Rahmen des JFrame. AWT, Swing, JavaFX & SWT 1
J Rahmen um mehrere GUI Einzelteile AWT, Swing, JavaFX & SWT 2
H Button hat nur farbiger Rahmen AWT, Swing, JavaFX & SWT 3
E Netbeans: Buttons mit Label bzw. Rahmen unterlegen AWT, Swing, JavaFX & SWT 8
R Bewglichen Rahmen über einem Bild AWT, Swing, JavaFX & SWT 3
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P Swing Componente über Rahmen hinaus zeichnen AWT, Swing, JavaFX & SWT 2
B JButton Rahmen ausblenden AWT, Swing, JavaFX & SWT 3
T GUI ohne Rahmen auf Desktop AWT, Swing, JavaFX & SWT 3
M Swing Rahmen innerhalb des JButton entfernen AWT, Swing, JavaFX & SWT 2
F Individueller Frame-Rahmen AWT, Swing, JavaFX & SWT 27
H JFrame Rahmen entfernen AWT, Swing, JavaFX & SWT 1
0 Transparentes Panel ohne Rahmen AWT, Swing, JavaFX & SWT 5
K Swing JDialog ohne Titlebar mit Rahmen AWT, Swing, JavaFX & SWT 5
D Swing JButton will Rahmen nich verlieren AWT, Swing, JavaFX & SWT 14
J JDialog nicht aus JFrame Rahmen ziehen AWT, Swing, JavaFX & SWT 4
S Rahmen um Panel passt sich nicht ans Layout an AWT, Swing, JavaFX & SWT 3
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
N Fenster ohne Rahmen AWT, Swing, JavaFX & SWT 10
S GridBagLayout mit Rahmen AWT, Swing, JavaFX & SWT 2
J "Halbe" Rahmen und Trennlinien! AWT, Swing, JavaFX & SWT 4
F Rahmen mit gestrichelter Linie zeichnen AWT, Swing, JavaFX & SWT 4
D freier Text / Frame ohne Rahmen AWT, Swing, JavaFX & SWT 5
B Fenster ohne Rahmen AWT, Swing, JavaFX & SWT 2
N Abstand des Textes vom Rahmen bei JLabel AWT, Swing, JavaFX & SWT 2
K JButton - Rahmen AWT, Swing, JavaFX & SWT 2
V JCheckBoxMenuItem "Rahmen" entfernen AWT, Swing, JavaFX & SWT 25
P Frame - falsche Fenstergröße durch Rahmen? AWT, Swing, JavaFX & SWT 5
M Rahmen von Combobox AWT, Swing, JavaFX & SWT 2
M JWindow mit Rahmen(border) ausstatten AWT, Swing, JavaFX & SWT 4
X JTextField ohne Rahmen AWT, Swing, JavaFX & SWT 3
J Rahmen um Layout ziehen AWT, Swing, JavaFX & SWT 2
I Bild ohne "Rahmen" am JFrame AWT, Swing, JavaFX & SWT 2
G JTable Rahmen ausblenden AWT, Swing, JavaFX & SWT 2
D Seltsamer Rahmen bei JCheckBox AWT, Swing, JavaFX & SWT 7
D JSplittPane - unsichtbarer Rahmen? hilfe ;) AWT, Swing, JavaFX & SWT 2
F JFrame Rahmen Verstecken AWT, Swing, JavaFX & SWT 5
E etwas anderer rahmen. AWT, Swing, JavaFX & SWT 2
W Maus Rahmen zeichnen AWT, Swing, JavaFX & SWT 10
C JScrollPanel ohne Rahmen AWT, Swing, JavaFX & SWT 6
R MDI: Rahmen des JInternalFrames . AWT, Swing, JavaFX & SWT 5
A JLabel – Standard Rahmen soll unterdruckt werden AWT, Swing, JavaFX & SWT 2
F Frame ohne Rahmen AWT, Swing, JavaFX & SWT 12
S jTabbedPane - Tab-Rahmen ändern AWT, Swing, JavaFX & SWT 2
L rahmen um jTextArea AWT, Swing, JavaFX & SWT 8
D Rahmen zur Unterteilung ins Swing? AWT, Swing, JavaFX & SWT 6
J Rahmen vom Bild transparent machen AWT, Swing, JavaFX & SWT 4
G JTable: Rahmen bei Focus um Zelle AWT, Swing, JavaFX & SWT 2
S Rahmen mit "Namen" AWT, Swing, JavaFX & SWT 8
D JComboBox rahmen ändern AWT, Swing, JavaFX & SWT 2
F JFrame mit Rahmen versehen AWT, Swing, JavaFX & SWT 2
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
F DefaultTreeCellEditor - Fragen zur Groesse und zum Icon beim Editieren AWT, Swing, JavaFX & SWT 4
earlgrey_tea JTable Zelleninhalt beim Editieren löschen AWT, Swing, JavaFX & SWT 5
T [JavaFX 2.0] ListView editieren AWT, Swing, JavaFX & SWT 2
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
J Swing JList editieren - Laufzeitfehler? AWT, Swing, JavaFX & SWT 9
C Swing JTable Zelle mit Einfachklick editieren AWT, Swing, JavaFX & SWT 3
T JTable: editieren bei Doppelklick deaktivieren, aber... AWT, Swing, JavaFX & SWT 2
Go ein "JLabel" mit Doppelklick editieren. AWT, Swing, JavaFX & SWT 5
P Textfelder in einem Frame lassen sich nicht editieren AWT, Swing, JavaFX & SWT 3
A bei TableCells editieren unterdrücken AWT, Swing, JavaFX & SWT 5
O JTree Node sofort editieren AWT, Swing, JavaFX & SWT 2
K Editieren abbrechen AWT, Swing, JavaFX & SWT 11
M JTable: Editieren einer Zelle "von außen" abbreche AWT, Swing, JavaFX & SWT 2
T Wenn in JTable Editieren von Rows,Cols AWT, Swing, JavaFX & SWT 2
W Zellen Inhalt beim editieren markieren AWT, Swing, JavaFX & SWT 2
M JTable Zelle editieren AWT, Swing, JavaFX & SWT 2
C Zellen editieren AWT, Swing, JavaFX & SWT 4
P JTable (->Datenbank) editieren/updaten AWT, Swing, JavaFX & SWT 3
D JTable zum Einfügen/Löschen/Editieren von Daten AWT, Swing, JavaFX & SWT 5
thE_29 JList Item editieren AWT, Swing, JavaFX & SWT 7
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
L JTable editieren AWT, Swing, JavaFX & SWT 4
L JTable - Button Speichern während des Editieren AWT, Swing, JavaFX & SWT 3
S JSpinner: Editieren einschränken AWT, Swing, JavaFX & SWT 4
D JComboBox editieren AWT, Swing, JavaFX & SWT 2
J Zellen editieren ausschalten AWT, Swing, JavaFX & SWT 2
M JTree: Wie einen Knoten editieren? AWT, Swing, JavaFX & SWT 5
R TableCellEditor -> editieren stoppen AWT, Swing, JavaFX & SWT 4
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
Yonnig JavaFX Größe von WebView an Content anpassen AWT, Swing, JavaFX & SWT 3
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben