Avatar billede sy22 Nybegynder
01. december 2002 - 15:10 Der er 9 kommentarer og
1 løsning

Flytte JLabel på JPanel/JFrame

Hej

Jeg har et JLabel, jeg har placeret på et JPanel, der er placeret i en JFrame.
Jeg vil gerne have mulighed for med musen at rykke mit JLabel rundt og evt. også at skalere det.

Gøres dette nemmest vha. et bestemt layout og i så fald hvilket, eller skal der lægges en mouselistener el. lign på JLabel???

takker for svar
Avatar billede viht Nybegynder
01. december 2002 - 16:45 #1
Her er et eksempel hvor jeg placerer et ImageIcon på en JLabel og så definerer componentResized metoden for det JLabel objekt. I den metode printer jeg så bare den ændrede størrelse for JLabel.

Du skal blot lave en test.gif med noget tekst eller lignende på og lægge i samme dir.
Det med at flytte rundt på det kunne du jo løse ved at placere dit JLabel på en JInternalFrame evt? Jeg har ikke umiddelbart andre ideer.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TestLabel extends JFrame {   
  public TestLabel() {       
      JPanel panel = new JPanel();       
      setContentPane( panel );   
      panel.setPreferredSize( new Dimension( 200, 200 ) );   
      panel.setLayout(new BorderLayout() );       
      final JLabel myLabel = new JLabel( new ImageIcon("test.gif"), JLabel.CENTER );       
      panel.add( myLabel );       
      myLabel.addComponentListener( new ComponentAdapter() {   
          public void componentResized(ComponentEvent e) {   
            System.out.println( myLabel.getSize() );           
          }       
      });
  }   
     
  public static void main(String[] args)    {   
      TestLabel frame = new TestLabel();       
      frame.setDefaultCloseOperation( EXIT_ON_CLOSE );       
      frame.pack();       
      frame.setVisible(true);   
  }
}
Avatar billede viht Nybegynder
01. december 2002 - 16:53 #2
Ang. JInternalFrame, se da det eksempel jeg har lavet her:
http://www.eksperten.dk/spm/289751
Avatar billede carstenknudsen Nybegynder
02. december 2002 - 14:35 #3
Er du udelukkende interesseret i at kunne rykke
komponenter rundt, eller skal du også kunne lave
figurer/tegninger der kan rykkes rundt?
Avatar billede sy22 Nybegynder
02. december 2002 - 18:02 #4
Jeg er gået videre med viht's idé om JInternalFrame lagt på et JPanel. Herpå lægger jeg så mine JLabels, og kan på den måde flytte dem rundt, men har endnu ikke fået knækket den med skalering af JInternalFrames.

Herudover vil jeg gerne kunne dreje dem...men ved ikke om det er muligt.
Avatar billede viht Nybegynder
02. december 2002 - 18:16 #5
Jeg vil anbefale du lægger dine JInternalFrames på en JDesktopPane i stedet. Det er det de anbefaler i API'et.

Mht. skalering og rotering, så ved jeg hvordan du roterer et Image vha. AffineTransform:

    public BufferedImage rotate(BufferedImage img,int grader)
    {
        AffineTransform tx = new AffineTransform();
        tx.rotate(Math.toRadians (grader), img.getWidth()/2, img.getHeight()/2);
        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
        img = op.filter(img, null);
        return img;
    }

Jeg ved man også kan skalere Images vha. AffineTransform, jeg har bare aldrig prøvet det.
Avatar billede viht Nybegynder
02. december 2002 - 18:17 #6
Men her er vi ovre i Graphics2D, og det var jo ikke helt udgangspunktet.
Avatar billede ng-km Nybegynder
02. december 2002 - 19:45 #7
Er der for sent at blande sig ? Jeg prøver.

Jeg har engang lavet en klasse til at flytte rund med billeder, jeg har her modificeret den lidt, som jeg tror passe dit behov. Programmet er ikke helt stabilt i skaleringen, men du må selv tilpasse parametre så de passe dine behov.

Du skalerer ved at dobbeltklikke på label og holde museknappen nede og trække ud af x-aksen. y-aksen skal også flytte med , men den skalerer ikke. Flytning er bare at tage label med musen og flytte.

Kompiler og kør programmet så ser du min ide.

Håber du kan bruge det....Det er ikke helt det du er startet med, men det virker.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class FlytLabel extends JFrame implements MouseListener, MouseMotionListener
{
    JLabel label;
    int labelX;
    int labelY;
    int labelSizeX;
    int labelSizeY;
   
    int xforskydning;//hvor på label'en trykker du i fht pressed_x,pressed_y
    int yforskydning;

    int pressed_x;//hvor presser du musetasten ned
    int pressed_y;

    int dragged_x;//hvor trækker du musen
    int dragged_y;
   
    boolean skaler;
    Font labelFont;
   
    public FlytLabel()
    {
        labelFont = new Font(null, Font.PLAIN, 22);
        skaler = false;
    setSize(500,500);

    labelX =230;
    labelY = 230;
    labelSizeX = 50;
    labelSizeY = 20;
       
    label = new JLabel("Label", JLabel.CENTER);
    label.setFont(label.getFont());
    label.setBounds(labelX,labelY,labelSizeX,labelSizeY);
   
    getContentPane().add(label);
   
        addMouseListener(this);
        addMouseMotionListener(this);
    getContentPane().setLayout(null);
    }

    public void mouseDragged(MouseEvent e)
    {
        if(pressed_x > labelX && pressed_x < (labelX + labelSizeX + 5))
        {
            if(pressed_y > labelY && pressed_y <(labelY + labelSizeY + 23))
            {
                if(skaler)
                {
                    Font temp = new Font(null, Font.PLAIN, labelFont.getSize()+(((e.getX()-pressed_x)/3)));
                label.setFont(temp);
                label.setBounds(labelX, labelY,labelSizeX + (e.getX()-pressed_x),labelSizeY + (e.getY() - pressed_x));
                }
            else
                {
                label.setBounds((e.getX() + xforskydning),(e.getY() + yforskydning),labelSizeX,labelSizeY);
                }
            }
        }
    }
  public void mouseClicked(MouseEvent e)
  {
  }
  public void mousePressed(MouseEvent e)
  {
      pressed_x = e.getX();
      pressed_y = e.getY();
     
      if(e.getClickCount() == 2)
          skaler = true;

      xforskydning = (labelX - e.getX());
        yforskydning = (labelY - e.getY());
    }

  public void mouseMoved(MouseEvent e)
  {
      setTitle(e.getX() + "," + e.getY());
    }
    public void mouseReleased(MouseEvent e)
    {
        Rectangle r = label.getBounds();
    labelX = (int)r.getX();
    labelY = (int)r.getY();
   
    if(skaler)
        {
        labelSizeX = (int)r.getWidth();
        labelSizeY = (int)r.getHeight();
        labelFont = label.getFont();
        }
   
    skaler = false;
    }
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}

    public static void main(String args[])
    {
        FlytLabel gui = new FlytLabel();
        gui.setVisible(true);
    }//main

}//class
Avatar billede carstenknudsen Nybegynder
03. december 2002 - 10:27 #8
Du kan ikke få roteret dine komponenter, så skal
du over og have lavet et tegneprogram, der også
kan tegne komponenter. En måde hvormed du kan lave
dit rykken rundt på komponenter er ved at udnytte
drag and drop af komponenter og så kalde setBounds
for at fastfryse komponenterne når de er lagt på plads.
Avatar billede ng-km Nybegynder
17. december 2002 - 21:03 #9
Hej....SY22  Du takker for svar, men deler ikke point ud, jeg ved f.eks. at mit svar opfylder kravene til dit spørgsmål, og det er ikke for at være uhøflig, men det er trods alt 200 point.
Avatar billede sy22 Nybegynder
17. december 2002 - 23:11 #10
Beklager den lange ventetid...selvfølgelig skal der deles point ud, og det var da også lige en metode som den ng-km har skrevet jeg var ude efter, takker for den!!!
Jeg har dog først afsluttet mit programmerings-projekt idag, og ville vente med at uddele point til jeg var sikker på at jeg havde fundet den rigtige metode, men jeg har måske trukket den lige lidt for lang tid, beklager endnu en gang.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester