Hallo!
Ich verwende zum ersten Mal ein JScrollPane. Hab mich hier im Forum und in einigen Tutorials schlau gemacht. Ganz durchgestiegen bin ich aber noch nicht, denn es gibt ein Problem, dass ich bisher nicht lösen konnte:
Mein JScrollPane enthält ein von JPanel abgeleitetes Objekt. Dieses wird auch ohne Probleme dargestellt und man kann sogar scrollen. Allerdings "verschmiert" das Bild und wird scheinbar nicht neu gezeichnet.
Muss ich in meinem von JPanel abgeleiteten Objekt das Interface Scrollable implementieren? Wenn ja: wie?
Es folgen Code von Applikation (enthält JScrollPane) und View (von JPanel abgeleitetes Objekt).
Ich verwende zum ersten Mal ein JScrollPane. Hab mich hier im Forum und in einigen Tutorials schlau gemacht. Ganz durchgestiegen bin ich aber noch nicht, denn es gibt ein Problem, dass ich bisher nicht lösen konnte:
Mein JScrollPane enthält ein von JPanel abgeleitetes Objekt. Dieses wird auch ohne Probleme dargestellt und man kann sogar scrollen. Allerdings "verschmiert" das Bild und wird scheinbar nicht neu gezeichnet.
Muss ich in meinem von JPanel abgeleiteten Objekt das Interface Scrollable implementieren? Wenn ja: wie?
Es folgen Code von Applikation (enthält JScrollPane) und View (von JPanel abgeleitetes Objekt).
Code:
/*
* Output.java
*
* Created on 25. Mai 2006, 16:58
*/
package eq;
import java.awt.Dimension;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import javax.swing.JFrame;
/**
* @author Andreas Wittig
*/
public class Application extends javax.swing.JFrame {
/** Creates new form Output */
public Application() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
view1 = new eq.View();
jMenuBar1 = new javax.swing.JMenuBar();
jMenuFile = new javax.swing.JMenu();
jMenuItemOpen = new javax.swing.JMenuItem();
jMenuItemLoad = new javax.swing.JMenuItem();
jMenuExport = new javax.swing.JMenu();
jMenuItemToXML = new javax.swing.JMenuItem();
jMenuItemToCVS = new javax.swing.JMenuItem();
jMenuItemToGoogleMaps = new javax.swing.JMenuItem();
jMenuItemPrint = new javax.swing.JMenuItem();
jMenuItemExit = new javax.swing.JMenuItem();
jMenuEdit = new javax.swing.JMenu();
jMenuItemCopy = new javax.swing.JMenuItem();
jMenuItemPaste = new javax.swing.JMenuItem();
jMenuItemDelete = new javax.swing.JMenuItem();
jMenuItemSearch = new javax.swing.JMenuItem();
jMenuView = new javax.swing.JMenu();
jMenuItemZoomIn = new javax.swing.JMenuItem();
jMenuItemZoomOut = new javax.swing.JMenuItem();
jMenuItemMove = new javax.swing.JMenuItem();
jMenuItemGoogleEarth = new javax.swing.JMenuItem();
jMenuHelp = new javax.swing.JMenu();
jMenuItemHelp = new javax.swing.JMenuItem();
jMenuItemAbout = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Earthquake");
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
formMouseMoved(evt);
}
});
jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane1.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
jScrollPane1ComponentResized(evt);
}
});
jScrollPane1.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
jScrollPane1PropertyChange(evt);
}
});
jScrollPane1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseExited(java.awt.event.MouseEvent evt) {
jScrollPane1MouseExited(evt);
}
});
view1.setDoubleBuffered(false);
view1.setPreferredSize(new java.awt.Dimension(1200, 1200));
org.jdesktop.layout.GroupLayout view1Layout = new org.jdesktop.layout.GroupLayout(view1);
view1.setLayout(view1Layout);
view1Layout.setHorizontalGroup(
view1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 402, Short.MAX_VALUE)
);
view1Layout.setVerticalGroup(
view1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 311, Short.MAX_VALUE)
);
jScrollPane1.setViewportView(view1);
jMenuFile.setLabel("Datei");
jMenuFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuFileActionPerformed(evt);
}
});
jMenuItemOpen.setText("\u00d6ffnen");
jMenuFile.add(jMenuItemOpen);
jMenuItemLoad.setText("Laden (WWW)");
jMenuFile.add(jMenuItemLoad);
jMenuExport.setText("Exportieren");
jMenuItemToXML.setText("nach XML");
jMenuExport.add(jMenuItemToXML);
jMenuItemToCVS.setText("nach CVS");
jMenuExport.add(jMenuItemToCVS);
jMenuItemToGoogleMaps.setText("nach Google Maps");
jMenuItemToGoogleMaps.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemToGoogleMapsActionPerformed(evt);
}
});
jMenuExport.add(jMenuItemToGoogleMaps);
jMenuFile.add(jMenuExport);
jMenuItemPrint.setText("Drucken");
jMenuFile.add(jMenuItemPrint);
jMenuItemExit.setText("Beenden");
jMenuFile.add(jMenuItemExit);
jMenuBar1.add(jMenuFile);
jMenuEdit.setLabel("Bearbeiten");
jMenuItemCopy.setText("Kopieren");
jMenuEdit.add(jMenuItemCopy);
jMenuItemPaste.setText("Einf\u00fcgen");
jMenuEdit.add(jMenuItemPaste);
jMenuItemDelete.setText("L\u00f6schen");
jMenuEdit.add(jMenuItemDelete);
jMenuItemSearch.setText("Suchen");
jMenuEdit.add(jMenuItemSearch);
jMenuBar1.add(jMenuEdit);
jMenuView.setText("Ansicht");
jMenuItemZoomIn.setText("Zoom +");
jMenuItemZoomIn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemZoomInActionPerformed(evt);
}
});
jMenuView.add(jMenuItemZoomIn);
jMenuItemZoomOut.setText("Zoom -");
jMenuItemZoomOut.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemZoomOutActionPerformed(evt);
}
});
jMenuView.add(jMenuItemZoomOut);
jMenuItemMove.setText("Verschieben");
jMenuView.add(jMenuItemMove);
jMenuItemGoogleEarth.setText("Google Earth");
jMenuView.add(jMenuItemGoogleEarth);
jMenuBar1.add(jMenuView);
jMenuHelp.setText("Hilfe");
jMenuItemHelp.setText("Hilfe");
jMenuHelp.add(jMenuItemHelp);
jMenuItemAbout.setText("\u00dcber");
jMenuItemAbout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemAboutActionPerformed(evt);
}
});
jMenuHelp.add(jMenuItemAbout);
jMenuBar1.add(jMenuHelp);
setJMenuBar(jMenuBar1);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 329, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
private void jScrollPane1ComponentResized(java.awt.event.ComponentEvent evt) {
// TODO add your handling code here:
}
private void jScrollPane1MouseExited(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
}
private void jScrollPane1PropertyChange(java.beans.PropertyChangeEvent evt) {
}
private void jMenuItemZoomOutActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
view1.decreaseZoom();
int widht = view1.getWidth() * view1.getZoom();
int height = view1.getHeight() * view1.getZoom();
view1.setPreferredSize(new Dimension(widht,height));
}
private void jMenuItemZoomInActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
view1.increaseZoom();
int widht = view1.getWidth() * view1.getZoom();
int height = view1.getHeight() * view1.getZoom();
view1.setPreferredSize(new Dimension(widht,height));
}
private void jMenuItemAboutActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jMenuItemToGoogleMapsActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void formMouseMoved(java.awt.event.MouseEvent evt) {
}
private void jMenuFileActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Application().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenu jMenuEdit;
private javax.swing.JMenu jMenuExport;
private javax.swing.JMenu jMenuFile;
private javax.swing.JMenu jMenuHelp;
private javax.swing.JMenuItem jMenuItemAbout;
private javax.swing.JMenuItem jMenuItemCopy;
private javax.swing.JMenuItem jMenuItemDelete;
private javax.swing.JMenuItem jMenuItemExit;
private javax.swing.JMenuItem jMenuItemGoogleEarth;
private javax.swing.JMenuItem jMenuItemHelp;
private javax.swing.JMenuItem jMenuItemLoad;
private javax.swing.JMenuItem jMenuItemMove;
private javax.swing.JMenuItem jMenuItemOpen;
private javax.swing.JMenuItem jMenuItemPaste;
private javax.swing.JMenuItem jMenuItemPrint;
private javax.swing.JMenuItem jMenuItemSearch;
private javax.swing.JMenuItem jMenuItemToCVS;
private javax.swing.JMenuItem jMenuItemToGoogleMaps;
private javax.swing.JMenuItem jMenuItemToXML;
private javax.swing.JMenuItem jMenuItemZoomIn;
private javax.swing.JMenuItem jMenuItemZoomOut;
private javax.swing.JMenu jMenuView;
private javax.swing.JScrollPane jScrollPane1;
private eq.View view1;
// End of variables declaration
}
Code:
/*
* Map.java
*
* Created on 26. Mai 2006, 10:31
*/
package eq;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.Scrollable;
/**
*
* @author Andreas Wittig
*/
public class View extends JPanel {
/** Creates a new instance of Map */
public View() {
super();
}
private Dimension Size = this.getPreferredSize();
private int Zoom = 1;
public void increaseZoom () {
this.Zoom = this.Zoom + 1;
int x = (int)(this.Size.getWidth() * this.Zoom);
int y = (int)(this.Size.getHeight() * this.Zoom);
this.setPreferredSize(new Dimension(x,y));
this.repaint();
}
public void decreaseZoom () {
if ( this.Zoom > 1) {
this.Zoom = this.Zoom - 1;
int x = (int)(this.Size.getWidth() * this.Zoom);
int y = (int)(this.Size.getHeight() * this.Zoom);
this.setPreferredSize(new Dimension(x,y));
this.repaint();
}
}
public int getZoom() {
return this.Zoom;
}
public void paint(Graphics g) {
// Zeichnet Koordinaten der Erdbeben ein
Iterator<Earthquake> it = ModelEarthquake.getFile().getEarthqauakes();
g.setColor(Color.RED);
while (it.hasNext() ) {
Earthquake eq = it.next();
g.drawRect(getXfromLong(eq.getLongitude()),getYfromLat(eq.getLatitude()),5,5);
}
// Zeichnet Länderumrisse ein
Iterator<Country> itCountries = ModelCountry.getFile().getIterator();
g.setColor(Color.BLACK);
while ( itCountries.hasNext() ) {
Country country = itCountries.next();
Vector<ReferencePoint> vecReferencePoint = country.getVector();
int[] x = new int[vecReferencePoint.size()];
int[] y = new int[vecReferencePoint.size()];
Iterator<ReferencePoint> itReferencePoint = vecReferencePoint.iterator();
int n = 0;
while ( itReferencePoint.hasNext() ) {
ReferencePoint point = itReferencePoint.next();
x[n] = this.getXfromLong(point.getLongitude());
y[n] = this.getYfromLat(point.getLatitude());
n++;
}
g.drawPolygon(x,y,vecReferencePoint.size());
}
g.dispose();
}
public int getXfromLong(double lon) {
double xfac = this.getWidth() / (360);
double x = ((Math.abs(ModelEarthquake.getFile().getLongitudeMin()) + lon) * xfac);
return (int)x*this.Zoom;
}
public int getYfromLat(double lat) {
double yfac = this.getHeight() / (180);
double y = ((180 - (Math.abs(ModelEarthquake.getFile().getLatitudeMin()) + lat)) * yfac);
return (int)y*this.Zoom;
}
}