Diskuze: KeyListener
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 25 zpráv z 25.
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
Nenastavil jsi mu focusable na true
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)?
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
No asi to zkusim tak jak říkáš, protože mě to jen s Focusablem nejde
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?
Jestli jsem tě dobře pochopil, tak tohle by ti mělo pomoct:
continue;
Skočí zpět na cyklus.
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
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.
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()
}
}
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.
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.
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čí
Jinak tu otázku máte někde nad tímto příspěvkem
Zobrazeno 25 zpráv z 25.