Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Graafinen teksti frameen

Hente [16.01.2020 11:57:28]

#

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

vesikuusi [16.01.2020 22:19:47]

#

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.

Metabolix [17.01.2020 01:28:02]

#

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.

Hente [17.01.2020 13:29:58]

#

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.

Metabolix [17.01.2020 15:48:48]

#

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ä.

Hente [18.01.2020 09:19:46]

#

Kiitoksia vastauksista. Sitä vähän ajattelinkin, että se taitaa olla se label juttu eräs ratkaisu toteuttaa tämä ;).
Hente

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta