KeyListener przestał działać, pojęcie nie mam z jakiego powodu...

0

Witam,
Jakiś czas temu zaimplementowałem w swoim kodzie KeyListener, działał elegancko bez problemu, jednak dziś ze zdziwieniem odkryłem że przestał działać, po prostu nie wyłapuje dosłowni nic. Niestety nie mam pojęcia jak mógłbym sprawdzić czym to jest spowodowane, bo nie zauważyłem kiedy przestało działać...
w konstruktorze dodaję Listener w ten sposób:

frame.addKeyListener(this);

a frame to główne okno.
Kod jest dość długi i nie sądzę żeby komuś chciało się go czytać, ale jeśli tak to proszę napisać, wstawię go.
Nie wiem dlaczego to nie działa skoro działało. :/
Z góry dziękuję za rady i pozdrawiam.

0

bardzo mało informacji w poście zamieściłeś. Najprawdopodobniej Twój frame traci focusa na rzecz innego obiektu, a żeby jego listener 'działał', musi być on aktywny.

0

Nie wykluczam żadnej możliwości, jest możliwość sprawdzić jaki element w danej chwili posiada focus?
EDIT: zrobiłem przycisk który po wciśnięciu wywołuje funkcję frame.isFocused() która zwraca wartość true.

0

Powodów, z których to działa inaczej niż chcesz, może być mnóstwo :). Bez kodu nikt tutaj bardziej nie pomoże.

0

W takim razie wstawię tu ten kod.

public class MainPanel extends JPanel implements MouseListener,
		MouseMotionListener, KeyListener, ActionListener {
	private SkeletonEdit skeletonEdit;
	private Joint hoveredJoint;
	private Joint selectedJoint;
	private int mouseButton = 0;
	private int mouseX = 0;
	private int mouseY = 0;
	private MainFrame frame;
	private JToolBar animBar = new JToolBar();
	JComboBox animCombo = new JComboBox();
	JComboBox keyCombo = new JComboBox();

	public MainPanel(MainFrame mainFrame) {
		super();
		frame = mainFrame;
		addMouseListener(this);
		addMouseMotionListener(this);
		frame.addKeyListener(this);

		skeletonEdit = new SkeletonEdit(this.frame.getWidth() / 2,
				this.frame.getHeight() / 2, 1.0f, this);
		skeletonEdit.newSkeleton();
	}

	public SkeletonEdit getSkeletonEdit() {
		return skeletonEdit;
	}

	public void hoverJoint(Joint pHover) {
		if (hoveredJoint != null) {
			hoveredJoint.setHovered(false);
		}
		hoveredJoint = pHover;
		if (hoveredJoint != null) {
			hoveredJoint.setHovered(true);
		}
	}

	public void selectJoint(Joint pSelect) {
		if (selectedJoint != null) {
			selectedJoint.setSelected(false);
		}
		selectedJoint = pSelect;
		if (selectedJoint != null) {
			selectedJoint.setSelected(true);
		}
	}

	public void newFile() {
		skeletonEdit.newSkeleton();
		repaint();

	}

	public void updateToolBars() {
		int animComboIndex = animCombo.getSelectedIndex();
		int keyComboIndex = keyCombo.getSelectedIndex();
		animCombo.removeAllItems();
		keyCombo.removeAllItems();
		for (Animation anim : skeletonEdit.getSkeleton().getAnimations()) {
			animCombo.addItem(anim.getName());
		}
		if (getSelectedAnim() != null) {
			for (int i = 0; i < this.getSelectedAnim().getKeyframes().size(); ++i) {
				keyCombo.addItem(i);
			}
		}
		if (animComboIndex < animCombo.getItemCount()) {
			animCombo.setSelectedIndex(animComboIndex);
		}
		if (keyComboIndex < keyCombo.getItemCount()) {
			keyCombo.setSelectedIndex(keyComboIndex);
		}
		System.out.println(frame.isFocused());
	}

	public Animation getSelectedAnim() {
		Animation anim = skeletonEdit.getSkeleton().getAnimation(
				(String) animCombo.getSelectedItem());
		return anim;
	}

	@Override
	public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		if (keyCode == 127 && selectedJoint != null) {
			skeletonEdit.deleteJoint(selectedJoint);
		}
		System.out.println("Keypressed");
	}

	@Override
	public void keyReleased(KeyEvent e) {

	}

	@Override
	public void keyTyped(KeyEvent e) {

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		Joint clickedJoint = skeletonEdit.getMouseJoint(e.getX(), e.getY());
		switch (e.getModifiers()) {
		case InputEvent.BUTTON1_MASK: {
			selectJoint(clickedJoint);
			break;
		}
		case InputEvent.BUTTON2_MASK: {
			System.out.println("click");
			if (clickedJoint == null && selectedJoint != null) {
				skeletonEdit.createBone(e.getX(), e.getY(),
						selectedJoint.getBone());
			}
			break;
		}
		case InputEvent.BUTTON3_MASK: {
			break;
		}
		}
		repaint();
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		switch (mouseButton) {
		case 1:
			break;
		case 2:
			skeletonEdit.dragView(e.getX() - mouseX, e.getY() - mouseY);
			mouseX = e.getX();
			mouseY = e.getY();
			break;
		case 3:
			if (hoveredJoint != null) {
				skeletonEdit
						.jointDragPosition(e.getX(), e.getY(), hoveredJoint);
			}
			break;
		}
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		hoverJoint(skeletonEdit.getMouseJoint(e.getX(), e.getY()));
		repaint();
	}

	@Override
	public void mousePressed(MouseEvent e) {
		mouseX = e.getX();
		mouseY = e.getY();
		switch (e.getModifiers()) {
		case InputEvent.BUTTON1_MASK: {
			mouseButton = 1;
			break;
		}
		case InputEvent.BUTTON2_MASK: {
			mouseButton = 2;
			break;
		}
		case InputEvent.BUTTON3_MASK: {
			mouseButton = 3;
			break;
		}
		}
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		mouseButton = 0;

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if (command.equals("addAnim")) {
			skeletonEdit.newAnimation();
		} else if (command.equals("addKey") && getSelectedAnim() != null) {
			getSelectedAnim().newKeyframe();
		}
		updateToolBars();
		if (command.equals("addAnim")) {
			animCombo.setSelectedItem(animCombo.getItemAt(animCombo
					.getItemCount() - 1));
		} else if (command.equals("addKey") && getSelectedAnim() != null) {
			keyCombo.setSelectedItem(keyCombo.getItemAt(keyCombo.getItemCount() - 1));
		}

		if (e.getSource().equals(animCombo)) {
		}
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		skeletonEdit.drawSkeleton(g);

	}

}
0

przydałby się jeszcze kod klasy MainFrame

0

Oto on:

public class MainFrame extends JFrame implements ActionListener {
	private FileManager fileManager;
	private MainPanel panel;
	private JButton modeButton1;
	private JButton modeButton2;
	private Border etched = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(1,1,1,1), BorderFactory.createEtchedBorder());
	private Border green = BorderFactory.createLineBorder(Color.green);

	public MainFrame(FileManager pManager) {
		super();
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		fileManager = pManager;
		initialize();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();

		if (command.equals("Quit")) {
			System.exit(0);
		} else if (command.equals("Open")) {
			Skeleton skeleton = fileManager.showOpenSkeletonDialog();
			if (skeleton != null) {
				panel.getSkeletonEdit().unloadSkeleton();
				panel.getSkeletonEdit().loadSkeleton(skeleton);
				panel.repaint();
			}
			updateTitle();
		} else if (command.equals("Save")) {
			// Save menu item action
			System.out.println("Save menu item clicked");
		} else if (command.equals("Save as")) {
			fileManager.showSaveSkeletonDialog(panel.getSkeletonEdit()
					.getSkeleton());
			updateTitle();
		} else if (command.equals("Close")) {
			panel.getSkeletonEdit().unloadSkeleton();
			fileManager.clearFilename();
			updateTitle();
		} else if (command.equals("New")) {
			panel.getSkeletonEdit().unloadSkeleton();
			fileManager.clearFilename();
			updateTitle();
			panel.newFile();
		} else if (command.equals("edit")) {
			panel.getSkeletonEdit().setMode(0);
			modeButton1.setBorder(BorderFactory.createCompoundBorder(green, BorderFactory.createEtchedBorder()));
			modeButton2.setBorder(etched);
		} else if (command.equals("animate")) {
			panel.getSkeletonEdit().setMode(1);
			modeButton2.setBorder(BorderFactory.createCompoundBorder(green, BorderFactory.createEtchedBorder()));
			modeButton1.setBorder(etched);
		}

	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setTitle("Editor");
		JMenu menu = new JMenu("File");
		menu.add(makeMenuItem("New"));
		menu.add(makeMenuItem("Open"));
		menu.add(makeMenuItem("Save"));
		menu.add(makeMenuItem("Save as"));
		menu.add(makeMenuItem("Close"));
		menu.add(makeMenuItem("Quit"));

		JToolBar toolbar = new JToolBar();
		modeButton1 = makeToolbarButton("edit", "Edit Skeleton");
		modeButton2 = makeToolbarButton("animate", "Animate Skeleton");
		toolbar.add(modeButton1);
		toolbar.add(modeButton2);

		// Add JMenu bar
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(menu);
		setJMenuBar(menuBar);
		setSize(300, 300);
		setLocation(200, 200);
		this.add(toolbar, BorderLayout.PAGE_START);
		setVisible(true);
		panel = new MainPanel(this);
		this.add(panel);
	}

	private JMenuItem makeMenuItem(String name) {
		JMenuItem m = new JMenuItem(name);
		m.addActionListener(this);
		return m;
	}

	private JButton makeToolbarButton(String command, String toolTipText) {
		JButton button = new JButton();
		String imgLocation = "images/" + command + ".png";
		Image image = null;
		try {
			// Read from a file
			File sourceimage = new File(imgLocation);
			image = ImageIO.read(sourceimage);
		} catch (IOException e) {
		}
		button.setActionCommand(command);
		button.setToolTipText(toolTipText);
		button.setBorder(etched);
		button.addActionListener(this);

		if (image != null) { // image found
			int type = BufferedImage.TYPE_INT_ARGB;
			BufferedImage dst = new BufferedImage(50, 50, type);
			Graphics2D g2 = dst.createGraphics();
			g2.drawImage(image, 0, 0, 50, 50, this);
			g2.dispose();
			button.setIcon(new ImageIcon(dst));
		} else { // no image found
			button.setText(command);
			System.err.println("Resource not found: " + imgLocation);
		}
		return button;
	}

	private void updateTitle() {
		String filename = fileManager.getFilename();
		if (filename != null) {
			this.setTitle("Editor (" + filename + ")");
		} else {
			this.setTitle("Editor");
		}
	} 

EDIT: Właśnie wpadłem na to że wykomentowanie wszystkich toolbarów przywraca listener do życia. W jaki sposób mogę używać i jednego i drugiego?

1

Możesz spróbować podpiąć keylistenera nie do frame'a, tylko do toolbarów. Może one w jakiś sposób focusa zabierają z frame'a.

0

Wygląda na to że problemem nie jest sam toolbar a dwa przyciski "modeButton"(klasa MainFrame)... Nie bardzo jestem w stanie stwierdzić dlaczego...
EDIT: Ha! nareszcie odkryłem co jest na rzeczy, faktycznie przyciski zabierają focus (Dzięki Billy. ;)), rozwiązałem to dodając button.setFocusable(false); ^^

1 użytkowników online, w tym zalogowanych: 0, gości: 1