Jak rozróżnić p w ActionListener, z którego submenu została wybrana opcja??

0

Hej!

Dostałem na Uczelni zadanie napisania prostego edytora tekstów, Gdzie w menu opcje posiadam submenu a w nim kolejne submenu. Z tą sekcją nie było problemu z napisaniem. Problem Pokazał się gdy do drugiego poziomu wcięcia dopisałe idętycnie nazywające się przyciski np:

Option > Forgroud  > Blue
Option > Backroud  > Blue

Tu niestety na potkałem problem natury jak rozróżnić który przycisk został wciśnięty, z którego podmenu wybrałem opcje Blue ????

W załącznikach macie screen jak to wygląda, a poniżej kod budujący Menu.

private Component createOptionMenu() {
		JMenu jmenuEdit = new JMenu(menuOptions);
		jmenuEdit.setMnemonic(KeyEvent.VK_O);

		JMenu jmenuEditForeGround = new JMenu("Forgeground");
		JMenu jmenuEditBackground = new JMenu("Background");
		JMenu jmenuEditFontSize = new JMenu("Font size");

		getEditMenuItemsColors(jmenuEditBackground, 10, 10);
		getEditMenuItemsColors(jmenuEditForeGround, 10, 10);
		getEditMenuItemsFonts(jmenuEditFontSize);

		jmenuEdit.add(jmenuEditForeGround);
		jmenuEdit.add(jmenuEditBackground);
		jmenuEdit.add(jmenuEditFontSize);
		return jmenuEdit;
	}

private JMenuItem getEditMenuItemsColors(JMenuItem jmenuitem, int w, int h) {
		Color [] colors =  { Color.BLUE, Color.YELLOW, Color.ORANGE, Color.RED,Color.WHITE,Color.BLACK,Color.GREEN };
		String [] strColors = { "Blue", "Yellow", "Orange", "Red", "White", "Black", "Green" };
		
		for (int i = 0; i < strColors.length; i++) {
			JMenuItem jmi = new JMenuItem();
			jmi.setText(strColors[i]);
			jmi.setIcon(new ColorIcons(w, h, colors[i]));
			jmi.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					
				}
			});
			jmenuitem.add(jmi);
		}

		return jmenuitem;
	}
0

Jakbyś zrobił to porządnie, to byś takich problemów nie miał.
Po co stosujesz tutaj te anonimy? Dla każdego przycisku czy listenera stwórz własny typ.

0
Brunatny Kret napisał(a):

Jakbyś zrobił to porządnie, to byś takich problemów nie miał.
Po co stosujesz tutaj te anonimy? Dla każdego przycisku czy listenera stwórz własny typ.

Jak dobrze Cię rozumiem to po prostu mam napisać tak:
dla submenu Forground:

JMenuItem item1 = new JMenuItem("Blue", new ColorIcons(w, h, Color.BLUE));
		item1.addActionListener(new ForgroundActionListener());
		
		jmenuForground.add(item1);

Dla Podmenu Background:

JMenuItem item1 = new JMenuItem("Blue", new ColorIcons(w, h, Color.BLUE));
		item1.addActionListener(new BackgroundActionListener());
		
		jmenuBackgroiund.add(item1);

zgadza się???

0

Zgadza się

Pewnie można byłoby to zrobić o wiele lepiej, no ale z czasem nabędziesz skillsów w projektowaniu

0

Wszystkiego nie przewidzisz.
Jak stanąłeś przed takim problemem, to powinna się Tobie zapalić lampka, że być może powinieneś szukać innego rozwiązania, przemyśleć to jeszcze raz.
Nie upieraj się przy jednym słusznym rozwiązaniu.
Zobacz, że Twój projekt stanął przez taką pierdołę : D

0

xxxxxxx

0

Dzięki, troszkę się wyjaśniło :D

Ale się zatrzymałem na kolejnym problemie. Co prubuję dostać sie do JtextField i go odświeżyć z listenera to mam do niego dostęp tylko jak jest static ;)

package zad2;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextArea;
import javax.swing.JTextField;


public class BackgroundActionListener implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();


		if (s.equals("Blue")) {
			jTextArea.setBackground(Color.BLUE);
			jTextArea.repaint();
		}
		if (s.equals("Yellow")) {
			jTextArea.setBackground((Color.YELLOW));
			jTextArea.repaint();
		}
		if (s.equals("Orange")) {
			jTextArea.setBackground((Color.ORANGE));
			jTextArea.repaint();
		}
		if (s.equals("Red")) {
			jTextArea.setBackground((Color.RED));
			jTextArea.repaint();
		}
		if (s.equals("White")) {
			jTextArea.setBackground((Color.WHITE));
			jTextArea.repaint();
		}
		if (s.equals("Black")) {
			jTextArea.setBackground((Color.BLACK));
			jTextArea.repaint();
		}
		if (s.equals("Green")) {
			jTextArea.setBackground((Color.GREEN));
			jTextArea.repaint();
		}
	}
}

package zad2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import oracle.jrockit.jfr.events.DynamicValueDescriptor;

public class SampeTextEditor {
	/**
	 * 
	 */
	private JTextArea textArea;
	private JFrame jFrame;
	private JScrollPane spane;

	/*
	 * Wywołanie okna programu
	 */
	public SampeTextEditor() {
		init();
	}
	
	private void init(){
		jFrame = new JFrame();
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setLayout(new BorderLayout());

		jFrame.add(createNavigationBar(), BorderLayout.PAGE_START);
		jFrame.add(createTextArena(), BorderLayout.CENTER);
		jFrame.getContentPane().add(createTextArena(), BorderLayout.CENTER);

		jFrame.setPreferredSize(new Dimension(800, 600));
		jFrame.pack();
		jFrame.setVisible(true);
		jFrame.setLocationRelativeTo(null);
	}

	/*
	 * Tworzy pole do uzupełniania
	 */
	private Component createTextArena() {
		textArea = new JTextArea("Aby wczytać plik wybierz: File > Open");
		spane = new JScrollPane(textArea);
		return spane;
	}

	protected Component createNavigationBar() {
		MenuBar mb = new MenuBar();
		return mb;
	}

	public JTextArea getTextArea() {
		return textArea;
	}
	
}


0

Coś mi się niechcący źle kliknęło...

Zatem się powtórzę:

Dzięki, troszkę się wyjaśniło :D

Ale się zatrzymałem na kolejnym problemie. Co próbuje dostać się do JtextField i go odświeżyć go z poziomu listenera to okazuje się że nie mam do niego dostępu.
Czego nie widzę lub źle się odowłuję???

package zad2;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextArea;
import javax.swing.JTextField;


public class BackgroundActionListener implements ActionListener {
	@Override
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		JTextArea jTextArea = (JTextArea) e.getSource();
		
		if (s.equals("Blue")) {
			jTextArea.setBackground(Color.BLUE);
			jTextArea.repaint();
		}
		if (s.equals("Yellow")) {
			jTextArea.setBackground((Color.YELLOW));
			jTextArea.repaint();
		}
		if (s.equals("Orange")) {
			jTextArea.setBackground((Color.ORANGE));
			jTextArea.repaint();
		}
		if (s.equals("Red")) {
			jTextArea.setBackground((Color.RED));
			jTextArea.repaint();
		}
		if (s.equals("White")) {
			jTextArea.setBackground((Color.WHITE));
			jTextArea.repaint();
		}
		if (s.equals("Black")) {
			jTextArea.setBackground((Color.BLACK));
			jTextArea.repaint();
		}
		if (s.equals("Green")) {
			jTextArea.setBackground((Color.GREEN));
			jTextArea.repaint();
		}
	}
}

package zad2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import oracle.jrockit.jfr.events.DynamicValueDescriptor;

public class SampeTextEditor {
	/**
	 * 
	 */
	private JTextArea textArea;
	private JFrame jFrame;
	private JScrollPane spane;

	/*
	 * Wywołanie okna programu
	 */
	public SampeTextEditor() {
		init();
	}
	
	private void init(){
		jFrame = new JFrame();
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setLayout(new BorderLayout());

		jFrame.add(createNavigationBar(), BorderLayout.PAGE_START);
		jFrame.add(createTextArena(), BorderLayout.CENTER);
		jFrame.getContentPane().add(createTextArena(), BorderLayout.CENTER);

		jFrame.setPreferredSize(new Dimension(800, 600));
		jFrame.pack();
		jFrame.setVisible(true);
		jFrame.setLocationRelativeTo(null);
	}

	/*
	 * Tworzy pole do uzupełniania
	 */
	private Component createTextArena() {
		textArea = new JTextArea("Aby wczytać plik wybierz: File > Open");
		spane = new JScrollPane(textArea);
		return spane;
	}

	protected Component createNavigationBar() {
		MenuBar mb = new MenuBar();
		return mb;
	}

	
public JTextArea getTextArea() {
		return textArea;
	}
	
}

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