anderlin Skrevet 16. mars 2005 Del Skrevet 16. mars 2005 (endret) 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 17. mars 2005 av anderlin Lenke til kommentar
buskmann Skrevet 16. mars 2005 Del Skrevet 16. mars 2005 Hvorfor skal du lage en ny tråd egentlig? Lenke til kommentar
anderlin Skrevet 16. mars 2005 Forfatter Del Skrevet 16. mars 2005 (endret) 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 16. mars 2005 av anderlin Lenke til kommentar
anderlin Skrevet 16. mars 2005 Forfatter Del Skrevet 16. mars 2005 (endret) 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 16. mars 2005 av anderlin Lenke til kommentar
Mr.Garibaldi Skrevet 17. mars 2005 Del Skrevet 17. mars 2005 Kan du forklare i litt nærmere detalj hva du prøver å gjøre? Det skal være fullt mulig å lage en egen JFrame som virker som JOptionPane uten å bruke noen flere tråder... Lenke til kommentar
anderlin Skrevet 17. mars 2005 Forfatter Del Skrevet 17. mars 2005 (endret) 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 17. mars 2005 av anderlin Lenke til kommentar
Mr.Garibaldi Skrevet 17. mars 2005 Del Skrevet 17. mars 2005 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
anderlin Skrevet 17. mars 2005 Forfatter Del Skrevet 17. mars 2005 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. Lenke til kommentar
Mr.Garibaldi Skrevet 17. mars 2005 Del Skrevet 17. mars 2005 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
zulo Skrevet 17. mars 2005 Del Skrevet 17. mars 2005 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
anderlin Skrevet 17. mars 2005 Forfatter Del Skrevet 17. mars 2005 Tusen takk! Det fungerer utmerket. Endelig en løsning jeg kan beundre, rent kodeestetisk sett! Lenke til kommentar
mikaelandre Skrevet 18. mars 2005 Del Skrevet 18. mars 2005 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå