GUI: Default-Border wiederherstellen



  • Hallo,

    ich habe folgendes Problem: Ich bin gerade dabei eine GUI zu schreiben und moechte, dass man im Hauptmenue anhand von einem "gedrueckten" Button erkennen kann, in welchem Menuepunkt man sich gerade befindet.
    Die Buttons haben standardmaessig (also im "nicht gedrueckt"-Zustand) den systemabhaengigen Default-Border. Fuer einen "gedrueckten Button" hab ich einfach einen Bevel-Border benutzt. Wenn nun aber ein andere Menuepunkt angewaehlt wird, soll der aktuell gedrueckte Button ja wieder in den "nicht gedrueckt"-Zustand gehen. Dazu wuerde ich gerne einfach den Bevel-Border wieder entfernen, bzw. ihn mit dem Default-Border ueberschreiben. Allerdings konnte ich bisher nicht herausfinden, wie man das machen kann.

    Ich wuerde mich ueber Tipps/Ratschlaege sehr freuen 🙂

    Viele Gruesse



  • Hallo,

    ich bin mir nicht sicher ob das unten das ist, was du meinst, aber grundsätzlich musst du dir dazu den aktuell gedrückten Button merken und dann den Default-Border wieder genauso setzten, wie du den "gedrückten" Border gesetzt hast. Zusätzlich musst du meines Wissens die Methode validate() aufrufen um sicherzustellen, dass der neue Border auch sofort gezeichnet wird. Dies ist zumindest dann notwendig, wenn man ein komplettes JPanel austauscht (wobei da ja aber auch wirklich der Komponenten-Baum manipuliert wird... könnte also unnötig sein)..

    public class Main extends JFrame {
    private JMenu hovered = null;
    
    (..)
    	private void hover(JMenu menu) {
    		if (hovered != null) {
    			hovered.setBorder(new JMenu().getBorder());
    			hovered.validate();
    		}
    		if (menu != null) {
    			menu.setBorder(BorderFactory
    					.createEtchedBorder(EtchedBorder.RAISED));
    			menu.validate();
    		}
    		hovered = menu;
    	}
    (...)
    }
    

    Hier noch mal ein komplettes funktionierendes Beispiel zum Ansehen:

    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.border.EtchedBorder;
    
    public class Main extends JFrame implements MouseListener {
    
    	public static void main(String[] args) {
    		new Main().setVisible(true);
    	}
    
    	private JMenu hovered = null;
    
    	public Main() {
    		super();
    		setJMenuBar(createJMenuBar());
    		setSize(200, 100);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    
    	private JMenuBar createJMenuBar() {
    		JMenuBar menubar = new JMenuBar();
    		JMenu menuX = new JMenu("X");
    		JMenu menuY = new JMenu("Y");
    		JMenu menuZ = new JMenu("Z");
    		menuX.addMouseListener(this);
    		menuY.addMouseListener(this);
    		menuZ.addMouseListener(this);
    
    		JMenuItem itemX1 = new JMenuItem("X1");
    		JMenuItem itemX2 = new JMenuItem("X2");
    		JMenuItem itemX3 = new JMenuItem("X3");
    		menuX.add(itemX1);
    		menuX.add(itemX2);
    		menuX.add(itemX3);
    
    		JMenuItem itemY1 = new JMenuItem("Y1");
    		JMenuItem itemY2 = new JMenuItem("Y2");
    		JMenuItem itemY3 = new JMenuItem("Y3");
    		menuY.add(itemY1);
    		menuY.add(itemY2);
    		menuY.add(itemY3);
    
    		JMenuItem itemZ1 = new JMenuItem("Z1");
    		JMenuItem itemZ2 = new JMenuItem("Z2");
    		JMenuItem itemZ3 = new JMenuItem("Z3");
    		menuZ.add(itemZ1);
    		menuZ.add(itemZ2);
    		menuZ.add(itemZ3);
    
    		menubar.add(menuX);
    		menubar.add(menuY);
    		menubar.add(menuZ);
    
    		return menubar;
    	}
    
    	private void hover(JMenu menu) {
    		if (hovered != null) {
    			hovered.setBorder(new JMenu().getBorder());
    			hovered.validate();
    		}
    		if (menu != null) {
    			menu.setBorder(BorderFactory
    					.createEtchedBorder(EtchedBorder.RAISED));
    			menu.validate();
    		}
    		hovered = menu;
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		Object src = e.getSource();
    		if (src instanceof JMenu) {
    			hover((JMenu) src);
    		}
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    	}
    
    	@Override
    	public void mousePressed(MouseEvent e) {
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    	}
    
    }
    


  • Es gibt doch noch so was wie tooglebutton. Wenn der einmal gedrückt wird bleibt der unten.



  • Hey vielen Dank! Jetzt funktioniert es.
    Da muss man aber auch erstmal drauf kommen, sich den Default-Border zu beschaffen, indem man ein neues JComponent erstellt 🙂

    Viele Gruesse

    edit: Das mit dem Toggle-Button sieht auch interessant aus, werde ich mir mal genauer ansehen 🙂


Anmelden zum Antworten