Moikka
Olisi seuraavanlainen Java -ongelma. Pitäisi saada aina silloin tällöin pääohjelmasta tulostettua tekstiä ikkunaan (frame). Ajattelin niin, että tämä tulostus ohjelma voisi olla aliohjelma, jota kutsuttaisiin aina pääohjelmasta. Sinne vietäisiin parametrina tulostettava teksti (string) ja koordinaat x (int) ja y (int),
joilla määritellään tekstin paikka framessa. En ole saanut tätä jostain syystä onnistumaan.
terv. Hente
Moikka Hente
Voisitko lähettää tänne sen koodin, minkä olet tähän mennessä kirjoittanut? Ilman sitä on vaikea sanoa, miksi se ei toimi. Nyt emme esimerkiksi tiedä, mitä kirjastoa käytät ikkunointiin.
Monissa kirjastoissa käyttöliittymän muutokset pitää lähettää käyttöliittymän säikeeseen erillisellä funktiolla, esimerkiksi SwingUtilities.invokeLater. Piirtämisessä on olennaista sopivan repaint-tapahtuman laukaisu. Usein myös jatkuvat laskut pitäisi laittaa erilliseen säikeeseen.
package javaapplication14; import javax.swing.*; import java.awt.*; import java.util.Scanner; import javax.xml.soap.Text; import javax.swing.JPanel; /** * * @author Hemmo-V */ public class JavaApplication14 extends JPanel { public void Kirjoita (Graphics g,String teksti, int x, int y ){ //public void paint (Graphics g,String teksti, int x, int y){ g.drawString(teksti, x, y); } //@Override /** * @param args the command line arguments */ // TODO code application logic here public static void main(String[] args) { String pelaajat[] = new String[20]; // Pelaajadata String sanasto[] = new String[800]; // sanastodata String novelli[] = new String[800]; // lopullinen tarina // int a, i, pelaajalkm, kierroslkm; // muuttujia // int kierros, rivi, peluri, vuoro; // muuttujia // int num,sanaind,sarake; // muuttujia String nimi, sana; // muuttujia //Creating the Frame JFrame frame = new JFrame(" + + + WordGame + + + "); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1000, 400); //Creating the MenuBar and adding components JMenuBar mb = new JMenuBar(); JMenu m1 = new JMenu("FILE"); JMenu m2 = new JMenu("Help"); mb.add(m1); mb.add(m2); JMenuItem m11 = new JMenuItem("Open"); JMenuItem m22 = new JMenuItem("Save as"); m1.add(m11); m1.add(m22); //Creating the panel at bottom and adding components JPanel panel = new JPanel(); // the panel is not visible in output JLabel label = new JLabel("Enter Text"); JTextField tf = new JTextField(20); // accepts upto 10 characters JButton send = new JButton("Send"); JButton reset = new JButton("Reset"); panel.add(label); // Components Added using Flow Layout panel.add(label); // Components Added using Flow Layout panel.add(tf); panel.add(send); panel.add(reset); // Text Area at the Center JTextArea ta = new JTextArea(); //Adding Components to the frame. frame.getContentPane().add(BorderLayout.SOUTH, panel); frame.getContentPane().add(BorderLayout.NORTH, mb); frame.getContentPane().add(BorderLayout.CENTER, ta); frame.getContentPane().add(new JavaApplication14()); frame.setVisible(true); frame.addNotify(); Kirjoita("Anna pelaajien lkm.", 10, 10);
Tiedän, että tuosta viimeisestä lausekkeesta puuttuu ne 2 parametria tai ilmeisesti 1. Koska aliohjelmaan vietäisiin 5 parametria, mutta tämä onkin juuri se ongelman ydin.
Swing-käyttöliittymää yksinkertaisesti ei voi toteuttaa tuolla tavalla, että pääohjelmasta piirrettäisiin ympäriinsä. (Pääohjelmaan et saa myöskään syötettä käyttöliittymästä, joten suunnitelmasi on umpikujassa.)
Katso esimerkkejä ja oppaita käyttöliittymäohjelmoinnista. Asiaa on paljon, ja varsinaista oikotietä ei ole.
Jos on välttämätöntä piirtää itse, piirtäminen pitää tehdä paint- ja update-metodeissa, ja käyttöliittymän päivittämiseksi kutsutaan repaint-metodia. Tästä rakenteesta seuraa myös, että piirrettäviä tietoja ei voi suoraan välittää, vaan ne pitää laittaa johonkin sellaiseen muuttujaan, joka on kyseisissä metodeissa nähtävillä.
Itse piirtäminen ei ole yleensä järkevää. Tilanteessasi selvintä olisi varmaankin laittaa teksti JLabel-kenttään ja muokata kyseisen kentän sijaintia ja tekstiä.
Kiitoksia vastauksista. Sitä vähän ajattelinkin, että se taitaa olla se label juttu eräs ratkaisu toteuttaa tämä ;).
Hente
Aihe on jo aika vanha, joten et voi enää vastata siihen.