V
_Volker_
Gast
Tag Freunde,
ich erlaube mir hier mal den Beispielcode aus dem sehr guten Manning Swing Buch abzubilden. Bitte führt das Beispiel mal aus und ersetzt das Bild, das im Scrollpane angezeigt wird.
Ich möchte nun einen Custom Row- und Columnheader, der auch im Abstand von 10 px eine kürzere Line zeichnet. Ansonsten soll es so blieben wie es ist.
Ich habe alle möglichen Abfragen und Schleifenkonstrukte probiert, ich kriege das einfach nicht hin, bzw. wenn es richtig dargestellt wird, dann verschwinden die Linien beim Scrollen oder es sieht eben sonst nicht richtig aus.
Kann mir jemand algoritmisch auf die Sprünge helfen
Bestimmt ist die Sache einfach, aber bevor ich noch Stunden damit verbringen, frage ich lieber mal. Kapier einfach nicht die beiden Schleifen richtig.
Vielen vielen Dank.
Volker
ich erlaube mir hier mal den Beispielcode aus dem sehr guten Manning Swing Buch abzubilden. Bitte führt das Beispiel mal aus und ersetzt das Bild, das im Scrollpane angezeigt wird.
Code:
/**
* Copyright 1999-2002 Matthew Robinson and Pavel Vorobiev.
* All Rights Reserved.
*
* ===================================================
* This program contains code from the book "Swing"
* 2nd Edition by Matthew Robinson and Pavel Vorobiev
* [url]http://www.spindoczine.com/sbe[/url]
* ===================================================
*
* The above paragraph must be included in full, unmodified
* and completely intact in the beginning of any source code
* file that references, copies or uses (in any way, shape
* or form) code contained in this file.
*/
import java.awt.*;
import javax.swing.*;
import javax.swing.border.SoftBevelBorder;
public class HeaderDemo
extends JFrame {
private JLabel label;
public HeaderDemo() {
super("Header Demo");
ImageIcon ii = new ImageIcon("Unbenannt.gif");
label = new JLabel(ii);
JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
p.add(label); // Use extra container to avoid shift relative to headers
JScrollPane jsp = new JScrollPane(label);
jsp.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
JLabel[] corners = new JLabel[4];
for(int i=0;i<4;i++) {
corners[i] = new JLabel();
corners[i].setOpaque(true);
corners[i].setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(2,2,2,2),
BorderFactory.createLineBorder(Color.black, 1)));
}
JLabel rowheader = new JLabel() {
Font f = new Font( "SansSerif", Font.PLAIN, 10);
public void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle r = g.getClipBounds();
g.setFont(f);
g.setColor(Color.black);
for (int i = 50-(r.y % 50);i<r.height;i+=50) {
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)label.getPreferredSize().getHeight());
}
};
rowheader.setOpaque(true);
rowheader.setBorder(new SoftBevelBorder(0));
JLabel columnheader = new JLabel() {
Font f = new Font( "SansSerif", Font.PLAIN, 10);
public void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle r = g.getClipBounds();
g.setFont(f);
g.setColor(Color.black);
for (int i = 50-(r.x % 50);i<r.width;i+=50) {
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)label.getPreferredSize().getWidth(),35);
}
};
columnheader.setOpaque(true);
// columnheader.setBackground(Color.LIGHT_GRAY);
columnheader.setBorder(new SoftBevelBorder(0));
jsp.setRowHeaderView(rowheader);
jsp.setColumnHeaderView(columnheader);
jsp.setCorner(JScrollPane.LOWER_LEFT_CORNER, corners[0]);
jsp.setCorner(JScrollPane.LOWER_RIGHT_CORNER, corners[1]);
jsp.setCorner(JScrollPane.UPPER_LEFT_CORNER, corners[2]);
jsp.setCorner(JScrollPane.UPPER_RIGHT_CORNER, corners[3]);
getContentPane().add(new JLabel(" "), BorderLayout.NORTH);
getContentPane().add(jsp, BorderLayout.CENTER);
getContentPane().add(new JLabel(" "), BorderLayout.WEST);
getContentPane().add(new JLabel(" "), BorderLayout.EAST);
getContentPane().add(new JLabel(" "), BorderLayout.SOUTH);
setSize(400,300);
}
public static void main(String[] args) {
HeaderDemo frame = new HeaderDemo();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Ich möchte nun einen Custom Row- und Columnheader, der auch im Abstand von 10 px eine kürzere Line zeichnet. Ansonsten soll es so blieben wie es ist.
Ich habe alle möglichen Abfragen und Schleifenkonstrukte probiert, ich kriege das einfach nicht hin, bzw. wenn es richtig dargestellt wird, dann verschwinden die Linien beim Scrollen oder es sieht eben sonst nicht richtig aus.
Kann mir jemand algoritmisch auf die Sprünge helfen
Bestimmt ist die Sache einfach, aber bevor ich noch Stunden damit verbringen, frage ich lieber mal. Kapier einfach nicht die beiden Schleifen richtig.
Vielen vielen Dank.
Volker