Row und ColumnHeader in ScrollPane werden "verwischt&qu

  • Themenstarter Themenstarter Klaus(x)
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

Klaus(x)

Gast
Hallo ,
eine Frage zu repaint() bzw. revalidate().
Wenn ich in meiner Swing Anwendung verschiedene Dialoge über der ScollPane bzw. über deren Header aufpoppen lasse, dort meine Daten eingebe und anschließend den Dialog schließe bzw das Fenster hin und her schiebe, sind immer die Balken der Header 'verwischt'. Ich vermute mal, das hängt mit den obigen beiden Methoden zusammen. Wann bzw. wo muss ich die denn setzen, damit sie grundsätzlich nicht mehr von darüber liegenden Komponenten oder zB beim Aufklappen einer JComboBox, welche sich über den ColumnHeader erstreckt, zerschossen werden ?


Gruß aus Hamburg.
 
Hallo,
hier ein Beispiel. Wie verhinder ich, dass beim Auswählen meiner leckeren Mahlzeit, ein Teil des darunterliegenden ScrollPane Headers verwischt (einige Balken des Headers verschwinden und werden erst nach einem erneuten Scrollen wieder angezeigt) wird ?

Code:
package repaint;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;
import javax.swing.border.SoftBevelBorder;

public class ScrollPaneTest extends JFrame {
	public static void main(String args[]) {

		final JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane.setPreferredSize(new Dimension(280, 700));
		tabbedPane.addTab("Tab 1", null);
		tabbedPane.addTab("Tab 2", null);

		JPanel spPanel = new JPanel();		
		spPanel.setPreferredSize(new Dimension(700,700));		
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
				tabbedPane, new CustomScrollPane(spPanel));

		JPanel boxPanel = new JPanel();		
		JComboBox box = new JComboBox(new Object[]{"sülze","schmalz","zwiebelgrütze","sauerkraut","knödel","speck","gurken"});
		boxPanel.add(box);
        box.setPreferredSize(new Dimension(200,20));
		f.add(boxPanel,BorderLayout.NORTH);
		f.add(split, BorderLayout.CENTER);
		f.setSize(800, 600);
		f.setVisible(true);
	}

}

class CustomScrollPane extends JScrollPane {

	private JPanel layerpanel;

	private static final Font f = new Font("SansSerif", Font.PLAIN, 10);

	private static final Color black = Color.BLACK;

	private static final SoftBevelBorder headerBorder = new SoftBevelBorder(0);

	public CustomScrollPane(JPanel component) {

		super(component);
        this.layerpanel = component;
        
        setBorder(new EmptyBorder(50,50,50,50));
		JLabel rowheader = new JLabel() {

			public void paintComponent(Graphics g) {

				super.paintComponent(g);
				Rectangle r = g.getClipBounds();
				g.setFont(f);
				g.setColor(black);

				for (int j = 10; j < 50; j += 10)
					for (int i = 50 - (r.y % 50); i <= r.height; i += 50) {

						g.drawLine(getWidth(), r.y + i - j, 30, r.y + i - j);
						g.drawLine(getWidth(), r.y + i, 25, r.y + i);

						if (r.y + i < 1000)
							g.drawString("" + (r.y + i), 5, r.y + i + 5);
						else
							g.drawString("" + (r.y + i), 0, r.y + i + 5);
					}
			}

			public Dimension getPreferredSize() {
				return new Dimension(35, (int) layerpanel.getSize().getHeight());
			}
		};

		JLabel columnheader = new JLabel() {

			public void paintComponent(Graphics g) {

				super.paintComponent(g);
				Rectangle r = g.getClipBounds();
				g.setFont(f);
				g.setColor(black);

				for (int j = 10; j < 50; j += 10) {
					for (int i = 50 - (r.x % 50); i <= r.width; i += 50) {
						g.drawLine(r.x + i - j, getHeight(), r.x + i - j, 30);
						g.drawString("" + (r.x + i), r.x + i - 10, 15);
						g.drawLine(r.x + i, getHeight(), r.x + i, 20);
					}
				}
			}

			public Dimension getPreferredSize() {
				return new Dimension((int) layerpanel.getSize().getWidth(), 35);
			}
		};

//		 rowheader.setOpaque(true);
//		 rowheader.setBorder(headerBorder);
//		 columnheader.setOpaque(true);
//		 columnheader.setBorder(headerBorder);
		setRowHeaderView(rowheader);
		setColumnHeaderView(columnheader);
	}

}
 
du malst nur in dem aktuellen Cliping-Rectangle, in dem Bereich, der von der ComoBox überdeckt wurde,

und darin rechnest du ja etwas rum, % 50, <= r.width usw,
das führt dazu, dass du nicht über den rechten Rand hinausmalst,
also auch nicht das letzte Stück bis zum Rand hin,

wie genau deine Schleife aussehen sollte kannst du nun erstmal selber überlegen,
ganz grob reichte bei mir ein Sicherheitspuffer:
for (int i = 50 - (r.x % 50); i <= (r.width+100); i += 50) {

einfach bisschen weitermalen, wenn es außehalb des Cliping liegt, stört das ja nicht (oder doch? 😉 )
 
Ah ok, das ist doch schonmal was. hatte es nun so gelöst, ist wohl aber auch nicht so optimal ???:L

Code:
...
box.addActionListener(this);
...
public void actionPerformed(ActionEvent e){			
		scrollpane.repaint();
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben