Swing nach Fensterrand Action ausführen? HILFE

N4pst3r

Mitglied
Moin zusammen

Ich habe folgendes Problem und habe mich nun schon ergebnisslos totgesucht.
Ich habe die Aufgabe, ein Programm zu schreiben, das Buttons in eine Leiste (ich habe eine JMenuBar genommen) einfügt. Soblad der Fensterrand erreicht ist sodass der nächste Button nicht komplett dargestellt werden kann, soll stattdessen ein Pfeil in der Leiste erscheinen, wo die folgenden Buttons beim Klick auf den Pfeil Vertikal dargestellt werden.

Das einzige Problem ist letztendlich, wie zum Henker die Buttons oder der Frame merkt, wann das Fenster die Buttons nicht mehr anzeigt.

Ahja... Sobald das Fenster sich nach X verändert, sollen dementsprechend mehr oder weniger Button in der Zeile stehen... während der Runtime.

(Ich denke ein Codeausschnitt ist hier überflüssig weil ich nur die Methode suche :p)

Danke im Vorraus
Gruß N4pst3r
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Ehrlich gesagt ist das eine ziemlich seltsame Aufgabe. Ist das im Rahmen einer Übung / Hausaufgabe? Ich kann mich nicht erinnern so etwas schonmal gesehen zu haben. Daher kann ich es mir schwerlich vorstellen, was dabei herauskommen soll.

Es gibt zB JTabbedPane. Wenn man hier via
Code:
addTab()
munter einige Seiten einfügt, erscheinen (je nach weiterer Einstellung) am Rand kleine Scrollbuttons. Ist es das schon was du suchst?
Java:
JTabbedPane tabbedPane = new JTabbedPane();
for (int i = 0; i < 20; i++)
{
    tabbedPane.addTab("Tab "+i, new JLabel("Ich bin Tab "+i));
}

Es gibt auch JScrollPane, welche automatisch Scrollbalken hinzufügt, wenn die enthaltene Komponente zu groß wird:
Java:
JPanel pnlButtons = new JPanel();
pnlButtons.setLayout(new BoxLayout(pnlButtons, BoxLayout.X_AXIS));
for (int i = 0; i  < 20; i++)
{
    pnlButtons.add(new JButton("Nr "+i));
}
myContainer.add(new JScrollPane(pnlButtons));

Wenn es wirklich was Eigenes sein soll (so wie deine Aussage klingt), dann musst du quasi etwas wie eine JScrollPane basteln. Das fängt dann wohl damit an die Größen zu vergleichen (vom Container und von seinem Inhalt) und geht dann wohl weiter bis zur Realisierung des Scrollens. Das ist bestimmt nicht in 10 Minuten gemacht ;)
 

TR

Aktives Mitglied
Ehrlich gesagt ist das eine ziemlich seltsame Aufgabe. Ist das im Rahmen einer Übung / Hausaufgabe? Ich kann mich nicht erinnern so etwas schonmal gesehen zu haben. Daher kann ich es mir schwerlich vorstellen, was dabei herauskommen soll.

Lesezeichen-Symbolleiste bei Firefox etc. wenn so viele drin sind, das sie nicht mehr in die Zeile passen, hat man auch den Effekt !
 

ymene

Bekanntes Mitglied
Buttons klingt für mich immer wie eine ToolBar. Da gibt auch ein gutes Beispiel von Santhosh Kumar. Vielleicht ist was vergleichbares auch für eine MenuBar umsetzbar.
 
Zuletzt bearbeitet:

N4pst3r

Mitglied
Nja es wird in einem Zusatzmodul für ein Programm gebraucht.

im grunde ist es richtig dass ich etwas vergleichbares wie eine JScrollPane suche, da diese ja auch erst erscheint wenn die komponenten o.ä. von der größe nicht mehr passen.
Allerdings soll keine ScrollBar erscheinen. Theoretisch müsste ich nur die ScrollBar aus dem ScrollPane ersetzen... :autsch:

Ich werde mir wohl als erstes die ScrollPane näher angucken. Wie die im einzelnen funktioniert weiß ich allerdings überhaupt nicht ;)
 
Zuletzt bearbeitet:

N4pst3r

Mitglied
Ich wollte noch ein Bild hochladen wie es aussieht allerdings funzt das hier garnicht :D
kp...aber ich habs als Anhang gespeichert.

jedenfalls sollte es so aussehen... der untere Button "New" fügt einen neuen Button der (momentan) MenuBar hinzu. Da das Fenster
Java:
frame.setResizable( false );
ist belibt das Fenster auf die Maße 332x200 pixel beschränkt. Überstreicht der nächst hinzugefügte Button den Rand des Fensters, erscheint ein kleiner Pfeil anstatt des Buttons und unter diesem Pfeil (beim Klick) werden die folgenden Button vertikal eingefügt.

Hoffe das hilft die Situation zu verstehen ;)

Gruß N4pst3r
 

N4pst3r

Mitglied
:)geschafft !
Letztendlich habe ich mich entschlossen die Größe der Buttons mit der Größe des MenuBar zu vergleichen und wenn die Summe der Buttonbreite die der JMenuBar überschreitet, wird ein JMenu eingeblendet.
Ich glaube ich habe ein paar Kommentare zuviel im Code aber wenns wen stört soll er halt ne pm schreiben :p

Hier der Code:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.EmptyBorder;

public class testGebiet extends JFrame implements ActionListener, MouseListener	{

	JFrame frame = new JFrame();

	/*****************************************************************************
	 * Der ButtonZaehler ist ein wichtiger Bestandteil des Programms.
	 * Mehr dazu in der Action-Methode.
	 ****************************************************************************/
	int iButtonZaehler = 0;

	/*****************************************************************************
	 * Ich benutze hier einige selbst erstellte Icons, um das am Ende aufblendende
	 * Menu zu verschönern.
	 ****************************************************************************/
	Icon icnStandard = new ImageIcon( "openMenu_10st.gif" );
	Icon icnRollover = new ImageIcon( "openMenu_10ro.gif" );
	Icon icnPressed = new ImageIcon( "openMenu_10pr.gif" );

	/*****************************************************************************
	 * Die TextArea dient in der Mitte ebenfalls nur zur Zierde.
	 ****************************************************************************/
	JTextArea jtxtrMitte;

	/*****************************************************************************
	 * Der Button jbtnNeu ist der unterste Button zum hinzufügen der Button in die
	 * MenuBar und in das Menu.
	 ****************************************************************************/
	JButton jbtnNeu;

	/*****************************************************************************
	 * Der erste Button ist der erste Button in der MenuBar, der zweite Button
	 * erscheint nach dem ersten in der MenuBar bis das Menu am Ende erscheint,
	 * und der dritte Button fügt sich danach in das Menu ein.
	 ****************************************************************************/
	JButton jbtnBarButton0 = new JButton( "" );
	JButton jbtnBarButton1 = new JButton( "" );
	JButton jbtnBarButton2 = new JButton( "" );

	/*****************************************************************************
	 * Die Bestandteile der MenuBar.
	 ****************************************************************************/
	JMenuBar jmnBar;
	JMenu jmnButtons;

	Container cp = getContentPane();

	public testGebiet()	{
		super( "TestStrecke" );
		setDefaultCloseOperation( EXIT_ON_CLOSE );

	/*****************************************************************************
	 * Das BorderLayout reicht bei diesem Zweckprogramm aus.
	 ****************************************************************************/
		BorderLayout border = new BorderLayout();
		cp.setLayout(  border );

	/*****************************************************************************
	 * Hier wird das Look and Feel auf den Windows-Standard gesetzt
	 ****************************************************************************/
			try {
				UIManager.setLookAndFeel(
				"com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
				SwingUtilities.updateComponentTreeUI( frame );
			}

			catch (Exception e) {
				System.err.println( "Konnte Layout nicht Laden" );
			}

	/*****************************************************************************
	 * Das JMenu wird deklariert. Ich ändere die Größe des Menus, füge ihm einen
	 * MouseListener hinzu und setze die Erscheinung auf mein Icon.
	 ****************************************************************************/
		jmnButtons = new JMenu();
		jmnButtons.setBorder( new EmptyBorder( 0, -4, 0, -4 ) );
		jmnButtons.addMouseListener( this );
		jmnButtons.setIcon( icnStandard );

	/*****************************************************************************
	 * Die MenuBar wird deklariert.
	 ****************************************************************************/
		jmnBar = new JMenuBar();
		setJMenuBar( jmnBar );

	/*****************************************************************************
	 * Das TextArea wird deklariert.
	 ****************************************************************************/
		jtxtrMitte = new JTextArea();

	/*****************************************************************************
	 * Der Button jbtnNeu wird deklariert.
	 ****************************************************************************/
		jbtnNeu = new JButton( "New" );
		jbtnNeu.addActionListener( this );

	/*****************************************************************************
	 * Die TextArea und der Button jbtnNeu werden dem Frame hinzugefügt.
	 ****************************************************************************/
		cp.add( jtxtrMitte, BorderLayout.CENTER );
		cp.add( jbtnNeu, BorderLayout.SOUTH );
	}

	public void actionPerformed( ActionEvent evt )	{
		Object source = evt.getSource();

	/*****************************************************************************
	 * Wenn der Button jbtnNeu geklickt wird...
	 ****************************************************************************/
		if( jbtnNeu == source )	{

	/*****************************************************************************
	 * Wird der ButtonZaehler mit 0 verglichen. Ist er 0, wird der erste Button
	 * der MenuBar hinzugefügt. Der ButtonZaehler wird daraufhin um 1 erhöht.
	 ****************************************************************************/
			if( iButtonZaehler == 0 )	{
				jbtnBarButton0 = new JButton( "JButton0" );
				iButtonZaehler++;

				jmnBar.add( jbtnBarButton0 );
				jmnBar.validate();
			}

	/*****************************************************************************
	 * Sobald der ButtonZaehler nicht mehr 0 ist, wird die Breite des ersten
	 * Buttons und der zweiten Buttons (oben noch als 0 deklariert) addiert,
	 * und die Breite des Menus am Ende addiert und mit der Gesamtbreite der
	 * MenuBar verglichen. Ist die Summe kleiner als die Breite der MenuBar,
	 * wird ein weiterer zweiter Button eingefügt. Beim nächsten klick auf
	 * jbtnNeu, werden die zweiten Buttons mit dem ButtonZaehler multipliziert
	 * und somit die neue Breite der Buttons verglichen.
	 ****************************************************************************/
			else if( jbtnBarButton0.getWidth() + (jbtnBarButton1.getWidth() *
				iButtonZaehler) + 25 < jmnBar.getWidth() )	{

				jbtnBarButton1 = new JButton( "JButton" + iButtonZaehler );
				iButtonZaehler++;

				jmnBar.add( jbtnBarButton1 );
				jmnBar.validate();
			}

	/*****************************************************************************
	 * Ist die Gesamtbreite der Buttons + Menu breiter als die MenuBar, wird das
	 * Menu am Ende der MenuBar eingefügt und folgende Buttons werden vertikal in
	 * dieser eingefügt.
	 ****************************************************************************/
			else	{
				jbtnBarButton2 = new JButton( "JButton" + iButtonZaehler );
				iButtonZaehler++;

				jmnButtons.add( jbtnBarButton2 );
				jmnButtons.validate();
				jmnBar.add( jmnButtons );
				jmnBar.validate();
			}

	/*****************************************************************************
	 * Hier wird bei jedem Klick die Rechnung in der Komandozeile angezeigt.
	 ****************************************************************************/
			System.out.println( "Button0 + (Button1 * iButtonZaehler) + 25 = " );
			System.out.println( jbtnBarButton0.getWidth()  + " + (" + jbtnBarButton1.getWidth() + " * " + iButtonZaehler +  ") " + + 25 + " = " );
			System.out.println( jbtnBarButton0.getWidth() + (jbtnBarButton1.getWidth() * iButtonZaehler) + 25 + " < " + jmnBar.getWidth() );
		}
	}

	/*****************************************************************************
	 * Hier werden die MouseEvents für die Icons auf dem Menu deklariert.
	 ****************************************************************************/
	public void mouseClicked( MouseEvent e ) {
	}

	public void mousePressed( MouseEvent e ) {
		jmnButtons.setIcon( icnPressed );
	}

	public void mouseReleased( MouseEvent e ) {
		jmnButtons.setIcon( icnStandard );
	}

	public void mouseEntered( MouseEvent e ) {
		jmnButtons.setIcon( icnRollover );
	}

	public void mouseExited( MouseEvent e ) {
		jmnButtons.setIcon( icnStandard );
	}

	/*****************************************************************************
	 * Die main-Methode für den Frame.
	 ****************************************************************************/
	public static void main( String[] args )	{
		JFrame frame = new testGebiet();
		frame.setBounds( 460, 360, 340, 200 );
		frame.setResizable( true );
		frame.setVisible( true );
	}
}

Im übrigen arbeitet so auch der JScrollPane :)
Aber ich bin froh, dass ich keinen eigenen LayoutManager schreiben musste

Schöne Grüße
N4pst3r
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing Seltsame Ausgabe nach ButtonClick AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
K Swing JPanel nach oben und links vergrößern AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
J Swing: JFrame nach oben "aufklappen" AWT, Swing, JavaFX & SWT 0
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
P Swing JTable flimmert nach Zellsortierung AWT, Swing, JavaFX & SWT 3
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
K Swing Selectedrows falsch nach Sortieren AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben