Hallo liebe Gemeinde,
ich habe folgendes Problem. Ich habe eine JScrollPane mit einem JPanel in das Canvas gelegt werden.
Wenn ich nun mehr Canvas habe als das JPanel groß ist brechen diese beim Scrollen kurzzeititg aus (nach oben und unten) und alles flackert.
Hat jemand eine Idee wie ich das beheben kann?
lg
ich habe folgendes Problem. Ich habe eine JScrollPane mit einem JPanel in das Canvas gelegt werden.
Wenn ich nun mehr Canvas habe als das JPanel groß ist brechen diese beim Scrollen kurzzeititg aus (nach oben und unten) und alles flackert.
Hat jemand eine Idee wie ich das beheben kann?
lg
Java:
public class GUI extends JFrame
{
JPanel p = null;
JScrollPane scroll = null;
public GUI(Server server)
{
setSize(1000, 800);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
panel.setLayout(null);
p = new JPanel();
p.setBackground(Color.WHITE);
p.setLayout(new TreeLayout());
p.setDoubleBuffered(true);
scroll = new JScrollPane(localTree);
scroll.setMaximumSize(new Dimension(400,500));
scroll.setWheelScrollingEnabled(true);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setDoubleBuffered(true);
scroll.setBackground(Color.WHITE);
scroll.getVerticalScrollBar().setUnitIncrement(20);
scroll.setBounds(5, 50, 400, 500);
panel.add(scroll);
add(panel);
setVisible(true);
int anchor = 1;
TreeRender tr = null;
tr = new TreeRender("A");
p.add(""+anchor,tr);
tr = new TreeRender("B");
p.add(""+anchor,tr);
tr = new TreeRender("C");
p.add(""+anchor,tr);
//usw. usw.
p.validate();
scroll.validate();
scroll.getViewport().updateUI();
}
}
public class TreeRender extends Canvas implements MouseListener
{
static FontMetrics metrics;
String name = "";
public TreeRender(String name)
{
this.name = name;
if(metrics == null)
{
metrics = getFontMetrics(new Font("Helvetica", Font.BOLD, 15));
}
addMouseListener(this);
}
public void paint(Graphics g)
{
g.setColor(new Color(0,0,0));
setBackground(new Color(255,255,255));
g.setFont(new Font("Helvetica", Font.BOLD, 15));
g.drawString(this.name, 20, metrics.getMaxAscent());
}
public Dimension getPreferredSize()
{
return new Dimension(350,metrics.getMaxAscent()+metrics.getMaxDescent());
}
public Dimension getMinumumSize()
{
return getPreferredSize();
}
}
public class TreeLayout implements LayoutManager
{
protected Vector levels, comps;
protected final static int DEFAULT_INDENT = 5;
protected int indent;
public TreeLayout()
{
this(DEFAULT_INDENT);
}
public TreeLayout(int indent)
{
levels = new Vector();
comps = new Vector();
setIndent(indent);
}
public void setIndent(int indent)
{
this.indent = indent;
}
public int getIndent()
{
return indent;
}
protected int getIndentFor(Component c)
{
return ((Integer)levels.elementAt(comps.indexOf(c))).intValue()*getIndent();
}
public void addLayoutComponent(String level,Component comp)
{
Integer i;
try
{
i = new Integer(level);
}
catch(NumberFormatException e) {throw new IllegalArgumentException("Illegal level");}
levels.addElement(i);
comps.addElement(comp);
}
public void removeLayoutComponent(Component comp)
{
int i = comps.indexOf(comp);
if (i != -1)
{
levels.removeElementAt(i);
comps.removeElementAt(i);
}
}
public Dimension preferredLayoutSize(Container parent)
{
return minimumLayoutSize(parent);
}
public Dimension minimumLayoutSize(Container parent)
{
Component c;
int indent;
Dimension d = new Dimension();
Dimension componentDim;
for(int i=0; i < parent.getComponentCount(); i++)
{
c = parent.getComponent(i);
componentDim = c.getMinimumSize();
indent = getIndentFor(c);
d.width = Math.max(d.width, componentDim.width+indent);
d.height += componentDim.height;
}
return d;
}
public void layoutContainer(Container parent)
{
Component c;
int y = 0;
for(int i=0; i < parent.getComponentCount(); i++)
{
c = parent.getComponent(i);
c.setBounds(getIndentFor(c), y, c.getPreferredSize().width,c.getPreferredSize().height);
y += c.getPreferredSize().height;
}
}
}