[Java] Veranderen JComboBox model adv input

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Sumerechny
  • Registratie: December 2012
  • Laatst online: 14:36

Sumerechny

2 + 2 = 5...or so I'm told.

Topicstarter
Goedendag allen,

Ik probeer Java hobbymatig onder de knie te krijgen door een MOOC te volgen. Vandaag heb ik besloten eens te kijken hoe ver ik kan komen met een simpele 'calculator' door gebruik te maken van zoveel mogelijk eigen kennis.

Op dit moment wil ik d.m.v. JCombo subjectsel een 'subject' selecteren, dit gaat goed. Ik krijg het echter niet voor elkaar om JCombo 'unitsel' een selectie te laten tonen. Ik heb reeds begrepen dat dit via getModel() zou kunnen maar ik kom geen meter verder. Is iemand in staat mij een duwtje in de juiste richting te geven?

Op voorhand excuus; Ik weet niet zeker welke code 100% relevant is in dit geval :F

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
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class UserInterface implements Runnable {

    String unitstring = "Select a subject";
    int print;

    @Override
    public void run() {
        JFrame frame = new JFrame("Radiation Calculator 2.0");
        frame.setPreferredSize(new Dimension(350, 250));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        createComponents(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public void createComponents(Container container) {
        GridLayout layout = new GridLayout(4, 2);
        container.setLayout(layout);
        JLabel subject = new JLabel("Select a subject");

        String[] subjectStrings = {"Wavelenght", "Radioactive Decay", "Radiation Dose"};
        JComboBox subjectsel = new JComboBox(subjectStrings);
        subjectsel.addActionListener(this::actionPerformed);


        JLabel unit = new JLabel("Select a unit");

        String[] unitStrings = {unitstring};

        JComboBox unitsel = new JComboBox(unitStrings);

        JLabel input = new JLabel("Select a input");
        JTextField userinput = new JTextField("");

        JButton calculate = new JButton("Calculate");
        JTextArea result = new JTextArea("");
        result.setEditable(false);

        container.add(subject);
        container.add(subjectsel);
        container.add(unit);
        container.add(unitsel);
        container.add(input);
        container.add(userinput);
        container.add(calculate);
        container.add(result);
    }

    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox) e.getSource();
        print = cb.getSelectedIndex();

        if (print == 0) {
            unitstring = "Meters";
        }
        if (print == 1) {
            unitstring = "Bequerel";
        }
        if (print == 2) {
            unitstring = "Gray";
        }

        System.out.println(print);
        System.out.println(unitstring);
    }

}


Bovenstaande code bevat op het laatste een sout en omvorming van de unitstring om te kijken of er iets gebeurt. DIt moet anders maar ik kom er helaas niet uit.. :?

Beste antwoord (via Sumerechny op 13-02-2018 07:21)


Verwijderd

Ik neem aan dat je de waarde van unitSel wilt aanpassen op basis van de geselecteerde subject? Dus Wavelength = Meters, Radioactive Decay = Bequerel etc? Weet niet of een ComboBox de juiste manier is om zo'n keuze te displayen, maar ik hou je niet tegen. ;)

Je moet de inhoud van die JComboBox wel updaten. Wat je op dit moment doet is eerst een array genaamd unitStrings maken met als enige index de String unitstring. Daarna maak je een JComboBox en geef je de eerdergenoemde array mee in de constructor. Als die array, of de string(s) waaruit die array is opgebouwd later veranderen, dan heeft dit geen effect op de JComboBox of de view. De inhoud van de JComboBox wordt bepaald op regel 36 maar heeft daarna verder geen connectie meer det je lokale string of array. Bovendien zal de view pas updaten zodra 1 van de vele listeners wordt getriggered. Die triggeren bijvoorbeeld als je de waarde van je JComboBox verandert d.m.v de ingebouwde methodes.

Als je de JComboBoxes private declareert binnen deze class dan kan je er vanuit de actionPerformed methode ook nog bij en de waardes aanpassen. Dat ziet er dan zo uit:

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
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class UserInterface implements Runnable {

    String unitstring = "Select a subject";
    private JComboBox subjectsel, unitsel;
    int print;

    @Override
    public void run() {
        JFrame frame = new JFrame("Radiation Calculator 2.0");
        frame.setPreferredSize(new Dimension(350, 250));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        createComponents(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public void createComponents(Container container) {
        GridLayout layout = new GridLayout(4, 2);
        container.setLayout(layout);
        JLabel subject = new JLabel("Select a subject");

        String[] subjectStrings = {"Wavelenght", "Radioactive Decay", "Radiation Dose"};
        subjectsel = new JComboBox(subjectStrings);
        subjectsel.addActionListener(this::actionPerformed);


        JLabel unit = new JLabel("Select a unit");

        String[] unitStrings = {unitstring};

        unitsel = new JComboBox(unitStrings);

        JLabel input = new JLabel("Select a input");
        JTextField userinput = new JTextField("");

        JButton calculate = new JButton("Calculate");
        JTextArea result = new JTextArea("");
        result.setEditable(false);

        container.add(subject);
        container.add(subjectsel);
        container.add(unit);
        container.add(unitsel);
        container.add(input);
        container.add(userinput);
        container.add(calculate);
        container.add(result);
    }

    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox) e.getSource();
        print = cb.getSelectedIndex();

        if (print == 0) {
            unitstring = "Meters";
        }
        if (print == 1) {
            unitstring = "Bequerel";
        }
        if (print == 2) {
            unitstring = "Gray";
        }
        
        unitsel.removeAllItems();
        unitsel.addItem(unitstring);

        System.out.println(print);
        System.out.println(unitstring);
    }

}

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

Verwijderd

Ik neem aan dat je de waarde van unitSel wilt aanpassen op basis van de geselecteerde subject? Dus Wavelength = Meters, Radioactive Decay = Bequerel etc? Weet niet of een ComboBox de juiste manier is om zo'n keuze te displayen, maar ik hou je niet tegen. ;)

Je moet de inhoud van die JComboBox wel updaten. Wat je op dit moment doet is eerst een array genaamd unitStrings maken met als enige index de String unitstring. Daarna maak je een JComboBox en geef je de eerdergenoemde array mee in de constructor. Als die array, of de string(s) waaruit die array is opgebouwd later veranderen, dan heeft dit geen effect op de JComboBox of de view. De inhoud van de JComboBox wordt bepaald op regel 36 maar heeft daarna verder geen connectie meer det je lokale string of array. Bovendien zal de view pas updaten zodra 1 van de vele listeners wordt getriggered. Die triggeren bijvoorbeeld als je de waarde van je JComboBox verandert d.m.v de ingebouwde methodes.

Als je de JComboBoxes private declareert binnen deze class dan kan je er vanuit de actionPerformed methode ook nog bij en de waardes aanpassen. Dat ziet er dan zo uit:

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
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class UserInterface implements Runnable {

    String unitstring = "Select a subject";
    private JComboBox subjectsel, unitsel;
    int print;

    @Override
    public void run() {
        JFrame frame = new JFrame("Radiation Calculator 2.0");
        frame.setPreferredSize(new Dimension(350, 250));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        createComponents(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public void createComponents(Container container) {
        GridLayout layout = new GridLayout(4, 2);
        container.setLayout(layout);
        JLabel subject = new JLabel("Select a subject");

        String[] subjectStrings = {"Wavelenght", "Radioactive Decay", "Radiation Dose"};
        subjectsel = new JComboBox(subjectStrings);
        subjectsel.addActionListener(this::actionPerformed);


        JLabel unit = new JLabel("Select a unit");

        String[] unitStrings = {unitstring};

        unitsel = new JComboBox(unitStrings);

        JLabel input = new JLabel("Select a input");
        JTextField userinput = new JTextField("");

        JButton calculate = new JButton("Calculate");
        JTextArea result = new JTextArea("");
        result.setEditable(false);

        container.add(subject);
        container.add(subjectsel);
        container.add(unit);
        container.add(unitsel);
        container.add(input);
        container.add(userinput);
        container.add(calculate);
        container.add(result);
    }

    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox) e.getSource();
        print = cb.getSelectedIndex();

        if (print == 0) {
            unitstring = "Meters";
        }
        if (print == 1) {
            unitstring = "Bequerel";
        }
        if (print == 2) {
            unitstring = "Gray";
        }
        
        unitsel.removeAllItems();
        unitsel.addItem(unitstring);

        System.out.println(print);
        System.out.println(unitstring);
    }

}

Acties:
  • 0 Henk 'm!

  • Sumerechny
  • Registratie: December 2012
  • Laatst online: 14:36

Sumerechny

2 + 2 = 5...or so I'm told.

Topicstarter
Verwijderd schreef op maandag 12 februari 2018 @ 07:07:
Ik neem aan dat je de waarde van unitSel wilt aanpassen op basis van de geselecteerde subject? Dus Wavelength = Meters, Radioactive Decay = Bequerel etc? Weet niet of een ComboBox de juiste manier is om zo'n keuze te displayen, maar ik hou je niet tegen. ;)

Je moet de inhoud van die JComboBox wel updaten. Wat je op dit moment doet is eerst een array genaamd unitStrings maken met als enige index de String unitstring. Daarna maak je een JComboBox en geef je de eerdergenoemde array mee in de constructor. Als die array, of de string(s) waaruit die array is opgebouwd later veranderen, dan heeft dit geen effect op de JComboBox of de view. De inhoud van de JComboBox wordt bepaald op regel 36 maar heeft daarna verder geen connectie meer det je lokale string of array. Bovendien zal de view pas updaten zodra 1 van de vele listeners wordt getriggered. Die triggeren bijvoorbeeld als je de waarde van je JComboBox verandert d.m.v de ingebouwde methodes.

Als je de JComboBoxes private declareert binnen deze class dan kan je er vanuit de actionPerformed methode ook nog bij en de waardes aanpassen. Dat ziet er dan zo uit:

code:
1
...............
Dank voor de toelichting! Volgens mij mis ik nog bepaalde basiskennis (het verversen zag ik bv wel, maar ik kon niet achterhalen hoe het zou moeten :X ), ik ga je feedback even meenemen. :Y

Wat zou dan een goed alternatief voor de combobox zijn?