JPopupMenu Problem und Tipp zu mouse/key

Status
Nicht offen für weitere Antworten.

virtualAudio

Aktives Mitglied
Hi Leute,

mal wieder ein kleines Kskb.

Zwei Dinge die ich nicht ganz hinbekomme.

1.) wenn man das Fenster maximiert bevor man das popupmenu das erste Mal aufruft...gibt es kein pupup sondern Buttons auf dem Fentser bzw. dem JPanel... keine Ahnung warum, vielleicht hat jemand einen Tipp!?

2.) solange man die Alt-Taste drückt wird an der Stelle des Cursors ein blauer Strich gezeichnet. Ich verstehe nicht warum dieser Strich beim Auslassen der Taste nicht immer gleich weg ist. Eigentlich sollte die boolean altpressed auf false gesetzt werden und dann paintImmediately() ausgeführt werden. In der paintComponent() wird diese Linie, wenn altpressed=false, nicht gezeichnet. Sollte also weg sein sobald paintImmediately() ausgeführt wurde.

Der Code:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;


public class kskb_popup extends JFrame implements KeyListener{

	JPopupMenu popUpM;
	Pane pane;
	boolean altpressed;
	
	class Pane extends JPanel{
		int mausX, mausY;

		public Pane(){
		}
		public void paintComponent(Graphics g){

			// Grösse des JPanels an die möglichweise veränderte Fenstergrösse anpassen
			setSize(this.getParent().getWidth()-this.getParent().getInsets().left-this.getParent().getInsets().right,
					this.getParent().getHeight()-this.getParent().getInsets().top-this.getParent().getInsets().bottom);
			super.paintComponents(g);
			g.setColor(Color.blue);
			// immer zeichnen
			g.drawRect(0,0,this.getParent().getWidth()-this.getParent().getInsets().left-this.getParent().getInsets().right,
					this.getParent().getHeight()-this.getParent().getInsets().top-this.getParent().getInsets().bottom);
			// nur zeichnen wenn alt gedrückt wird
			if (altpressed)g.drawLine(mausX,0,mausX,getHeight()); 
		}
	}
	
	
	
	//Konstruktor
	public kskb_popup(){
		
		setLocation(0,0);
		setSize(300, 150);
		setVisible(true);
		//addWindowListener(this);
		addKeyListener(this);
		pane = new Pane();
		pane.setLocation(0,0);
		pane.setSize((getWidth()-getInsets().left)-getInsets().right,(getHeight()-getInsets().top)-getInsets().bottom);
		getContentPane().add(pane);	

		popUpM = new JPopupMenu();
	    getContentPane().add(popUpM); 
	    JMenuItem[] jmi = new JMenuItem[5];
	    ActionListener al_fake = new ActionListener(){
	    	public void actionPerformed(ActionEvent e){
	    		popUpM.setVisible(false);
	    	}
	    };
	    for (int i=0;i<5;i++){
	    	jmi[i]=new JMenuItem("Test " + i);
	    	jmi[i].addActionListener(al_fake);
	    	popUpM.add(jmi[i]);
	    }
	    
		addMouseMotionListener(new MouseMotionListener(){
			public void mouseDragged(MouseEvent e) {
			}
			public void mouseMoved(MouseEvent e) {
				pane.mausX = (int)e.getPoint().getX()-getInsets().left;
				repaint();
			}
		});

		addMouseListener(new MouseListener(){
			public void mouseClicked (MouseEvent e ){			}
			public void mousePressed (MouseEvent e ){} 
			public void mouseEntered (MouseEvent e ){}
			public void mouseExited  (MouseEvent e ){}
			public void mouseReleased(MouseEvent e ){
				if (e.isPopupTrigger()){
					popUpM.setLocation(getLocation().x+e.getX(),getLocation().y+e.getY());
					popUpM.setVisible(true);
				}
			} 
		});

	}
	// 	Konstruktor-Ende
	
	
	public static void main(String[] args) {
	
		new kskb_popup();
	
	}

	public void keyTyped(KeyEvent e){}
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_ALT){altpressed = true;}
		System.out.println("pressed");
		pane.paintImmediately(pane.getX(),pane.getY(),pane.getWidth(),pane.getHeight());
	}
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_ALT){altpressed = false;}
		System.out.println("released");
		pane.paintImmediately(pane.getX(),pane.getY(),pane.getWidth(),pane.getHeight());
	}
}


Danke für Eure Hilfe. Bei Fragen...nicht schüchtern sein :wink:

Beste Grüße
Andi
 
1. Dies muss weg: getContentPane().add(popUpM);

2. Versuch's mal mit pane.repaint() statt pane.paintImmediately(..)
 
Hi André und danke wiedermal!!


Kannst Du es mir vielleicht noch erklären?

bei 1 versteh ich vor allem nicht, warum erst nach einer maximierung des Fensters dieses Problem entsteht.

bei 2: da weiß ich nicht was ich gemacht habe. Hab ja wie immer repaint() verwendet und nur deshalb geändert weil es nicht geklappt hat. Da hab ich vermutlich danach noch etwas anderes umgeschrieben. jetzt geht es jedenfalls mal ausreichend gut :toll:

Danke und guuhs aus Wien
Andi
 
virtualAudio hat gesagt.:
..bei 1 versteh ich vor allem nicht, warum erst nach einer maximierung des Fensters dieses Problem entsteht.
Weil du setVisible(true) ziemlich am Anfang des Konstruktors machst, greifen die folgenden Komponenten
erst nach einem validate(). Wenn du die Fenstergrösse änderst wird validate() automatisch aufgerufen.
Wenn du jedoch setVisible(true) erst am Ende des Konstruktors machst, dann hast du gleich das Problem.

virtualAudio hat gesagt.:
bei 2: da weiß ich nicht was ich gemacht habe. Hab ja wie immer repaint() verwendet und
nur deshalb geändert weil es nicht geklappt hat. Da hab ich vermutlich danach noch etwas anderes umgeschrieben..
Kann ich leider nicht erklären, bin ja kein Hellseher 😀
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben