JScrollPane Problem

Hallöschen Leutz,

ich habe ein komplexes RMI Projekt von der Uni aus…deshalb poste ich hier erstmal kein Code.

Nun zum Problem, ich habe ein eine Klasse MyFrame die von JFrame abgeleitet ist. Dort wird auf die ContentPane eine JScrollPane (getter/setter mit public) mit JPanel(getter/setter mit public) aufgelegt. Funktinoniert auch alles wunderbar (Balken werden bei bedarf angezeigt). Jetzt tritt ein Event auf, das von extern den Inhalt des JPanel ändert. Jetzt werden die Scroll-Balken nicht mehr angezeigt bzw. es kommt zu einer fehlerhaften Darstellung (Teile werden „abgeschnitten“ und nicht dargestellt).

mein vorgehen um den Inhalt des JPanel zu ändern.

  1. MyFrame.getJpanel().removeAll();
  2. MyFrame.getJPanel().add(Irgendwas, constr); constr=>GridBagConstraints fürs Layout
  3. MyFrame.pack();

Ich habe mir mal die Größe des ViewPorts von der JScrollPane nach der Änderung ausgeben lassen und aus irgenwelchen Gründen ist die MyFrame.getJscrollPane().getViewPort().getSize(): 15x489 Bildpunkte…
Auch wenn ich die Größe des ViewPorts manuell ändere, ist die Darstellung immer noch falsch. Ein updateUI() oder repaint() hat auch nicht geholfen…

Ich hoffe das Ihr mein Problem nachvollziehen könnt.
Wenn Ihr den Sourcecode braucht wird ich auch die relevanten Klassen/Teile posten.

alles wunderbar (Balken werden bei bedarf angezeigt). Jetzt
tritt ein Event auf, das von extern den Inhalt des JPanel
ändert. Jetzt werden die Scroll-Balken nicht mehr angezeigt
bzw. es kommt zu einer fehlerhaften Darstellung (Teile werden
„abgeschnitten“ und nicht dargestellt).

Mach mal ein MyFrame.revalidate() bzw ein MyFrame.getJPanel().revalidate().

P.S: Variablen-Namen schreibt man laut Java Coding Conventions klein, nicht groß.

P.S: Variablen-Namen schreibt man laut Java Coding Conventions
klein, nicht groß.

Da MyFrame ist aber ein Objekt einer selbstgebauten Klasse und hat damit nach Konvention mit einem Großbuchstaben anzufangen. Oder meintest Du das nicht?

Java Coding Conventions
Nein.

„The rules and conventions for naming your variables can be
summarized as follows:
[…]
The convention […] is to always begin your variable names with a
letter […]. If the name you choose consists of only one word, spell
that word in all lowercase letters. If it consists of more than one
word, capitalize the first letter of each subsequent word. The names
gearRatio and currentGear are prime examples of this convention.“

Quelle: http://java.sun.com/docs/books/tutorial/java/nutsand…
Siehe auch: http://java.sun.com/docs/codeconv/html/CodeConventio…

Variablen-Namen werden also klein geschrieben. Dies dient zur Unterscheidung von Klassen- und Interfacenamen (die im Gegensatz dazu groß geschrieben werden) und damit zur Unterscheidung von statischen Methodenaufrufen zu objektbezogenen Methodenaufrufen.

Wenn ich also ein Code-Stück habe wie dieses hier…

someThing.do();
SomeOtherThing.make();

dann weiß ich, dass someThing eine Objektvariable ist und do() daher eine Methode des Objekts. Dagegen kann ich aus obigem Code ableiten, dass make() eine statische Methode der Klasse SomeOtherThing ist. Diese Unterscheidung kann ich nur treffen, da die Coding Conventions Kleinschreibung nur für Variablennamen und Großschreibung für Klassennamen vorsehen.

also erstens ich kenne die Konvention :wink:

zweitens die Code-Schnipsel sind nur Beispiele, in dem Fall waren es statische Methodenaufrufe.

OK, back to topic
Die Methode revalidate() gibt es nicht bei einen JPanel, JFrame

ich poste mal das JFrame mit der JScrollPane+JPanel und eines der externen Zugriffe

package archVerSys.bestellsystem.client.gui;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

public class MyFrame extends JFrame
{
private String securityToken;
private String lookAndFeel;
private MyMenu myMenu;
private JPanel contentPanel;
private JScrollPane scrollPane;

public MyFrame()
{
//this.setLookAndFeel(„com.jgoodies.looks.plastic.PlasticLookAndFeel“);
this.securityToken = „“;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(„O F F L I N E M O D U S“);
this.setPreferredSize(new java.awt.Dimension(500, 500));
this.getContentPane().setLayout(new BorderLayout());
this.setName(„myFrame“);
this.setResizable(true);
}

public void start()
{
contentPanel = new JPanel();
contentPanel.setName(„contentPanel“);
contentPanel.setLayout( new GridBagLayout());

myMenu = new MyMenu(this);
this.setJMenuBar(myMenu);

scrollPane = new JScrollPane(contentPanel);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

this.getContentPane().add(scrollPane, BorderLayout.NORTH);
this.pack();
this.setVisible(true);
}

public String getSecurityToken()
{
return securityToken;
}

public void setSecurityToken(String securityToken)
{
this.securityToken = securityToken;
}

public String getLookAndFeel()
{
return lookAndFeel;
}

public void setLookAndFeel(String lookAndFeel)
{
this.lookAndFeel = lookAndFeel;
try
{
javax.swing.UIManager.setLookAndFeel(this.lookAndFeel);
}
catch(Exception error)
{
error.printStackTrace();
}
}

public JPanel getContentPanel()
{
return contentPanel;
}

public void setContentPanel(JPanel contentPanel)
{
this.contentPanel = contentPanel;
}

public JScrollPane getScrollPane()
{
return scrollPane;
}

public void setScrollPane(JScrollPane scrollPane)
{
this.scrollPane = scrollPane;
}
}

externer Zugriff

package archVerSys.bestellsystem.client.gui.actions;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.AccessException;
import java.rmi.RemoteException;
import java.util.Iterator;

import javax.swing.JOptionPane;

import archVerSys.bestellsystem.client.ServerConnector;
import archVerSys.bestellsystem.client.gui.MyFrame;
import archVerSys.bestellsystem.client.gui.OrderPanel;
import archVerSys.bestellsystem.server.Server;
import archVerSys.bestellsystem.server.basis.Order;
import archVerSys.bestellsystem.server.basis.OrderPosition;

/**
* this adapter receives the action of „view all orders“
* @author Daniel Nitschke
* @version 1.1, build-system: Windows XP, Eclipse WTP3, SUN Java 1.6.0
* @since 19.05.2009
*/
public class ViewAllOrder implements ActionListener
{
/**
* the reference of MyFrame
*/
private MyFrame myFrame;

/**
* the default constructor
*/
public ViewAllOrder()
{
;
}

/**
* the constructor with parameter
* @param myFrame the reference of MyFrame
*/
public ViewAllOrder(MyFrame myFrame)
{
this.myFrame = myFrame;
}

/**
* this method perform the event
* @param event the event
*/
@SuppressWarnings(„deprecation“)
public void actionPerformed(ActionEvent event)
{
if(this.myFrame == null)
{
//for alternatively processing without MyFrame
}
else
{
try
{
Server server = ServerConnector.getServerConnection();
Order[] order = server.getAllOrders(this.myFrame.getSecurityToken());

GridBagLayout thisLayout = new GridBagLayout();
GridBagConstraints constr = new GridBagConstraints();

constr.anchor = GridBagConstraints.NORTHWEST;
constr.gridx = 0;

this.myFrame.getContentPanel().removeAll();
this.myFrame.getContentPanel().setLayout(thisLayout);

for(int i = 0; i iterator = order[i].getOrderPostions();
while(iterator.hasNext())
{
orderPanel.getOrderPositionsPanel().getTableModel().addRow(iterator.next());
}

orderPanel.setPanelStyle(„view“);
constr.gridy = i;
this.myFrame.getContentPanel().add(orderPanel, constr);
}
this.myFrame.pack();
}
catch (AccessException error)
{
System.err.println(„AccessException-ERROR in ViewAllOrder.actionPerformed()“);
System.err.println(error.getCause());
System.err.println(error.getMessage());
this.myFrame.setTitle(„O F F L I N E M O D U S“);
JOptionPane.showMessageDialog(this.myFrame, „Es ist ein Fehler aufgetreten\n(“+error.getCause()+")", „E R R O R“, JOptionPane.ERROR_MESSAGE);
this.myFrame.repaint();
//error.printStackTrace();
}
catch (RemoteException error)
{
System.err.println(„RemoteException-ERROR in ViewAllOrder.actionPerformed()“);
System.err.println(error.getCause());
System.err.println(error.getMessage());
this.myFrame.setTitle(„O F F L I N E M O D U S“);
JOptionPane.showMessageDialog(this.myFrame, „Es ist ein Fehler aufgetreten\n(“+error.getCause()+")", „E R R O R“, JOptionPane.ERROR_MESSAGE);
this.myFrame.repaint();
//error.printStackTrace();
}
}
}
}

OK, back to topic
Die Methode revalidate() gibt es nicht bei einen JPanel,
JFrame

Aber sicher:
http://java.sun.com/javase/6/docs/api/javax/swing/JC…

Eventuell musst du auch noch einen repaint() hinterschicken.

hups, mein Fehler ich habe beim JFrame nach der revalidate() gesucht…

ich habe das Problem behoben.
Das Problem war, das ich der ContentPane einen LayoutManager zu gewissen habe. Als ich von der ContentPane den LayoutManager entfernt habe, und nur einen LayoutManager bei dem JPanel benutzt habe, lief alles wie geschmiert.

package archVerSys.bestellsystem.client.gui;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import archVerSys.bestellsystem.client.ServerConnector;
import archVerSys.bestellsystem.server.Server;
import archVerSys.bestellsystem.server.basis.Order;
import archVerSys.bestellsystem.server.basis.OrderPosition;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.rmi.AccessException;
import java.rmi.RemoteException;
import java.util.Iterator;

public class MyFrame extends JFrame
{
private String securityToken;
private String lookAndFeel;
private MyMenu myMenu;
private JPanel contentPanel;
private JScrollPane scrollPane;

public MyFrame()
{
//this.setLookAndFeel(„com.jgoodies.looks.plastic.PlasticLookAndFeel“);
this.securityToken = „“;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(„O F F L I N E M O D U S“);
this.setPreferredSize(new Dimension(550, 500));
//this.getContentPane().setLayout(new BorderLayout());
this.setName(„myFrame“);
this.setResizable(true);

}

public void start()
{
contentPanel = new JPanel();
contentPanel.setName(„contentPanel“);
contentPanel.setLayout( new GridBagLayout());

myMenu = new MyMenu(this);
this.setJMenuBar(myMenu);

scrollPane = new JScrollPane(contentPanel);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

//this.getContentPane().add(scrollPane, BorderLayout.NORTH);
this.getContentPane().add(scrollPane);
this.pack();
this.setVisible(true);
}

public String getSecurityToken()
{
return securityToken;
}
}