» »

[Java]Vprašanja

[Java]Vprašanja

BOCo. ::

Ker sem začetnik v Javi imam eno vprašanje za vas kolegi. Uporabljam program NetBeans in zanima me naslednje. Kako povezati dva frame tako, da naprimer ko bi kliknil na MenuItem Administracija, bi ta event klical frame in ga tudi odprl.

Najlepša hvala!

l0g1t3ch ::

recimo da imas tkole

class Okno extend Jframe

potem definiras spremenljivko tipa Okno
Okno o;

potem pa v event metodo dodaj samo še tole
if (o == null)
o = new Okno();

o.setVisible(true);

BOCo. ::

Mogoče kakšen manjši tutorial v NetBeansih? :)

Hvala!

<b>klima</b> ::

Ta problem se da lepo rešit tud z uporabo niti.

Recimo: narediš razred, recimo navodila.java v katerem je pač JFrame in pol kličeš z druzga razreda tko:

private void ButtonNavodilaActionPerformed(java.awt.event.ActionEvent evt) {
//zaženemo nit, v tem primeru zaženemo navodila
(new java.lang.Thread(new Navodila())).start();
}

Samo v tem primeru mora implementirat Runnable

primer:

public class Navodila extends javax.swing.JFrame implements java.lang.Runnable{ //koda
}

LP

morbo ::

^ temu zgoraj jst nebi rekel 'lepa' in še manj 'rešitev'... čemu ustvarjat novo nit le za prikazat okno? Hvalabogu si napisal premalo kode da bi stvar sploh delala...

<b>klima</b> ::

Ja pač vsak ima svoje mnenje...

Kaj misliš da zgornjo kodo kar prekopiraš, skompajlaš in kar dela al kaj???

Če bi se usaj nekaj več časa ukvarjal s programiranjem bi vedel kaj moraš storiti s kodo (oz. jo dopolniti) da bi stvar delovala.

Preber si mal stvari...

Drgač, glede tutoriala očitno izgleda da nisi še slišal za google. Ti sam vpiš not netbeans tutorial in si ti odpre tolk stvari da je že skor težko izbrat.

LP

morbo ::

Torej napiši še implementacijo run() metode da vidimo kako si to predstavljaš in predvsem v čem se bo njena vsebina razlikovala od tistega, kar je napisal l0g1t3ch - razen seveda v temu da je tvoj koncept zakompliciran, nerazumljiv za začetnika, neintuitiven in nevaren - če setup frejma narediš v odzivni metodi dogodka, pomeni da se izvede v event dispatch niti, če pa to postaviš v run() neke nove niti reskiraš nepravilno delovanje. Velika večina metod Swing komponent ni thread-safe.

Threads and Swing

<b>klima</b> ::

Ne bi zdej pisal te implementacije, lahko pa ti pošljem celotni projekt (gre za igro) v kateri je uporabljen zgoraj "zakompliciran, nerazumljiv za začetnika, neintuitiven in nevaren" koncept...

Mogoče boš potem spoznal da ni tako zakompliciran in nerazumljin da o intuitivnosti in nevarnosti sploh ne govorim.

Lahko kar takoj končava to debato, ker ne bova nikamor prišla, torej če hočeš da ti pošljem mi pošlji zasebno sporočilo.

LP

<b>klima</b> ::

Ne bi zdej pisal te implementacije, lahko pa ti pošljem celotni projekt (gre za igro) v kateri je uporabljen zgoraj "zakompliciran, nerazumljiv za začetnika, neintuitiven in nevaren" koncept...

Mogoče boš potem spoznal da ni tako zakompliciran in nerazumljiv da o "intuitivnosti" in nevarnosti sploh ne govorim.

Lahko kar takoj končava to debato, ker ne bova nikamor prišla, torej če hočeš da ti pošljem mi pošlji zasebno sporočilo.

LP

l0g1t3ch ::

Za prikazat eno okno pa res ne rabiš noce niti no. Nova nit za novo okno je samo nepotrebno preseravanje.

morbo ::

Mogoče boš potem spoznal da ni tako zakompliciran in nerazumljin da o intuitivnosti in nevarnosti sploh ne govorim.

S tem ko v metodi odziva na dogodek ustvariš novo nit in v njej ustvariš novo okno, si zadeve neprimerno otežiš. Če v odzivni metodi rabiš sklic na novo okno - kdo ti garantira da bo sploh ustvarjeno kadar boš klical njegove metode? Se splača ukvarjat z morebitno sinhronizacijo? Poleg tega kršiš pravilo enonitnosti Swinga.

Zakaj misliš da se za ustvarjanje oken zunaj event-dispatching niti, priporoča tale idiom:

EventQueue.invokeLater(new Runnable() {
    public void run() {
        new Okno().setVisible(true);
    }
});

V odzivnih metodah dogodkov se komponente ustvari na licu mesta, brez dodatnega kompliciranja - ker se nahajaš v EDT lahko z njimi počneš kar hočeš. Le v primeru da stvarjenje rabi dolgo časa in bi to zaštopalo GUI, bi rabil kak drugačen koncept.

Bela01 ::

Sem že odpravla.

Zgodovina sprememb…

  • spremenila: Bela01 ()

Bela01 ::

Da ne bom na novo odpirala teme. Ali ima kdo kakšen primer o tem kako z miško prestavit kakšno določeno točko. Sama se nekako matram s tem pa ni nekega efekta.

l0g1t3ch ::

ne štekam vprašanja, lahko malo bolj natančno poveš ?

Bela01 ::

Torej: Imaš narisano neko točko oz. kvadratek 2×2. Če klikneš z miško nanj in miško držiš, bi rada da lahko ta kvadratek prestaviš. Kak prebrat koordinate vem. Ne vem pa kako oz. s katero funkcijo izvem, če še uporabnik levi gumbek drži.

morbo ::

To lahko storiš tako da v odzivni metodi 'podrsa' z mišjo primerjaš stanje gumbov z bit masko željenega gumba:

public void mouseDragged(MouseEvent e) {
   int stanje = e.getModifiers();
   if ((stanje & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK) {
      // levi gumb je trenutno pritisnjen
   }
}

PaX_MaN ::

"kvadratek 2×2"
Piksli? Nekam majhen za klikat nanj...

Bela01 ::

Hvala za prejšnji namig.

Spet imam eno vprašanje. Imam 3 radiobuttone in en gumb preveri. Ko klikne uporabnik na gumb preveri bi rada, da se za določen izbrani radiobutton izpiše v določen Panel (v tem primeru resitev) besedilo. Spodaj je del te kode, ki bi naj ugotovila, ali je izbran točno določen gumb, ki pa ne dela oz. napake program ne javi, vendar se ob pritisku na gumb nič ne zgodi.

...
public void itemStateChanged(ItemEvent event) {

AbstractButton source = (AbstractButton) event.getItemSelectable();
if (preveri.isSelected()) {
if (!rgumb[odg].isSelected())
{
odgovor = "Rešitev ni pravilna!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
else {
odgovor = "Odgovor je pravilen!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
}

}

morbo ::

Če preverjaš radiobuttone ob kliku na gumb, potem bi morala bit koda v odzivni metodi klika na gumb. Tam preverjaj kateri gumb je izbran z rbtn.isSelected()

Bela01 ::

Hvala za odgovor, vendar še vedno nekak ne gre oz. ne znam :/. Katera metoda je to? Jaz ustvarim okno v posebej metodi, tam ga sestavim, ... Katera metoda pa potem preverja ta navaden gumb?

Jaz sem pri tem gumbi naredila kar tako:

preveri = new JButton("Preveri");
preveri.addItemListener(this);

in sem zato mislila, da se vse to skupaj preverja v tej itemStateChanged.

Bela01 ::

Sedaj sem malo pogledla one primere v knjigi od Mesojedca (primer GumbJButtonDemo). Tam so za branje akcij na gumba naprej in nazaj ActionListener in potem actionPerformed metodo. Sem tako sedaj tudi jaz naredila, pa ni rezultatov.

Bom dala kar celo kodo (ni še zdaleč ne gotovo, branje iz datoteke še morem nagruntat, pa okno od appleta še morem oblikovat).


import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class Naloge extends JApplet implements ItemListener, ActionListener {

String[] a;
String pres = " ";
String naloga, odgovor;
String[] gumb = new String[3];

int odg = 0;

//ustvarimo gumbe
JRadioButton[] rgumb = new JRadioButton[3];;
JButton preveri, naprej;

Toolkit tool = Toolkit.getDefaultToolkit();
Image slika1 = tool.getImage("naloga1.jpg");

//ustvarimo panelo, ki bo nosila ostale v sebi
JPanel namizje = new JPanel(new BorderLayout());
JPanel namizje1 = new JPanel(new BorderLayout());
JPanel namizje2 = new JPanel(new BorderLayout());
JPanel resitev = new JPanel(new BorderLayout());

//ostale panele
JPanel navodilo = new JPanel(new BorderLayout());
JPanel nosilna = new JPanel(new GridLayout());
JPanel odgovori = new JPanel(new GridLayout(3, 1));
JPanel primeri = new JPanel(new GridLayout());
JPanel gumbi = new JPanel(new GridLayout(1, 2));

public JPanel Izgraditev() {

//panela nosilna bo vsebovala paneli odgovori in primeri
nosilna.add(odgovori);
nosilna.add(primeri);

//nastavimo lege panel v glavni paneli
namizje1.add(navodilo, BorderLayout.NORTH);
namizje1.add(nosilna, BorderLayout.CENTER);
namizje1.add(resitev, BorderLayout.SOUTH);
namizje2.add(gumbi, BorderLayout.SOUTH);
namizje.add(namizje1, BorderLayout.NORTH);
namizje.add(namizje2, BorderLayout.CENTER);

//določimo dimenzije panel
navodilo.setPreferredSize(new Dimension(350, 50));
odgovori.setPreferredSize(new Dimension(200, 250));
primeri.setPreferredSize(new Dimension(200, 250));
resitev.setPreferredSize(new Dimension(350, 50));
gumbi.setPreferredSize(new Dimension(350, 50));

//obrobimo namizje
namizje1.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
namizje2.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));

//panelam nastavimo robove, možna besedila na rob, ...
navodilo.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(5, 0, 5, 0),
BorderFactory.createEtchedBorder()));
nosilna.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(5, 0, 5, 0),
BorderFactory.createEtchedBorder()));
odgovori.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5),
BorderFactory.createTitledBorder(
LineBorder.createGrayLineBorder(),
"Možni odgovori")));
primeri.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5),
BorderFactory.createTitledBorder(
LineBorder.createGrayLineBorder(),
"Slika kot pomoč")));
resitev.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(1, 0, 1, 0),
BorderFactory.createEtchedBorder()));
gumbi.setBorder(
new CompoundBorder(
BorderFactory.createEmptyBorder(1, 0, 1, 0),
BorderFactory.createEtchedBorder()));

//grupa, ki bo združila radiobutone - rgumbe, da bodo sodelovali med seboj
ButtonGroup grupa = new ButtonGroup();

//ustvarimo rgumbe z možnimi odgovori
for (int i = 0; i < 3; i++)
{
rgumb[i] = new JRadioButton(gumb[i]);
rgumb[i].addItemListener(this);
grupa.add(rgumb[i]);
odgovori.add(rgumb[i]);
}

//vstavimo slikico, besedilo v labelo
navodilo.add(new JLabel(pres), BorderLayout.WEST);
navodilo.add(new JLabel(naloga), BorderLayout.CENTER);
Icon ikona = new ImageIcon(slika1);
primeri.add(new JLabel(ikona));
resitev.add(new JLabel(pres), BorderLayout.WEST);

//ustvarimo in vstavimo v labelo gumba preveri in naprej
preveri = new JButton("Preveri");
preveri.addActionListener(this);
gumbi.add(preveri);
naprej = new JButton("Naprej");
naprej.addActionListener(this);
gumbi.add(naprej);

if (preveri.isSelected()) {
if (!rgumb[odg].isSelected())
{
odgovor = "Rešitev ni pravilna!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
else {
odgovor = "Odgovor je pravilen!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
}

return namizje;
}

public static void main(String[] args) {

JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Reševanje nalog");
Naloge app = new Naloge();

// uporabimo drsno površino v primeru premajhnega okna
JScrollPane pane = new JScrollPane(app.Izgraditev());
pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

frame.getContentPane().add(pane, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}

public void init() {

//tu še nekaj pride
main(a);




}

public void itemStateChanged(ItemEvent event) {

}

public void actionPerformed(ActionEvent event) {

if (preveri.isSelected()) {
if (!rgumb[odg].isSelected())
{
odgovor = "Rešitev ni pravilna!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
else {
odgovor = "Odgovor je pravilen!";
resitev.add(new JLabel(odgovor), BorderLayout.CENTER);
}
}
}
}

Zgodovina sprememb…

  • spremenila: Bela01 ()

Bela01 ::

Eno vprašanje še glede izpisa na forumu. Kako naredim, da se bodo pri izpisu kode upoštevali tabulatorji, ker sedaj je vse skupaj izpisano v eni "črevi" in je rahlo nepregledno?

morbo ::

Mislim da gumbi (JButton) ne šlivijo ItemListenerja. Naredi tako:

JButton preveri = new JButton("Preveri");
preveri.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      // odziv na klik
   }
});

kodo formatiraš tako

Bela01 ::

Nisem pogledla odgovora. Bom poskusla tako.

Zgodovina sprememb…

  • spremenila: Bela01 ()

Bela01 ::

Hm, in kje naj to vstavim?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[java]problem z Throws

Oddelek: Programiranje
221503 (1032) killa bee
»

[Java] Ne zažene appleta

Oddelek: Programiranje
51137 (1070) iggy
»

[Java] Zagon appleta v HTML

Oddelek: Programiranje
161441 (1263) Bela01
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242285 (1920) Bela01
»

[Java] Deljenje in ostanek

Oddelek: Programiranje
142916 (2500) pr2501

Več podobnih tem