Wie könne man das realisieren?

Status
Nicht offen für weitere Antworten.

Titanpharao

Bekanntes Mitglied
Hallo Forum-User,

ich habe einen Button. Jetzt möchte ich mit der Maus über den Button fahren.(MouseMotionListener) jetzt sollen sich direkt daneben 2(bzw beliebig viele) weitere Buttons öffnen(anzeigen). Diese sind aber nicht im Layout verankert, also mehr wie ein Tooltip. Glaube im Photoshop so etwas schonmal gesehen zu haben. Die neuen Buttons (bzw es muss auch wechseln möglich sein zwischen diesen) verschwinden, sobald man von einen der Buttons verschwindet. Hat einer eine idee, wie man sowas verwirklicht?

Also mir machen am meisen Kopfschmerzen wie ich die 2 zusätzlichen Buttons "erscheinen" lasse. GlassPane oder sowas? :###

Danke für Antworten :D
 

Titanpharao

Bekanntes Mitglied
Ja glaube sowas habe ich gesucht, funktioniert soweit ganz gut. Nur die Position des JWindow... glaube du verstehst was ich meine wenn du den Code mal ausführst.

Code:
package comboboxbutton;

import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JWindow;

public class WonderButton extends JFrame {
	JButton x = new JButton("X");
	JButton y = new JButton("Y");
	JButton xy = new JButton("XY");

	public WonderButton() {

		this.setLayout(new GridLayout(3, 3));

		HoverButton hoverbutton = new HoverButton("X", this);
		hoverbutton.addButtonstoWindow(y);
		hoverbutton.addButtonstoWindow(xy);

		this.add(new JLabel());
		this.add(new JLabel());
		this.add(new JLabel());
		this.add(hoverbutton);
		this.add(new JLabel());
		this.add(new JLabel());
		this.add(new JLabel());
		this.add(new JLabel());
		this.add(new JLabel());
		this.setSize(300, 300);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		this.setVisible(true);
	}

	public static void main(String[] argv) {
		new WonderButton();
	}

	class HoverButton extends JButton {

		JWindow buttonwindow;
		JFrame frame;
		ArrayList<JButton> buttons = new ArrayList<JButton>();

		public HoverButton(String text, JFrame frame) {
			this.frame=frame;
			buttonwindow = new JWindow(frame);
			this.setText(text);
			this.addMouseListener(new MouseAdapter() {
				public void mouseExited(MouseEvent e) {
					buttonwindow.setVisible(false);
				}

				public void mouseEntered(MouseEvent e) {
					int x = ((JButton) e.getSource()).getX()+HoverButton.this.frame.getX();
					int y = ((JButton) e.getSource()).getY()+HoverButton.this.frame.getY();
					int w = ((JButton) e.getSource()).getWidth();
					int h = ((JButton) e.getSource()).getHeight();
					buttonwindow.setBounds(x + w, y, buttons.size() * w, h);
					buttonwindow.setVisible(true);

				}
			});
		}

		public void addButtonstoWindow(JButton button) {
			buttons.add(button);
			buttonwindow.add(button);
			buttonwindow.setLayout(new GridLayout(1, buttons.size()));
		}
	}
}
 
G

Gast2

Gast
Code:
buttonwindow.setBounds(getLocationOnScreen().x +w, getLocationOnScreen().y, buttons.size() * w, h);

versuch mal das...
 

Titanpharao

Bekanntes Mitglied
Klappt prima :toll:
Frage mich nur gerade wie ich es schaffen kann, dass das Window nicht verschwindet, wenn ich auf es fahre ...
 
G

Gast2

Gast
mhm ... du musst in der methode überprüfen
Code:
public void mouseExited(MouseEvent e) {
               buttonwindow.setVisible(false);
            }
ob deine maus im in deinem buttonwindow ist wenn ja nicht schließen...
und auf deinem JWindow musst auch ein MouseListener registieren ... und wenn er da raus geht, dann schließ dein window...
 

Ebenius

Top Contributor
Hab den Thread erst etwas spät entdeckt. Hab mir dazu eine Klasse geschrieben JAutoPopupWindow; die darfst Du gern zum spicken benutzen, kopieren, verändern, wie Du magst. Damit sieht dann das da ganz hübsch aus:
Code:
public class ButtonToolTipTestGui {

  static class ButtonToolTip extends JToolTip {

    private static final long serialVersionUID = 9003134731211677902L;

    @Override
    public Dimension getPreferredSize() {
      // Don't use the size of the UI
      return getLayout().preferredLayoutSize(this);
    }

    @Override
    public Insets getInsets() {
      // Have some space, to make it nice
      final Insets ins = super.getInsets();
      ins.top = Math.max(ins.top, 4);
      ins.left = Math.max(ins.left, 4);
      ins.right = Math.max(ins.right, 4);
      ins.bottom = Math.max(ins.bottom, 4);
      return ins;
    }
  }

  static final class ToolTipAction extends AbstractAction {

    private static final long serialVersionUID = -7263755580083470018L;

    /** Creates a new <code>ToolTipAction</code>. */
    ToolTipAction(String name) {
      super(name);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      final Component c = (Component) e.getSource();
      final Window window = SwingUtilities.getWindowAncestor(c);
      if (window != null) {
        window.setVisible(false);
      }
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final JFrame frame = new JFrame(ButtonToolTipTestGui.class.getName());

    // create popup window w/ two buttons
    final JAutoPopupWindow popupWindow = new JAutoPopupWindow(frame);
    final JComponent tt = new ButtonToolTip();
    tt.setLayout(new GridLayout(1, 2, 5, 5));
    tt.add(new JButton(new ToolTipAction("A")));
    tt.add(new JButton(new ToolTipAction("B")));
    popupWindow.setContentPane(tt);
    popupWindow.pack();

    // create button with popup
    final JButton button = new JButton("Tool Tip Button");
    popupWindow.setActivationComponent(button);

    // show pane
    frame.getContentPane().add(button, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

Getestet mit Metal/Ocean, Nimbus, GTK+ und CDE/Motif Look and Feels.

Viel Spaß, Ebenius
 

Titanpharao

Bekanntes Mitglied
und auf deinem JWindow musst auch ein MouseListener registieren ... und wenn er da raus geht, dann schließ dein window... das funkioniert nicht :(

Code:
			buttonwindow.addMouseListener(new MouseAdapter(){
				public void mouseExited(MouseEvent e) {					
					if(buttonwindow.contains(e.getPoint()))
						buttonwindow.setVisible(false);
					
				}			
				public void mouseEntered(MouseEvent e) {
					
				}
			});

der kommt niemals in das mouseexited rein, als ob das Window unendlich groß wäre ...
 

Ebenius

Top Contributor
Titanpharao, wenn ich schon der Konkurenz helfe, will ich doch wenigstens wissen, ob's tut. :)

Ebenius
 
G

Gast2

Gast
dadrin brauchst du keine if abfrage... einfach wenn er in dem buttonwindow ist und raus geht dann visible false...
die if abfrage brauchst du in dem anderen mouseExit...
 

Ebenius

Top Contributor
SirWayne hat gesagt.:
dadrin brauchst du keine if abfrage... einfach wenn er in dem buttonwindow ist und raus geht dann visible false...
die if abfrage brauchst du in dem anderen mouseExit...

SirWayne, das funktioniert natürlich nicht. Da die beiden Buttons das Fenser vollständig bedecken, bekommt das Fenster niemals einen MouseEvent.

Titanpharao, hast Du meinen Vorschlag mal getestet? Das JAutoPopupWindow müsste alles können was Du brauchst.

Grüße, Ebenius
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben