Swing Unteren Abstand für JTable in JScrollPane festlegen

J

Jos

Gast
Moin,

ich möchte in JAVA ein Programm schreiben, das mit dem File-Explorer von Windows vergleichbar ist. Dazu verwende ich eine JTable, die in ein JScrollPane eingefügt ist. In der JTable stehen die ganzen Dateieinträge, also z.B. erste Spalte Dateiname, zweite Spalte Dateigröße.

Es soll nun für die Tabelle zwei verschiedene Kontextmenüs geben (JPopupMenu).
Das eine erscheint bei Rechtsklick auf eine Zeile und hat Einträge, die für diese eine Datei wirken sollen, wie z.B. "Datei löschen", "Datei öffnen".
Das andere erscheint bei Rechtsklick auf den leeren Bereich unter der Tabelle und hat allgemeine Einträge für den Explorer wie "Neue Datei anlegen", "Aktualisieren". Dazu habe ich die Höhe der Tabelle mit setFillsViewportHeight(true); auf das JScrollPane angepasst.

Nun das Problem: Wenn die Tabelle viele Einträge hat und das JScrollPane komplett ausfüllt, dann gibt es keinen freien Bereich mehr und man kommt an das zweite Kontextmenü nicht mehr heran. Man müsste irgendwie festlegen, dass unter der letzten Tabellenzeile immer ein Abstand zum JScrollPane bleibt. Weiß jemand, wie ich das machen kann?
 
C

Camino

Gast
Mach doch die allgemeinen Menüpunkte mit in das eine Popupmenü für die Dateien mit rein, vielleicht optisch durch einen Separator abgetrennt. Ist vielleicht besser, als immer erst nach unten zu scrollen um den freien Platz unter der Tabelle zu suchen. Und natürlich das auch noch oben in die Menüleiste rein...
 
J

Jos

Gast
Mir ist schon klar, dass man das auch anders lösen kann, und habe dazu auch schon Ideen. Aber rein aus Interesse will ich mal wissen, ob meine erste Idee auch irgendwie machbar ist.

@Camino
Guter Punkt aber, dass man dann erst lange scrollen muss. Das habe ich mir noch gar nicht richtig überlegt. Danke dir.
Bei meiner Vorlage (Windows Explorer) funktioniert es zwar nahezu genauso, aber dort ist es noch so, dass das zweite, allgemeine Kontextmenü auch kommt, wenn man _neben_ einen Dateinamen klickt, der die Namenspalte nicht ganz ausfüllt. Das wäre in JAVA aber sicher zu aufwändig. hmmm....
 
C

Camino

Gast
Ich hab mir jetzt den Windows Explorer (unter Windows7) mal angeschaut. Wenn die Zeile selektiert (farbig unterlegt) ist, dann erscheint auch das Popup-Menü für die Datei, wenn ich neben den Dateinamen mit der rechten Maustaste klicke. Wenn die Zeile den Fokus (Rahmen aussenrum) hat, dann erscheint das allgemeine Popup-Menü. Wenn ich mit der rechten Maustaste auf einen anderen Dateinamen klicke, wird die Zeile farblich selektiert und es erscheint das Dateimenü. Wie das jetzt in Java umzusetzen wäre, hmmm, keine Ahnung...
 

bERt0r

Top Contributor
Schnell gehackt, vom Prinzip her: MouseListener auf die Table, abfragen ob Klickpunkt auf einem Selecteten Eintrag ist und davon abhängig das jeweilige Popupmenü anzeigen.
Java:
import java.awt.BorderLayout;


public class Explorer extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private DefaultTableModel tableModel=new DefaultTableModel();
	private Vector<String> tableColumns=new Vector<String>();
	private JPopupMenu popupDatei = new JPopupMenu();
	private JPopupMenu popupBackground = new JPopupMenu();
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Explorer frame = new Explorer();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Explorer() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 340);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		tableColumns.add("Dateiname");
		
		DefaultMutableTreeNode root=new DefaultMutableTreeNode();
		root.setUserObject("Computer");
		File[] roots=File.listRoots();
		for(File f:roots)
		{
			root.add(new DefaultMutableTreeNode(f));
		}
		DefaultTreeModel treeModel=new DefaultTreeModel(root);
		
		JScrollPane scrollPaneTree = new JScrollPane();
		JTree tree = new JTree(treeModel);	
		
		tree.addTreeSelectionListener(new TreeSelectionListener() {
			
			public void valueChanged(TreeSelectionEvent e) 
			{
				DefaultMutableTreeNode node=(DefaultMutableTreeNode)e.getPath().getLastPathComponent();
				if(node.isLeaf())
				{
					Vector<Vector<File>> tableData=new Vector<Vector<File>>();
					File selectedFile=(File) node.getUserObject();
					File[] files=selectedFile.listFiles();
					for(File f:files)
					{
						Vector<File> v=new Vector<File>();
						v.add(f);
						tableData.add(v);
						if(f.isDirectory())
						{
							node.add(new DefaultMutableTreeNode(f));
						}
					}
					
					tableModel.setDataVector(tableData,tableColumns);
				}
			}
		});
		scrollPaneTree.setViewportView(tree);
		
		JScrollPane scrollPaneTable = new JScrollPane();
		
		table = new JTable(tableModel);
		table.setFillsViewportHeight(true);
		scrollPaneTable.setViewportView(table);
		

		
		JMenuItem itemNeu = new JMenuItem("Neue Datei");
		itemNeu.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				System.out.println("Neue Datei");
			}
		});
		popupBackground.add(itemNeu);
		
		JSplitPane splitPane = new JSplitPane();
		splitPane.setResizeWeight(0.3);
		splitPane.setPreferredSize(new Dimension(400, 300));
		splitPane.setLeftComponent(scrollPaneTree);
		splitPane.setRightComponent(scrollPaneTable);
		contentPane.add(splitPane, BorderLayout.NORTH);
		
		JMenuItem itemOefnnen = new JMenuItem("\u00D6ffnen");
		popupDatei.add(itemOefnnen);
		itemOefnnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				File f=(File) table.getValueAt(table.getSelectedRow(), 0);
				try {
					Desktop.getDesktop().open(f);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
		
		table.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) 
			{
				int selection=table.rowAtPoint(e.getPoint());
				//table.getSelectionModel().setSelectionInterval(selection, selection);
				if (e.isPopupTrigger()) {
					showMenu(e);
				}
			}
			public void mouseReleased(MouseEvent e) {
				if (e.isPopupTrigger()) {
					showMenu(e);
				}
			}
			private void showMenu(MouseEvent e) {
				int row=table.rowAtPoint(e.getPoint());
				if(row!=-1 && row==table.getSelectedRow())  //-1 -> No row selected
				{
					popupDatei.show(table, e.getX(), e.getY());
				}
				else
				{
					popupBackground.show(table, e.getX(), e.getY());
				}
				
			}
		});		
	}
}
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Hallo.
Mir fallen zwei weitere Möglichkeiten ein, die beide
Code:
JComponent.setComponentPopupMenu()
verwenden:

1. Einen TreeSelectionListener anbinden und bei Selektionsänderung auch das Component-PopupMenu entsprechend ändern.

2. Etwas komplexer: Den TreeCellRenderer erweitern und dort das PopupMenu setzen. Das ist aber wohl eher etwas wenn man sehr viel mehr verschiedene Popupmenüs hat.
 

bERt0r

Top Contributor
@2: Das geht meines Wissens nach nicht, der Cell Renderer packt nur ein Abbild des Komponents hin, etwaige Listeners springen nicht an.
 
J

Jos

Gast
Ich sehe, es haben sich noch ein paar weitere Menschen Gedanken über mein Problem gemacht. Danke euch für eure Mühe. Besonderer Dank an bERt0r für das ausführliche Code-Beispiel.
Trotzdem muss ich leider sagen, dass meine Frage damit nicht beantwortet ist. Bei Rechtsklick auf eine Zeile, die noch nicht ausgewählt ist, soll diese ausgewählt werden und das Datei-Kontextmenü soll kommen. Es geht mir halt wirklich nur um den leeren Bereich unter den Tabellenzeilen. Es scheint da wohl keine Möglichkeit zu geben, schade.
 

Michael...

Top Contributor
Bei Rechtsklick auf eine Zeile, die noch nicht ausgewählt ist, soll diese ausgewählt werden und das Datei-Kontextmenü soll kommen.
Nichts einfacher als das: MouseListener dran und bei Rechtsklick die Zeile selektieren.

Zu der ursprünglichen Frage "unteren Abstand" eine quick & dirty Lösung:
Einfach dem Viewport der ScrollPane eine Border setzen die unten etwas breiter (zur Verdeutlichung Blau eingefärbt) ist, dann ein Popup für die ScrollPane und eines für die JTable setzen
Java:
	JFrame frame = new JFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setBounds(0, 0, 200, 300);
	
	JPopupMenu menu1 = new JPopupMenu();
	menu1.add(new JMenuItem("Menu 1"));
	JPopupMenu menu2 = new JPopupMenu();
	menu2.add(new JMenuItem("Menu 2"));
	
	JTable table = new JTable(new DefaultTableModel(new String[] {"Name", "Datum", "..."}, 20));
	table.setBackground(Color.WHITE);
	JScrollPane pane = new JScrollPane(table);
	pane.setViewportBorder(BorderFactory.createMatteBorder(1, 1, 30, 1, Color.BLUE));
	table.setComponentPopupMenu(menu1);
	pane.setComponentPopupMenu(menu2);
	frame.add(pane);
	frame.setVisible(true);
 

bERt0r

Top Contributor
Oder meinen Code durchlesen und die 2 / wegmachen:
public void mousePressed(MouseEvent e)
{
int selection=table.rowAtPoint(e.getPoint());
//table.getSelectionModel().setSelectionInterval(selection, selection);
if (e.isPopupTrigger()) {
showMenu(e);
}
}
 
J

Jos

Gast
Hey! Nicht meine Aussagen aus dem Zusammenhang reißen (-;
Ihr habt Lösungen vorgeschlagen, bei denen unterschieden wird, ob der Rechtsklick auf die aktuell selektierte Zeile geht oder nicht, und anhand dessen wird entschieden, welches Kontextmenü aufgeht. Wenn ich nun sagen würde, egal auf welche Zeile der Rechtsklick geht, sie wird immer selektiert und das Dateimenü geht auf, dann hätte ich wieder keinen Zugriff auf das allgemeine Kontextmenü. Nur das wollte ich damit sagen, nicht dass ich nicht weiß, wie man eine Zeile auswählt (-;

@Michael...
Deine Lösung ist nicht ganz 100% das was ich wollte, aber es kommt dem wirklich sehr sehr nah. Und es löst gleichzeitig das Problem, das Camino weiter oben aufgezeigt hat, also irgendwie sogar besser als meine eigentliche Idee. Danke (-: Ich werde das jetzt in dieser Art umsetzen.

Ich habe festgestellt, dass man nichtmal unbedingt setViewportBorder() bei dem JScrollPane machen muss. Es reicht sogar schon, wenn man dem ScrollPane das Kontextmenü anhängt mit setComponentPopupMenu(). Ich werde den Rahmen trotzdem ein wenig vergrößern, damit man nicht so eine Millimeterarbeit mit der Maus machen muss.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Abstand zwischen AnchorPane und Labels in dem HBox halten AWT, Swing, JavaFX & SWT 1
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
H JavaFX Abstand rechts zur scrollbar AWT, Swing, JavaFX & SWT 1
D JGridLayout zwischen Zeilen bestimmter Abstand AWT, Swing, JavaFX & SWT 3
J Abstand im JLable AWT, Swing, JavaFX & SWT 2
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
P Swing JLabel Schriftzeichen Abstand Leerzeichen AWT, Swing, JavaFX & SWT 4
E LayoutManager GridBagLayout in BorderLayout - Abstand bei Resizing AWT, Swing, JavaFX & SWT 2
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
D Tabellen Header & Abstand der Zeilen AWT, Swing, JavaFX & SWT 8
M gridbaglayout - abstand bei label und field AWT, Swing, JavaFX & SWT 8
B JLabel Abstand wegkriegen AWT, Swing, JavaFX & SWT 2
0 Swing LineBorder mit Abstand? AWT, Swing, JavaFX & SWT 2
C Swing JBorderLayout - Abstand AWT, Swing, JavaFX & SWT 7
P JButton - innerer Abstand veränderbar? AWT, Swing, JavaFX & SWT 6
steff2808 JLabel mit grossem Abstand von einem cm? AWT, Swing, JavaFX & SWT 5
hdi BoxLayout mit Abstand? AWT, Swing, JavaFX & SWT 5
A JButton Abstand Text - Rand AWT, Swing, JavaFX & SWT 4
D RadioButton abstand entfernen AWT, Swing, JavaFX & SWT 2
S Abstand zwischen Labeln auf 0 setzen AWT, Swing, JavaFX & SWT 6
N Abstand des Textes vom Rahmen bei JLabel AWT, Swing, JavaFX & SWT 2
G LayoutManager und Abstand AWT, Swing, JavaFX & SWT 6
O Buttons gleich groß + gleicher Abstand AWT, Swing, JavaFX & SWT 3
I JLabel Text Abstand AWT, Swing, JavaFX & SWT 9
C Abstand von Buttons zu Jpanel AWT, Swing, JavaFX & SWT 5
DeeDee0815 Abstand ZUM BorderLayout AWT, Swing, JavaFX & SWT 13
loadbrain 3 JLabels untereinander ohne Abstand AWT, Swing, JavaFX & SWT 4
G Abstand zwischen den Buttons in einer Toolbar AWT, Swing, JavaFX & SWT 3
B Abstand zwischen einzelnen Elementen einstellen AWT, Swing, JavaFX & SWT 2
N JTable Abstand zwischen einzelnen Spalten AWT, Swing, JavaFX & SWT 6
S Applet mit AWT: Abstand zum Rand ändern AWT, Swing, JavaFX & SWT 5
G Abstand einfügen! AWT, Swing, JavaFX & SWT 5
G abstand zwischen den buttons unterschiedlich AWT, Swing, JavaFX & SWT 2
Z komponenten "einfrieren" - abstand zwischen AWT, Swing, JavaFX & SWT 10
G Ungewollter Abstand zwischen Gui -Elementen / Insets setzen AWT, Swing, JavaFX & SWT 2
G BoxLayout: Abstand zwischen vertikalen Komponenten! AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben