Labels in ScrollPane mit Linie verbinden

Status
Nicht offen für weitere Antworten.

MathiasBauer

Bekanntes Mitglied
Hallo,

ich möchte für das Importieren und Exportieren von Tabelleninhalten (Excel, Access, etc.) Linien zwischen den verschiedenen Tabellenspaltenüberschriften zeichnen lassen. Also erst klickt man die Überschrift aus dem linken Panel an, dann aus dem rechten.

1. Irgendwie gefällt mir das mit den Linien nicht. Vielleicht hat jemand eine bessere Idee für mich. Ich möchte einfach die verschiedenen Spalten einer Tabelle in Excel oder Access meiner Tabelle zuweisen lassen, jedoch können die Spalten eben auch in einer anderen Reihenfolge vorliegen.

2. Der ValueChangedListener der JScrollBar funktioniert nicht richtig. Wenn ich ein paar Mal die ScrollBar hoch- und runter schiebe sind die Linien nicht mehr da wo sie ursprünglich mal waren.

Zum Testen habe ich mal ein wenig Code zusammengestückelt. Ich hoffe, es ist nicht zu viel, um das Hauptproblem noch erkennen zu können...

Vielen Dank im Voraus!

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;


public class Panels {
	private final Panel panelForPaint = new Panel();
	private Vector vectorForIntLabels = new Vector();
	private Vector vectorForExtLabels = new Vector();
	private boolean shouldPaint =false;
	private Vector lineCache = new Vector();
	private boolean deleteAll=false;
	private int valueOfScrollBar;

	public void init(){
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(300,220));

		JPanel panelForBackground = new JPanel();
		panelForBackground.setLayout(new BorderLayout());
		panelForBackground.setPreferredSize(new Dimension(300,220));

		JPanel emptyLeftPanel = new JPanel();
		emptyLeftPanel.setPreferredSize(new Dimension(350,30));
		emptyLeftPanel.setBackground(Color.lightGray);

		JPanel emptyRightPanel = new JPanel();
		emptyRightPanel.setPreferredSize(new Dimension(350,30));
		emptyRightPanel.setBackground(Color.lightGray);

		JPanel textPanelForExtHeader = new JPanel();
		textPanelForExtHeader.setLayout(new GridLayout(8,1));
		textPanelForExtHeader.setBackground(Color.white);
		textPanelForExtHeader.setPreferredSize(new Dimension(120,130));

		JPanel textPanelForIntHeader = new JPanel();
		textPanelForIntHeader.setLayout(new GridLayout(6,1));
		textPanelForIntHeader.setBackground(Color.white);
		textPanelForIntHeader.setPreferredSize(new Dimension(120,100));

		panelForPaint.setPreferredSize(new Dimension(60,50));
		panelForPaint.setBackground(Color.lightGray);

		final HashMap mapping = new HashMap();
		final int size = 5;
		final int sizeExt = 7;
		for(int i=0;i<size;i++){
			final JLabel label = new JLabel();
			label.setText("test"+i);
			label.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 5, Color.white));
			label.addMouseListener(new MouseAdapter(){
				public void mouseClicked(MouseEvent e){
					for(int j=0;j<size;j++){
						((JLabel) vectorForIntLabels.get(j)).setOpaque(false);
						((JLabel) vectorForIntLabels.get(j)).setForeground(Color.black);
						((JLabel) vectorForIntLabels.get(j)).setBackground(Color.white);
						((JLabel) vectorForIntLabels.get(j)).repaint();
					}
					for(int k=0;k<sizeExt;k++){
						if(((JLabel) vectorForExtLabels.get(k)).getBackground().toString().contains("java.awt.SystemColor")){
							if(!mapping.containsKey(((JLabel) vectorForExtLabels.get(k)).getText())&&!mapping.containsValue(label.getText())){
								shouldPaint=true;
								Vector pointVector = new Vector();
								pointVector.add(((JLabel) vectorForExtLabels.get(k)).getX());
								pointVector.add(((JLabel) vectorForExtLabels.get(k)).getY());
								pointVector.add(label.getX());
								pointVector.add(label.getY());
								lineCache.add(pointVector);
								mapping.put(((JLabel) vectorForExtLabels.get(k)).getText(), label.getText());
								panelForPaint.setCordinates(((JLabel) vectorForExtLabels.get(k)).getX(), ((JLabel) vectorForExtLabels.get(k)).getY(),label.getX(), label.getY());
								panelForPaint.paintComponent(panelForPaint.getGraphics());
							}
						}
					}
					for(int j=0;j<sizeExt;j++){
						((JLabel) vectorForExtLabels.get(j)).setOpaque(false);
						((JLabel) vectorForExtLabels.get(j)).setForeground(Color.black);
						((JLabel) vectorForExtLabels.get(j)).setBackground(Color.white);
						((JLabel) vectorForExtLabels.get(j)).repaint();
					}
					label.setOpaque(true);
					label.setBackground(SystemColor.textHighlight);
					label.setForeground(SystemColor.textHighlightText);				
				}
			});
			textPanelForIntHeader.add(label);
			vectorForIntLabels.add(label);
		}

		for(int i=0;i<sizeExt;i++){
			final JLabel label = new JLabel();
			label.setText("test"+i);
			label.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 5, Color.white));
			label.addMouseListener(new MouseAdapter(){
				public void mouseClicked(MouseEvent e){
					for(int j=0;j<sizeExt;j++){
						((JLabel) vectorForExtLabels.get(j)).setOpaque(false);
						((JLabel) vectorForExtLabels.get(j)).setForeground(Color.black);
						((JLabel) vectorForExtLabels.get(j)).setBackground(Color.white);
						((JLabel) vectorForExtLabels.get(j)).repaint();
					}
					for(int k=0;k<size;k++){
						if(((JLabel) vectorForIntLabels.get(k)).getBackground().toString().contains("java.awt.SystemColor")){
							if(!mapping.containsKey(((JLabel) vectorForIntLabels.get(k)).getText())&&!mapping.containsValue(label.getText())){
								shouldPaint=true;
								Vector pointVector = new Vector();
								pointVector.add(((JLabel) vectorForIntLabels.get(k)).getX());
								pointVector.add(((JLabel) vectorForIntLabels.get(k)).getY());
								pointVector.add(label.getX());
								pointVector.add(label.getY());
								lineCache.add(pointVector);
								mapping.put(((JLabel) vectorForIntLabels.get(k)).getText(), label.getText());
								panelForPaint.setCordinates(((JLabel) vectorForIntLabels.get(k)).getX(), ((JLabel) vectorForIntLabels.get(k)).getY(),label.getX(), label.getY());
								panelForPaint.paintComponent(panelForPaint.getGraphics());
							}
						}
					}
					for(int j=0;j<size;j++){
						((JLabel) vectorForIntLabels.get(j)).setOpaque(false);
						((JLabel) vectorForIntLabels.get(j)).setForeground(Color.black);
						((JLabel) vectorForIntLabels.get(j)).setBackground(Color.white);
						((JLabel) vectorForIntLabels.get(j)).repaint();
					}
					label.setOpaque(true);
					label.setBackground(SystemColor.textHighlight);
					label.setForeground(SystemColor.textHighlightText);				
				}
			});
			textPanelForExtHeader.add(label);
			vectorForExtLabels.add(label);
		}

		JPanel panelForPanels = new JPanel();
		panelForPanels.setLayout(new BorderLayout());
		JScrollPane scrollPaneForInt = new JScrollPane(textPanelForIntHeader,ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPaneForInt.setPreferredSize(new Dimension(120,200));

		final JScrollPane scrollPaneForExt = new JScrollPane(textPanelForExtHeader,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPaneForExt.setPreferredSize(new Dimension(120,200));
		valueOfScrollBar = scrollPaneForExt.getVerticalScrollBar().getValue();
		scrollPaneForExt.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener(){
			public void adjustmentValueChanged( AdjustmentEvent e){
				deleteAll=true;
				Vector pointVector = new Vector();
				int size = lineCache.size();
				System.out.println("e.Value:"+e.getValue());
				System.out.println("value:"+valueOfScrollBar);
				System.out.println("y der scrollbar:"+scrollPaneForExt.getVerticalScrollBar().getValue());
				System.out.println("Max:"+scrollPaneForExt.getVerticalScrollBar().getMaximum());
				System.out.println("Min:"+scrollPaneForExt.getVerticalScrollBar().getMinimum());
				for(int k=0;k<size;k++){
					pointVector = (Vector) lineCache.get(k);
					if(valueOfScrollBar!=scrollPaneForExt.getVerticalScrollBar().getValue()){
						if(valueOfScrollBar<e.getValue()){
							pointVector.set(3, ((Integer)pointVector.get(3))-(scrollPaneForExt.getVerticalScrollBar().getValue()-valueOfScrollBar));
							pointVector.set(3,(Integer)(pointVector.get(3))-1);
						}
						else{
							if(e.getValue()<scrollPaneForExt.getVerticalScrollBar().getMaximum()&&e.getValue()!=0){
								pointVector.set(3, ((Integer)pointVector.get(3))+(valueOfScrollBar-scrollPaneForExt.getVerticalScrollBar().getValue()));
								pointVector.set(3,(Integer)(pointVector.get(3))+1);
							}
						}
						lineCache.remove(k);
						lineCache.add(pointVector);
					}
				}	
				valueOfScrollBar=e.getValue();
				panelForPaint.paintComponent(panelForPaint.getGraphics());
			}
		});

		panelForPanels.add("West",scrollPaneForInt);
		panelForPanels.add("Center",panelForPaint);
		panelForPanels.add("East",scrollPaneForExt);

		JPanel panelForNorth = new JPanel();
		panelForNorth.setPreferredSize(new Dimension(100,320));
		panelForNorth.setBackground(Color.lightGray);

		JPanel panelForSouth = new JPanel();
		panelForSouth.setPreferredSize(new Dimension(100,320));
		panelForSouth.setBackground(Color.lightGray);

		panelForBackground.add("North", panelForNorth);
		panelForBackground.add("South", panelForSouth);
		panelForBackground.add("West", emptyLeftPanel);
		panelForBackground.add("East", emptyRightPanel);
		panelForBackground.add("Center",panelForPanels);
		frame.add(panelForBackground);
		frame.setVisible(true);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Panels panels = new Panels();
		panels.init();

	}

	class Panel extends JPanel{
		private int x;
		private int y;
		private int x2;
		private int y2;

		public void setCordinates(int x, int y, int x2, int y2){
			this.x=x;
			this.y=y;
			this.x2=x2;
			this.y2=y2;
		}

		public void paintComponent(Graphics g){
			super.paintComponents(g);
			Graphics2D g2d = (Graphics2D) g;
			if(deleteAll){
				g2d.clearRect(0, 0, 200, 200);
				deleteAll=false;
			}
			if(shouldPaint){
				int size = lineCache.size();
				for(int i=0;i<size;i++){
					Vector pointVector=(Vector) lineCache.get(i);
					g2d.drawLine((Integer)pointVector.get(0), ((Integer)pointVector.get(1))+12, ((Integer)pointVector.get(2))+80, ((Integer)pointVector.get(3))+12);
				}
			}
		}
	}

}
 

André Uhres

Top Contributor
Irgendwie gefällt mir das mit den Linien nicht. Vielleicht hat jemand eine bessere Idee für mich. Ich möchte einfach die verschiedenen Spalten einer Tabelle in Excel oder Access meiner Tabelle zuweisen lassen, jedoch können die Spalten eben auch in einer anderen Reihenfolge vorliegen.
Ich würde wohl einfach zwei JTable nehmen mit jeweils zwei Spalten, eine für die eigenen Namen und die andere für die zugeordneten Namen. Beim zweiten Klick wird dann jeweils die zweite Spalte der ausgewälten Zeile von jeder JTable mit dem selektierten Namen der gegenüber liegenden JTable belegt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Abstand zwischen AnchorPane und Labels in dem HBox halten AWT, Swing, JavaFX & SWT 1
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
S Labels abfragen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
K Swing labels anpassen AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
X Swing Per Button die Labels und Textfelder auslesen AWT, Swing, JavaFX & SWT 8
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Buttons/Labels auf GUI positionieren AWT, Swing, JavaFX & SWT 2
X Swing setContentPane verdeckt mir alle Buttons Labels etc... AWT, Swing, JavaFX & SWT 14
D Wie kann ich Buttons und Labels besser anordnen AWT, Swing, JavaFX & SWT 4
V JTabbedPane Eingefügte Labels verschoben AWT, Swing, JavaFX & SWT 2
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
K Hilfe bei Labels AWT, Swing, JavaFX & SWT 3
K richtiges Ausrichten mehrerer Labels AWT, Swing, JavaFX & SWT 3
R Größe eines Labels bei GridBagLayout festlegen AWT, Swing, JavaFX & SWT 9
alex_fairytail LayoutManager NullLayout überlappende Labels werden nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Swing Positionierung eines Labels in einem Panel AWT, Swing, JavaFX & SWT 2
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
A Swing JFrame vergrößert sich immer bei setText() eines Labels AWT, Swing, JavaFX & SWT 3
D LayoutManager GridLayout, 2 labels nebeneinander AWT, Swing, JavaFX & SWT 8
B bin am verzweifeln, will auf knopfdruck durch ne überprüfung die labels unsichtbar machen AWT, Swing, JavaFX & SWT 2
K Swing Labels & Buttons auf Frame AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
M AWT TextFelder und Labels nicht ausgerichtet AWT, Swing, JavaFX & SWT 6
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
N Formular mit GridBaglayout und Abstände von Labels AWT, Swing, JavaFX & SWT 2
P SWT Composite und viele Labels AWT, Swing, JavaFX & SWT 10
G Frage zu Labels mit html AWT, Swing, JavaFX & SWT 3
S Labels und Button übereinander --> Reihenfolge? AWT, Swing, JavaFX & SWT 4
G Text eines Labels verändern? AWT, Swing, JavaFX & SWT 4
G Button vor Labels? AWT, Swing, JavaFX & SWT 5
H Labels mit setter-Methode modifizieren AWT, Swing, JavaFX & SWT 9
T Warum nehmen diese Labels die Hintergrundfarbe nicht an? AWT, Swing, JavaFX & SWT 6
T Labels gleichzeitig bewegen und anklicken AWT, Swing, JavaFX & SWT 3
S Position von Labels, Buttons, etc. festsetzen und Scrollen AWT, Swing, JavaFX & SWT 4
A Zeichnen auf zwei Labels. Geht nit AWT, Swing, JavaFX & SWT 7
D Zurücksetzen des Labels funtioniert nicht AWT, Swing, JavaFX & SWT 6
Landei Labels in Box linksbündig ausrichten AWT, Swing, JavaFX & SWT 15
P Hintergrund eines Labels/Panels setzen AWT, Swing, JavaFX & SWT 3
G der sinn von labels/jlabels ? AWT, Swing, JavaFX & SWT 3
L Labels verschwinden! AWT, Swing, JavaFX & SWT 10
D JPanlels und Labels. AWT, Swing, JavaFX & SWT 7
T Labels verschieben / Flackern AWT, Swing, JavaFX & SWT 2
E GridLayout auf ScrollPane AWT, Swing, JavaFX & SWT 4
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
TheWhiteShadow JavaFX ScrollPane nimmt nicht genug platz ein AWT, Swing, JavaFX & SWT 3
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
E JavaFX Cursor-Position im ScrollPane AWT, Swing, JavaFX & SWT 0
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C JavaFX ScrollPane schießt über das Ziel hinaus... AWT, Swing, JavaFX & SWT 1
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
T JavaFX Zoom in ScrollPane AWT, Swing, JavaFX & SWT 1
L Java FX Scrollpane automatisch resizen AWT, Swing, JavaFX & SWT 3
P Java ScrollPane und ViewPort AWT, Swing, JavaFX & SWT 2
M JavaFX Scrollpane: Style von Contentpanel default AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
O ScrollPane AWT, Swing, JavaFX & SWT 2
W JavaFX Scrollpane elementweise scrollen AWT, Swing, JavaFX & SWT 4
M SWT ScrollPane Größe zu klein AWT, Swing, JavaFX & SWT 6
Z Swing Welcher Layoutmanager bei ScrollPane? AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
Bluedaishi Synchrone ScrollPane trennen AWT, Swing, JavaFX & SWT 2
G JTable als fixierte Spalte in Scrollpane scrollt nicht mit... AWT, Swing, JavaFX & SWT 1
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
W Swing Zum Ende einer Scrollpane scrollen AWT, Swing, JavaFX & SWT 2
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0
Kenan89 Vertikal und horizontal zentrierter Pane in ScrollPane AWT, Swing, JavaFX & SWT 5
Kenan89 Java FX ScrollPane Content mittig setzen AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
O Swing GroupLayout und Scrollpane AWT, Swing, JavaFX & SWT 3
T scrollpane taucht nicht auf AWT, Swing, JavaFX & SWT 6
D Zoom zur Mouseposition in ScrollPane AWT, Swing, JavaFX & SWT 5
F AWT ScrollPane Problem AWT, Swing, JavaFX & SWT 3
S Swing Bild in JPanel in ScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 2
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
D JTable in Scrollpane AWT, Swing, JavaFX & SWT 3
H ScrollPane AWT, Swing, JavaFX & SWT 3
0 JTable im ScrollPane AWT, Swing, JavaFX & SWT 3
S Swing Scrollpane und JTables AWT, Swing, JavaFX & SWT 6
D Swing JList: ScrollPane auf JPanel ansprechen AWT, Swing, JavaFX & SWT 7
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
_dp Swing ScrollPane unterschlägt Großteil der Tabelle AWT, Swing, JavaFX & SWT 7
T ScrollPane Lösgelöst vom JPanel?!? AWT, Swing, JavaFX & SWT 4
D Panel zu Scrollpane adden AWT, Swing, JavaFX & SWT 8
T LayoutManager Panel in Scrollpane mittig ausrichten AWT, Swing, JavaFX & SWT 2
E JList in ScrollPane auf größe bringen AWT, Swing, JavaFX & SWT 5
A ScrollPane + internalFrame AWT, Swing, JavaFX & SWT 2
H ScrollPane scrollt ungefragt drauf los! AWT, Swing, JavaFX & SWT 5
T ScrollPane scrollt nicht einwandfrei AWT, Swing, JavaFX & SWT 3
G ScrollPane: getPreferredSize() AWT, Swing, JavaFX & SWT 11
P ScrollPane klappt zusammen beim verkleinern des Frames AWT, Swing, JavaFX & SWT 2
S Swing JTree in ScrollPane einen ToolTip geben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben