Avatar billede mccrack.dk Nybegynder
10. maj 2003 - 12:57 Der er 10 kommentarer og
1 løsning

Hjælp til hjemmelavet JDialog-boks!

Jeg er ved at lave min egen JDialog-boks som skal modtage en ArrayList med parameter. Ud fra dialog-boksen kan man vælge via en liste, kun ét af objekterne fra ArryListen. Dette objekt skal så retuneres tilbage til den metode der kaldte dialogboksen... Problemet er jeg ikke ved hvordan man får dialog-boksen til at sende det valgte objekt tilbage til den metode der kaldte dialog-boksen. Den metode der kalder dialog-boksen skal jo vente på der bliver valgt noget (altså retuneres) i dialog-boksen før den kan fortsætte... Håber i kan forstå mit problem ;-)

Kildekoden til dialog-boksen:

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

public class SoegKundeGUI extends JDialog implements ActionListener
  {
  private JPanel soegPanel;
  private DefaultListModel listModel;
  private JList resultatList;
  private JScrollPane sp_resultatList;
  private JButton hentButton;
  private JButton annullerButton;

  public SoegKundeGUI() {
    this.setTitle("Søgeresultat");
    this.setModal(true);
       
    soegPanel = new JPanel();
    SoegGUILayout soegGUILayout = new SoegGUILayout();
    soegPanel.setLayout(soegGUILayout);

    listModel = new DefaultListModel();
    resultatList = new JList(listModel);
    resultatList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    sp_resultatList = new JScrollPane(resultatList);
    soegPanel.add(sp_resultatList);
   
    hentButton = new JButton("Hent");
    hentButton.addActionListener(this);
    soegPanel.add(hentButton);
   
    annullerButton = new JButton("Annullér");
    annullerButton.addActionListener(this);
    soegPanel.add(annullerButton);
   
    getContentPane().add(soegPanel);
    this.setResizable(false);
    Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation(scr.width/2-340/2,scr.height/2-310/2);
    this.pack();
   
    this.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        listModel.clear();
      }
    });
  }
 
  //Her sender jeg ArrayListen...
  public void visResultat(ArrayList list)
  {
    for(int i = 0; i < list.size(); i++)
    {
      listModel.addElement((Kunde) list.get(i));
    }
    this.setVisible(true);
  }
  public void actionPerformed(ActionEvent e)
  {
      if(hentButton == e.getSource())
    {
      //Her modtager jeg det valgte objekt som er: resultatList.getSelectedValue());
      listModel.clear();
    }
    if(annullerButton == e.getSource())
    {
      this.setVisible(false);
      listModel.clear();
    }
  }
}

Håber virkelig nogen har en løsning på dette problem...
Avatar billede elv Nybegynder
10. maj 2003 - 13:16 #1
Lav et interface på den klasse som kalder dialog-boksen:
interface DialogCaller
{
    public abstract void callback(Kunde k);
}

og implementer det i den klasse som kalder dialog-boksen:

public class Main implements DialogCaller
    public synchronized void callback(Kunde k)
    {
        // Gør hvad du vil
    }

Så laver du din visResultat om til at tage en DialogCaller med:
public void visResultat(ArrayList list, DialogCaller caller)

Og bruger callback'en i den:
if(hentButton == e.getSource())
{
    caller.callback((Kunde) resultatList.getSelectedValue());
    listModel.clear();
..osv

Det er ikke lige gennemtestet, men jeg mener at ideen skulle være der :)
Avatar billede mccrack.dk Nybegynder
10. maj 2003 - 13:41 #2
Takker for svaret... Men er det ikke muligt at løse det i stil med nedenstående dialog-boks, hvor den valgte værdi retuneres af kaldet?

int c = JOptionPane.showConfirmDialog(null, "Vælg 'yes', 'no' eller 'cancel'?");
if(c == 0)
  //der blev trykket 'yes'
if(c == 1)
  //der blev trykket 'no' osv.
Avatar billede elv Nybegynder
10. maj 2003 - 14:01 #3
Så vidt jeg ved er JDialog ikke modal, mens JOptionPane er, så jeg tror du er nødt til at nedarve fra JOptionPane for at få den til at vente til du har svaret i dialogboksen... men hæng mig ikke op på det :)

Du kan læse mere om det i "How to Make Dialogs" på http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
Avatar billede elv Nybegynder
10. maj 2003 - 14:06 #4
Whops, det ser faktisk ud til at man godt kan alligevel...
JDialog har en setModal-funktion, men om det er nok vil jeg lade op til dig at teste :)
Avatar billede elv Nybegynder
10. maj 2003 - 14:10 #5
Og så kalde this.show i stedet for this.setVisible...
show siger:
If the dialog is modal and is not already visible, this call will not return until the dialog is hidden by calling hide or dispose. It is permissible to show modal dialogs from the event dispatching thread because the toolkit will ensure that another event pump runs while the one which invoked this method is blocked.
Avatar billede mccrack.dk Nybegynder
10. maj 2003 - 14:17 #6
Jeg har haft kigget på den tutorial... men det ku' være jeg skulle gøre det igen så ;)

BTW: Jeg har erfaret at når modal er sat til true skal dialog-boksen være "afviklet" før man kan vende tilbage til oprindelige GUI. Men hvad betyder/gør modal helt præcist?
Avatar billede elv Nybegynder
10. maj 2003 - 14:24 #7
Det er lige præcist det som det gør :)
"When a modal dialog is visible, it blocks user input to all other windows in the program. "
Avatar billede mccrack.dk Nybegynder
10. maj 2003 - 16:59 #8
Efter at have gennemlæst tutorial'en, er jeg kommet frem til nedenstående Dialog-boks som tildels kan løse mit problem. Men den bruger desværre en dropdownmenu hvor jeg bruger en liste :(

Er det ikke på nogen måde muligt at lave sin egen dialog-boks som man kan kalde ligesom nedenstående???

Object[] possibleValues = { "First", "Second", "Third" };
Object selectedValue = JOptionPane.showInputDialog(null, "Choose one", "Input", JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]);
Avatar billede elv Nybegynder
10. maj 2003 - 17:33 #9
Ud fra din egen kode og med lidt ændringer:

*** Main.java ***
    public static void main(String[] args)
    {
        System.out.println("start");
        Di di = new Di();
        String[] values = {"one", "to", "drei"};
        System.out.println(di.visResultat(values));
        System.out.println("slut");
    }

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

public class Di extends JDialog implements ActionListener
{
    private JPanel soegPanel;
    private JList resultatList;
    private JScrollPane sp_resultatList;
    private DefaultListModel listModel;

    private JButton hentButton;
    private JButton annullerButton;
    private String result = "";

    public Di()
    {
        super();
        setTitle("Søgeresultat");
        setModal(true);
        setResizable(false);
        setLocation(100, 100);

        soegPanel = new JPanel();
        soegPanel.setLayout(new FlowLayout());

        listModel = new DefaultListModel();
        resultatList = new JList(listModel);
        resultatList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        sp_resultatList = new JScrollPane(resultatList);
        soegPanel.add(sp_resultatList);

        hentButton = new JButton("Hent");
        hentButton.addActionListener(this);
        soegPanel.add(hentButton);

        annullerButton = new JButton("Annullér");
        annullerButton.addActionListener(this);
        soegPanel.add(annullerButton);

        getContentPane().add(soegPanel);
        pack();
    }

    //Her sender jeg ArrayListen...
    public String visResultat(String[] list)
    {
        for (int i = 0; i < list.length; i++)
        {
            listModel.addElement(list[i]);
        }
        show();
        return result;
    }

    public void actionPerformed(ActionEvent e)
    {
        if (hentButton == e.getSource())
        {
            result = (String) resultatList.getSelectedValue();
            hide();
        }
        if (annullerButton == e.getSource())
        {
            hide();
        }
    }
}
Avatar billede mccrack.dk Nybegynder
10. maj 2003 - 18:34 #10
Ja selvfølgelig, når modal er true kan man jo gøre det på den måde... Takker mange gange for hjælpen :-)
Avatar billede elv Nybegynder
10. maj 2003 - 18:56 #11
så lidt :)
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

IT-JOB