Gå til innhold

Metode som venter på input fra GUI


Anbefalte innlegg

Jeg holder på å lage en enkelt panel, hvor brukeren skal fylle inn tekst mm. Jeg vil gjerne kunne bruke det som følger:

 

SvarObjekt sv = SkjemaPanel visSkjemaPanel();

 

Altså slik som JOptionPane.

 

Det må mao. være en metode i SkjemaPanel som dette:

 

public static SvarObjekt visSkjemaPanel() {

  // Vise panel
 // Vente på at brukeren fyller inn
  // Når "ok" blir trykket, sende svaret tilbake
    return sv;
}

 

Jeg ser bare en måte å løse dette på, nemlig å la SkjemaPanel være en tråd, som ActionListener'en vekker.

 

Men er det noen bedre løsning? Eller er det slik det vanligvis gjøres?

 

EDIT: Rettet "stativ" til "static"

Endret av anderlin
Lenke til kommentar
Videoannonse
Annonse
Hvorfor skal du lage en ny tråd egentlig?

Jeg ser ingen annen løsning, det er grunnen. Slik ser jeg for meg at det kan gjøres med en tråd:

 

1. Metoden starter

2. Tråden starter

3. Panelet vises

4. Tråden stopper

5. actionPerformed starter tråden igjen

6. Metoden returnerer

 

Men jeg vil gjerne vite om en bedre løsning!

Endret av anderlin
Lenke til kommentar

Jeg prøvde å implementere det med en tråd, men får bare

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException: current thread not owner

 

Her er klassene:

 


import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class LogInPanel extends JPanel implements Runnable {

private JTextField usernameField = new JTextField();
private JPasswordField passwordField = new JPasswordField();
private JButton okButton = new JButton("OK");
private JButton cancelButton = new JButton("Cancel");

private String password, username;

public LogInPanel() {
}

public void run() {
       JFrame frame = new JFrame("202 Bugs Accepted");
    frame.getContentPane().add(this);
    [... ting som lager panelet ...]
    frame.setVisible(true);  
}

/** 
  * Denne skal kunne brukes av andre klasser:
  */

public synchronized boolean showLogInDialog(String message) {
   
    run();

try {
           wait();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }         
    
    return username == "PEER";
}

public void actionPerformed(ActionEvent arg0) {
       if (arg0.getSource() == okButton) {

           username = usernameField.getText();
           password = new String(passwordField.getPassword());
       } else {
           System.exit(0);
       }
}
       	
}

 

/*
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LogInPanelActionListener implements ActionListener {
   
   private LogInPanel panel;
   
public LogInPanelActionListener(LogInPanel panel) {
       this.panel = panel;        
}
   

public void actionPerformed(ActionEvent arg0) {
       panel.actionPerformed(arg0);
       panel.notify();
}

}

 

Alle innspill er velkomne! Jeg står helt fast her...

Endret av anderlin
Lenke til kommentar

Jeg prøver å lage en egen JOptionPane, som blokkerer tråden frem til brukeren gir input.

 

Hvordan får jeg en JFrame til å blokkere tråden uten å bruke flere tråder?

 

Jeg har lest kildekoden til JOptionPane og JDialog, men forstår ikke hvordan det virker. Det var ingen tråder der, men noen ObjectInputStreams jeg ikke skjønte hva gjorde...

Endret av anderlin
Lenke til kommentar
Jeg prøver å lage en egen JOptionPane, som blokkerer tråden frem til brukeren gir input.

 

Hvordan får jeg en JFrame til å blokkere tråden uten å bruke flere tråder?

Enkleste vil vel være å legge det i hovedtråden, og vente på at den returnerer...

//oppstarts dill
LogInPanel logIn = new LogInPanel(); //tom konstr.
String info = logIn.getInfo();
while (info == null){ 
   try{
       Thread.sleep(500);
   }catch (InterruptedException e){
        System.out.println(e.getMessage();
   }
   info = logIn.getInfo();
}
//del info i username og password og fortsett programmet


class LogInPanel {
// som din

public String getInfo(){
    //som din run(), men med ny slutt
   String info = username + "*" + password;
   return info;
}

Lenke til kommentar
Thread.sleep(500);

Takk, den var lur. Jeg fant en løsning lik denne uten sleep, men den brukte naturlig nok en del prosessorkraft.

 

Tusen takk!

 

PS: Hvis det er noen flere løsninger, er jeg veldig nysgjerrig.

Bare hyggelig :)

 

Kommer ikke på noen annen løsning nå, men tror det vil ligge i en nærmere gjennomgang av JOptionPane.

Lenke til kommentar

Hvordan lage sin egen kustomiserte OptionDialog

 

 

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MinOptionDialog extends JDialog implements ActionListener {

private static MinOptionDialog dialog;

private static String tempString;
 
//create the textfield for the classname
JTextField txtClassName = new JTextField();


public static String showDialog(Component frameComp) {
 
 Frame frame = JOptionPane.getFrameForComponent(frameComp);
 dialog = new MinOptionDialog(frame);
 dialog.setVisible(true);
 return tempString;

}

private MinOptionDialog(Frame frame) {
 
 super(frame, "Class options dialog", true);

   
//Create and initialize the buttons.
 JButton cancelButton = new JButton("Cancel");
 cancelButton.addActionListener(this);
 
 final JButton setButton = new JButton("Set");
 setButton.setActionCommand("Set");
 setButton.addActionListener(this);
 
 getRootPane().setDefaultButton(setButton);

 
 //main part of the dialog  

 //lay out the classname textfield
 JPanel panelet = new JPanel();
 panelet.setLayout(new BoxLayout(panelet, BoxLayout.LINE_AXIS));
 panelet.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
 
 //add a label to the button
 JLabel lblText = new JLabel("Tekst");
 panelet.add(lblText);
 
 panelet.add(txtClassName);
 
 
 
 //bygg opp dialogboksen med komponenter
 JPanel buttonPane = new JPanel();
 buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
 buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
 
 buttonPane.add(cancelButton);
 
 buttonPane.add(setButton);

 //Put everything together, using the content pane's BorderLayout.
 Container contentPane = getContentPane();
 contentPane.add(panelet, BorderLayout.CENTER);
 
 contentPane.add(buttonPane, BorderLayout.PAGE_END);

 
 pack();
 
}

//lukk dialogboksen med set knappen og close knappen
public void actionPerformed(ActionEvent e) {
 
 if( e.getActionCommand() == "Set" ){
 	
 	//tempString returneres og inneholder nå verdien fra textfeltet
 	tempString = txtClassName.getText();
 	//lukk dialogboksen
 	MinOptionDialog.dialog.setVisible(false);
 
 }
 else{
 	//lukk dialogboksen
 	MinOptionDialog.dialog.setVisible(false);
 }
 
 
}
}

 

Når du vil bruke den nye optiondialogen din gjør du f.eks slik:

 

import javax.swing.JFrame;

public class TestAvMinOptionDialog  {

public static void main(String[] args) {
 JFrame fr = new JFrame();
               //skriv ut det optiondialogen returnerte
 System.out.println( MinOptionDialog.showDialog(fr) );
}
}

 

håper det funker :)

Lenke til kommentar
Jeg holder på å lage en enkelt panel, hvor brukeren skal fylle inn tekst mm. Jeg vil gjerne kunne bruke det som følger:

 

Det må mao. være en metode i SkjemaPanel som dette:

 

public static SvarObjekt visSkjemaPanel() {

  // Vise panel
 // Vente på at brukeren fyller inn
  // Når "ok" blir trykket, sende svaret tilbake
    return sv;
}

HVis den ok knappen er en vanlig knapp kan du gjøre slik:

 

JButton knapp = new JButton(new ActionListener(){
   public void ActionPerformed(ActionEvent e){
       // Åpne panelet ditt
       // returnere svar eller hva du nå vil, feks:
       showDialog(Component frameComp);
   });

 

Så du hadde fått et annet langt svar i sted, vet ikke om dette gjør det samme, men det er ihvertfall uten bruk av tråd :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...