[JAVA-SWING]Bij laden plaatje hoogte en breedte aangeven

Pagina: 1
Acties:

  • degroot
  • Registratie: December 2003
  • Niet online
Hallo,

Ik ben bezig een applicatie in swing te maken die uiteindelijk foto's moet kunnen resizen en ze op een locatie weg kunnen schrijven.
Omdat ik nog niet helemaal goed over die vaardigheden beheers ben ik toch begonnen aan de applicatie , alleen zijn mijn eisen minder streng.

De applicatie moet nu , nadat ik een foto heb opgezocht(gewoon via een FileDialog) in een textarea de hoogte en de breedte van de foto aangeven.

Dit lukt wel , als ik de locatie van de foto maar gewoon vanuit de brondcode defineer
dus zo:
code:
1
picture = getToolkit().getImage("C:\\down.jpg");


Alleen als ik vanuit een FileDialog een foto selecteer wil hij dit nog niet weergeven , en ik loop ook een beetje vast waarom eigenlijk niet....

Mijn complete broncode is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class test extends JFrame
{
    public static void main(String[] args)
    {
        new test();
    }
    
    private JTextField bestandveld,hoogteveld,breedteveld;
    private JButton aktieknop,bladerknop;
    private JLabel bestandlabel,hoogtelabel,breedtelabel;
    private Image picture;
    String pict;
    
    public test()
    {
        setSize(800,100);
        setTitle("Slice - Image Resizer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        picture = getToolkit().getImage(""+pict);

        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(picture,  0); //voeg plaatje toe aan mediatracker
        try
        {       mediaTracker.waitForID(0); //wacht tot plaatje gereed is
        }
        catch (InterruptedException ie)
        {    System.err.println(ie); //of volledige stacktrace, custom fout, etc          
        }

        int width = picture.getWidth(this);
        int height = picture.getHeight(this);
        
        aktieknop = new JButton("Resize!");
        aktieknop.addActionListener(new knopjehandler());
        bladerknop = new JButton("Blader");
        bladerknop.addActionListener(new knopjehandler());
        
        JPanel paneeltje = new JPanel();
        
        bestandveld = new JTextField(25);
        hoogteveld = new JTextField(""+height,5);
        breedteveld = new JTextField(""+width,5);
        
        bestandlabel = new JLabel("File:");
        hoogtelabel = new JLabel("Hoogte");
        breedtelabel = new JLabel("breedte");
        
        paneeltje.add(bestandlabel);
        paneeltje.add(bestandveld);
        paneeltje.add(bladerknop);
        paneeltje.add(hoogtelabel);
        paneeltje.add(hoogteveld);
        paneeltje.add(breedtelabel);
        paneeltje.add(breedteveld);
        paneeltje.add(aktieknop);
        getContentPane().add(paneeltje);
        
        setVisible(true);
    }
    
    public class knopjehandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
          if(e.getSource() == bladerknop)
          {
              openbestand();
          }
          else if(e.getSource() == aktieknop)
          {
              String checkbestand = bestandveld.getText();
              if(checkbestand.length() == 0)
              {
                  JOptionPane.showMessageDialog(test.this,"Je moet eerst een Image selecteren alvorens je hem kan resizen","Selecteer plaatje",JOptionPane.ERROR_MESSAGE);
              }
              else
              {
 
              }
          }
        }
    }
    
    private void openbestand()
    {
        FileDialog browser = new FileDialog(test.this,"Open een image",FileDialog.LOAD);
        browser.show();
        String bestandnaam = browser.getFile();
        String directory = browser.getDirectory();
        bestandveld.setText(directory+bestandnaam);
        pict = bestandveld.getText();
        repaint();
    }
}

Hopelijk kunnen jullie mij weer een beetje opweg helpen...heb nog niet zo heel erg veel ervaring hier in

www.degroot-it.nl


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:25

Robtimus

me Robtimus no like you

degroot schreef op woensdag 10 mei 2006 @ 21:47:
code:
1
2
3
4
5
6
7
8
9
10
11
    private void openbestand()
    {
        FileDialog browser = new FileDialog(test.this,"Open een image",FileDialog.LOAD);
        browser.show();
        String bestandnaam = browser.getFile();
        String directory = browser.getDirectory();
        bestandveld.setText(directory+bestandnaam);
        pict = bestandveld.getText();
        repaint();
    }
}
Hier zet je pict wel opnieuw, maar je geeft daarna niet aan dat je het plaatje opnieuw moet inladen. Er is geen enkele verbinding tussen de variabelen pict en picture. pict wordt nu een nieuwe String die niets te maken heeft met picture. Je zal dus 1) picture opnieuw moeten initialiseren met de nieuwe waarde van pict, en 2) de picture uberhaupt op je frame gooien - dat doe je nog nergens.

Verder doet repaint() niets behalve dan de standaard componenten opnieuw tekenen. Aangezien deze hetzelfde zijn gebleven had je het net zo goed niet hoeven aan te roepen.

Als je ooit custom dingen wilt doen tijdens repainten moet je de volgende code in je jframe / jpanel zetten:
Java:
1
2
3
4
5
6
protected void paintComponent(Graphics g) {
    super.paintComponent(g); // nooir vergeten!
    if (g != null) {  // is deze check wel nodig?
        // je overige code
    }
}

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • degroot
  • Registratie: December 2003
  • Niet online
IceManX schreef op woensdag 10 mei 2006 @ 22:16:
[...]
Je zal dus 1) picture opnieuw moeten initialiseren met de nieuwe waarde van pict, en 2) de picture uberhaupt op je frame gooien - dat doe je nog nergens.
Bedoel je met 2 gewoon het weergeven van de image?
Dat is toch niet perse nodig om de gegevens van het plaatje te laten zien?
Weet nog nie goed hoe dat moet dus wilde ik dat plaatje weergeven voor later bewaren

EDIT:
Bij 1 dacht ik slim te zijn....
door pict aan picture te koppelen dmv deze code
code:
1
 picture = getToolkit().getImage(""+pict);

Omdat pict de String van de url is....

Maar bedoel je deze code die opnieuw geinitialiseerd moet worden?
code:
1
2
3
4
5
6
7
8
        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(picture,  0); //voeg plaatje toe aan mediatracker
        try
        {       mediaTracker.waitForID(0); //wacht tot plaatje gereed is
        }
        catch (InterruptedException ie)
        {    System.err.println(ie); //of volledige stacktrace, custom fout, etc          
        }

[ Voor 41% gewijzigd door degroot op 10-05-2006 22:26 ]

www.degroot-it.nl


  • degroot
  • Registratie: December 2003
  • Niet online
Ik denk zelf nu dat ik een beetje op de goede weg zit na wat gegoogle.
Zou ik het adres van het plaatje misschien in een URL moeten opslaan en deze bovenaan in de classe test waar het plaatje gedefineerd word moeten inladen???

Dus ongeveer op deze manier?(code werkt nog niet)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import java.net.URL;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class test extends JFrame
{
    public static void main(String[] args)
    {
        new test();
    }
    
    private JTextField bestandveld,hoogteveld,breedteveld;
    private JButton aktieknop,bladerknop;
    private JLabel bestandlabel,hoogtelabel,breedtelabel;
    private Image picture,img;
    String pict;
    
    public test()
    {
        setSize(800,100);
        setTitle("Slice - Image Resizer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        picture = getToolkit().getImage(img);

        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(picture,  0); //voeg plaatje toe aan mediatracker
        try
        {       mediaTracker.waitForID(0); //wacht tot plaatje gereed is
        }
        catch (InterruptedException ie)
        {    System.err.println(ie); //of volledige stacktrace, custom fout, etc          
        }

        int width = picture.getWidth(this);
        int height = picture.getHeight(this);
        
        aktieknop = new JButton("Resize!");
        aktieknop.addActionListener(new knopjehandler());
        bladerknop = new JButton("Blader");
        bladerknop.addActionListener(new knopjehandler());
        
        JPanel paneeltje = new JPanel();
        
        bestandveld = new JTextField(25);
        hoogteveld = new JTextField(""+height,5);
        breedteveld = new JTextField(""+width,5);
        
        bestandlabel = new JLabel("File:");
        hoogtelabel = new JLabel("Hoogte");
        breedtelabel = new JLabel("breedte");
        
        paneeltje.add(bestandlabel);
        paneeltje.add(bestandveld);
        paneeltje.add(bladerknop);
        paneeltje.add(hoogtelabel);
        paneeltje.add(hoogteveld);
        paneeltje.add(breedtelabel);
        paneeltje.add(breedteveld);
        paneeltje.add(aktieknop);
        getContentPane().add(paneeltje);
        
        setVisible(true);
    }
    
    public class knopjehandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
          if(e.getSource() == bladerknop)
          {
              openbestand();
          }
          else if(e.getSource() == aktieknop)
          {
              String checkbestand = bestandveld.getText();
              if(checkbestand.length() == 0)
              {
                  JOptionPane.showMessageDialog(test.this,"Je moet eerst een Image selecteren alvorens je hem kan resizen","Selecteer plaatje",JOptionPane.ERROR_MESSAGE);
              }
              else
              {
 
              }
          }
        }
    }
    
    private void openbestand()
    {
        FileDialog browser = new FileDialog(test.this,"Open een image",FileDialog.LOAD);
        browser.show();
        String bestandnaam = browser.getFile();
        String directory = browser.getDirectory();
        bestandveld.setText(directory+bestandnaam);
        pict = bestandveld.getText();
        URL url = this.getClass().getResource(pict);
        Image img = Toolkit.getDefaultToolkit().getImage(url);
}
}

Hopelijk kunnen jullie me weer een beetje opweg helpen

www.degroot-it.nl


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
In de openBestand methode zou ik het plaatje ook nog inladen in je picture. picture = getToolkit.getImage(pict);

Die extra Image img kan je wel schrappen en gewoon de eerste broncode aanhouden.

Je moet daarna wel opnieuw hoogte en breedte opnieuw uit je Image halen en opnieuw in je tekstvakken zetten.

[ Voor 30% gewijzigd door The Fox NL op 11-05-2006 11:12 ]


  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Ik zou alles een stuk generieker opzetten als ik jouw was en dus ervoor kiezen om al je bewerkingen en rekenwerk in een aparte klasse te definiëren. Dit zorgt voor overzichtelijkheid en dan kan je in een later stadium makkelijk je applicatie uitbreiden door bijvoorbeeld een hele map te laten resizen.

It's scientifically known, that base improves the tase of cheezes!


  • degroot
  • Registratie: December 2003
  • Niet online
Hij werkt nu....
Ik moest dus dat gebeuren van plaatje inleze en mediatracker even uit de constructor halen...en in een aparte methode zetten

Alles werkt nu en mijn code is dus als volgt
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.net.URL;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class test extends JFrame
{
    public static void main(String[] args)
    {
        new test();
    }
    
    private JTextField bestandveld,hoogteveld,breedteveld;
    private JButton aktieknop,bladerknop;
    private JLabel bestandlabel,hoogtelabel,breedtelabel;
    private Image picture,img;
    String pict;
    
    public test()
    {
        setSize(800,100);
        setTitle("Slice - Image Resizer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        aktieknop = new JButton("Resize!");
        aktieknop.addActionListener(new knopjehandler());
        bladerknop = new JButton("Blader");
        bladerknop.addActionListener(new knopjehandler());
        
        JPanel paneeltje = new JPanel();
        
        bestandveld = new JTextField(25);
        hoogteveld = new JTextField("",5);
        breedteveld = new JTextField("",5);
        
        bestandlabel = new JLabel("File:");
        hoogtelabel = new JLabel("Hoogte");
        breedtelabel = new JLabel("breedte");
        
        paneeltje.add(bestandlabel);
        paneeltje.add(bestandveld);
        paneeltje.add(bladerknop);
        paneeltje.add(hoogtelabel);
        paneeltje.add(hoogteveld);
        paneeltje.add(breedtelabel);
        paneeltje.add(breedteveld);
        paneeltje.add(aktieknop);
        getContentPane().add(paneeltje);
        
        setVisible(true);
    }
    
    public class knopjehandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
          if(e.getSource() == bladerknop)
          {
              openbestand();
          }
          else if(e.getSource() == aktieknop)
          {
              String checkbestand = bestandveld.getText();
              if(checkbestand.length() == 0)
              {
                  JOptionPane.showMessageDialog(test.this,"Je moet eerst een Image selecteren alvorens je hem kan resizen","Selecteer plaatje",JOptionPane.ERROR_MESSAGE);
              }
              else
              {
 
              }
          }
        }
    }
    
    private void openbestand()
    {
        FileDialog browser = new FileDialog(test.this,"Open een image",FileDialog.LOAD);
        browser.show();
        String bestandnaam = browser.getFile();
        String directory = browser.getDirectory();
        bestandveld.setText(directory+bestandnaam);
        pict = bestandveld.getText();
        URL url = this.getClass().getResource(pict);
        picture = Toolkit.getDefaultToolkit().getImage(url);
        changepict();
}
    private void changepict()
    {
        picture = getToolkit().getImage(""+pict); 

        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(picture,  0); //voeg plaatje toe aan mediatracker
        try
        {       mediaTracker.waitForID(0); //wacht tot plaatje gereed is
        }
        catch (InterruptedException ie)
        {    System.err.println(ie); //of volledige stacktrace, custom fout, etc          
        }

        int width = picture.getWidth(this);
        int height = picture.getHeight(this);
        
        hoogteveld.setText(""+height);
        breedteveld.setText(""+width);
    }
}

ThnQ voor jullie hulp

[ Voor 3% gewijzigd door degroot op 11-05-2006 11:40 ]

www.degroot-it.nl


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:25

Robtimus

me Robtimus no like you

Waarom gebruik je steeds ""+<variabele>?

Voor strings geeft dit gewoon je variabele terug maar wel als nieuw object. Tenzij je var null is maar dan kun je het beter doen met een if statement of de tertiaire operator: (pict == null ? "" : pict).
Voor integers, longs etc kun je String.valueOf gebruiken. Voor objecten anders dan string kun je de toString() method gebruiken tenzij het object null is: (obj == null ? "" : obj.toString()).

Scheelt je toch in je string object creatie, en je app wordt er net iets efficienter door.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • grhmpf
  • Registratie: December 2000
  • Laatst online: 29-05-2022

grhmpf

Android <3

Buiten dat mag ie ook wel naar de conventies voor naamgeving van variabelen, methoden en classes kijken :)

Bijv ipv class test: class Test

Voor methodes is de conventie openBestand ipv openbestand etc.

Ipv een MediaTracker had ie ook een BufferedImage kunnen gebuiken volgens mij.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:30

TeeDee

CQB 241

grhmpf schreef op donderdag 11 mei 2006 @ 12:58:
Voor methodes is de conventie openBestand ipv openbestand etc.
offtopic:
Is dat zo? Volgens mij is het nu algemeen 'geaccepteerd' om er "OpenBestand" van te maken.
Weet alleen nooit wat de benaming er nu van is. Hungarian, Camel etc. etc.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
TeeDee schreef op donderdag 11 mei 2006 @ 13:24:
[...]

offtopic:
Is dat zo? Volgens mij is het nu algemeen 'geaccepteerd' om er "OpenBestand" van te maken.
Weet alleen nooit wat de benaming er nu van is. Hungarian, Camel etc. etc.
Binnen Java is het gebruikelijk methoden met kleine letter te beginnen.
Pagina: 1