Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Čau, lidi. Potřeboval bych vědět jak můžu přidat KeyListener celé aplikaci, ale výstup z KeyListeneru chci jen do jednoho componentu, kterej sem si vytvořil.

Když sem přidal Keylistener do hlavní třídy, tak to nic nedělalo a když jsem si vytvořil novej JPanel, do kterýho sem vložil všechny komponenty, a přidal jsem mu KeyListener, tak to taky nedělalo nic.

Už mi došli nápady, jak by se to dalo řešit, tak jsem napsal sem.

Díky za každou radu.

Odpovědět 18.12.2014 11:52
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Prosím odpovíte někdo?

Nahoru Odpovědět 18.12.2014 17:37
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
Odpovídá na Tomhaus
mara:

prosimtě ukaž zdrojový kód, jak to zatím máš.

Nahoru Odpovědět 18.12.2014 17:58
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:

Ahoj mohlo by to být třeba takto :

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication9;

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class JavaApplication9 {
    public static JLabel lab;
    public static String s = "";
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(640, 480));
        frame.setFocusable(true);
        lab = new JLabel();
        frame.add(lab);
        frame.addKeyListener(new KeyListener(){

            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("zmackl jsi tlacitko" + e.getKeyChar());
                s += String.valueOf(e.getKeyChar()).toString();
                lab.setText(s);
            }

            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("zmackl jsi tlacitko");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("pustil jsi klavesu" + e.getKeyChar());
            }

        });
        frame.pack();




        // TODO code application logic here
    }
}

snad to pomůže
EDIT: Tomhaus zapomněl jsem ti dát odpovědět

Editováno 18.12.2014 18:12
Nahoru Odpovědět 18.12.2014 18:11
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Asi nějak takhle:
Hlavní třída:

public class Frame extends JFrame {
  private GridBagConstraints g;
  private Screen s;

  private JPanel pan01;

  public Frame(){
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setTitle("Násobení matic");
   setResizable(false);
   addKeyListener(new Key());

   init();
  }

  public void init(){
   setLayout(new GridBagLayout());
   g = new GridBagConstraints();

   s = new Screen(); //moje vlastní třída
   g.gridx = 1;
   g.gridy = 0;
   add(s, g);

   pan01 = new JPanel(); //do tohohlepanelu mam přidaný ještě jiný komponenty, ale to není důležitý
   g.gridx = 0;
   g.gridy = 0;
   add(pan01, g);

   pack();

   setLocationRelativeTo(null);
   setVisible(true);
  }

  private class Key implements KeyListener {
    public void keyPressed(KeyEvent arg0) {
        System.out.println("PRESSED");
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
  }

  public static void main(String[] args){
        new Frame();
  }

}

podle mě to mam dobře, ale přesto mi to při zmáčknutí jakýhokoli tlačítka nic nevypisuje.

Editováno 18.12.2014 18:15
Nahoru Odpovědět 18.12.2014 18:12
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
Odpovídá na Tomhaus
mara:

Nenastavil jsi mu focusable na true

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 18.12.2014 18:18
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Nahoru Odpovědět 18.12.2014 18:22
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

No jo, ale když kliknu na nějaký tlačítko v tom panelu, tak to zase nefunguje.
Focusable je nastavenej v Frame, takže ho mam přidat do každýho tlačítka, aby se po zmáčknutí nejprve provedl úkon a pak se tlačítko jakoby "odkliklo" (aby okolo něj nebyl ten rámeček)?

Editováno 18.12.2014 18:27
Nahoru Odpovědět 18.12.2014 18:27
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
Nahoru Odpovědět 18.12.2014 18:27
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:

Nevím, jak se to dá udělat nějak lepší, ale zkus všem komponentům přidat fucusable a ten keyListener.

Nahoru Odpovědět 18.12.2014 18:32
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

já bych řekl, že když přidam tlačítku focusable do ActionListeneru, tak se po zmáčknutí tlačítka to tlačítko jakoby odrámečkuje a že KeyListener přídávat všem komponentám není potřeba

Nahoru Odpovědět 18.12.2014 18:36
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
Odpovídá na Tomhaus
mara:

Tak to zkus a uvidíš.

Nahoru Odpovědět 18.12.2014 18:37
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

No asi to zkusim tak jak říkáš, protože mě to jen s Focusablem nejde :)

Nahoru Odpovědět 18.12.2014 18:39
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

mam ještě jeden dotaz a nechce se mi zakládat novou diskuzi:

když mam pole o velikosti, která se mění s jinou hodnotou, a mam v něm uložený čísla (jakýkoli, třeba do 5ti). A já potřebuju podmínku, aby se nespustila jedna metoda, když se jakýkoli číslo z toho pole bude rovnat třeba 2. Když vytořim for loop

for(int i = 0; i < pole.lenght; i++){
if(pole[i] != 2){ udelejNeco();}
}

tak se mi ta metoda provede jen pro ty hodnoty pole, které se nerovnají 2.

Poradíte někdo?

Nahoru Odpovědět 18.12.2014 19:50
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Tomhaus
Lukáš Křehula:

Jestli jsem tě dobře pochopil, tak tohle by ti mělo pomoct:

continue;

Skočí zpět na cyklus.

 
Nahoru Odpovědět 18.12.2014 19:54
Avatar
mara
Člen
Avatar
mara:

Zkus třeba toto:

public static void main(String[] args) {
    int[] poleint = new int[5];
    poleint[0] = 4;
    poleint[1] = 2;
    poleint[2] = 1;
    poleint[3] = 5;
    poleint[4] = 8;
    for(int i : poleint){
        if (i == 2){
            metoda();
        }
    }
}

EDIT: Tomhaus promin vzdycky zapomenu dát odpovědět

Editováno 18.12.2014 20:17
Nahoru Odpovědět 18.12.2014 20:15
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Odpovídá na Lukáš Křehula
Tomhaus:

já, ale potřebuju: Když se bude jakýkoli číslo z toho pole rovnat třeba číslu 2, tak aby se nespustila jiná metoda (pracuje s těmi čísli v poli) pro všechny čísla v tom poli.

Nahoru Odpovědět 18.12.2014 20:16
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

To by (asi) šlo :) zkusim to hned

Nahoru Odpovědět 18.12.2014 20:17
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
mara:

tak co třeba toto :

public static void main(String[] args) {
    boolean podminka = true;
    int[] poleint = new int[5];
    poleint[0] = 4;
    poleint[1] = 2;
    poleint[2] = 1;
    poleint[3] = 5;
    poleint[4] = 8;
    for(int i : poleint){
        if (i == 2){
            podminka = false;
        }
    }
    if(podminka == true){
        metoda()
    }
}
Nahoru Odpovědět 18.12.2014 20:20
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
mara:

Nějak to furt nechápu zkus to prosím trochu líp popsat, ať zbytečně nevypisuji spoustu kódu, který ti je k ničemu.

Nahoru Odpovědět 18.12.2014 20:22
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

ještě sem zapomněl dodat, že to pole je tvořený z jiné třídy, kde mam getter getValue()
A ten getter se rovná tomu číslu na té pozici.

Trošku sem se v tom zamotal, tak nevim.

Nahoru Odpovědět 18.12.2014 20:31
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
mara
Člen
Avatar
Odpovídá na Tomhaus
mara:

Prosimtě zkus mně prosím trochu popsat, co v jakých třídách máš a co potřebuješ, aby to dělalo. Teď vůbec nevím. Nebo dej mi sem celý kód, a já se ti ho pokusím upravít.

Nahoru Odpovědět 18.12.2014 20:36
Co na srdci, to na Facebooku
Avatar
Tomhaus
Člen
Avatar
Odpovídá na mara
Tomhaus:

přidam kód:
třída GNumbers:

public class GNumbers {
        private int xCoor, yCoor, value;

        public GNumbers(int xCoor, int yCoor, int value){
                this.xCoor = xCoor;
                this.yCoor = yCoor;
                this.value = value;
        }

        public int getxCoor() {
                return xCoor;
        }

        public void setxCoor(int xCoor) {
                this.xCoor = xCoor;
        }

        public int getyCoor() {
                return yCoor;
        }

        public void setyCoor(int yCoor) {
                this.yCoor = yCoor;
        }

        public int getValue() {
                return value;
        }

        public void setValue(int value) {
                this.value = value;
        }
}

pak sem tuhle třídu vložil do pole:

private GNumbers[] ucoors;

jinde to pole nastavim:

ucoors = new GNumbers[a];

,kde to a je ta měnící se velikost pole

pak mam arraylist té třídy GNumbers:

private final ArrayList<GNumbers> uvalues = new ArrayList<GNumbers>();

a tam, kde sem to pole nastavil, taky přidávam pozicím v poli ty hodnoty v tom arraylistu:

int index = 0;
                for(int i = 0; i < a; i++){
                        ucoors[i] = uvalues.get(index);
                        index++;
                }

Tak snad vám to stačí :D

Jinak tu otázku máte někde nad tímto příspěvkem :D

Editováno 18.12.2014 20:48
Nahoru Odpovědět 18.12.2014 20:46
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Pomůže prosím někdo?

Nahoru Odpovědět 19.12.2014 13:34
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Tomhaus
Člen
Avatar
Tomhaus:

Přišel jsem na to sice nezvyklým způsobem, ale mam, co jsem potřeboval. :D

Nahoru Odpovědět 19.12.2014 15:33
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.