📄 chartpanel.java
字号:
* current scaling applied.
*
* @return the scaled data area.
*/
public Rectangle2D getScaledDataArea() {
Rectangle2D dataArea = this.info.getDataArea();
Insets insets = getInsets();
double x = dataArea.getX() * scaleX + insets.left;
double y = dataArea.getY() * scaleY + insets.top;
double w = dataArea.getWidth() * scaleX;
double h = dataArea.getHeight() * scaleY;
return new Rectangle2D.Double(x, y, w, h);
}
/**
* Draws a vertical line used to trace the mouse position to the horizontal axis.
*
* @param x the x-coordinate of the trace line.
*/
private void drawHorizontalAxisTrace(int x) {
Graphics2D g2 = (Graphics2D) getGraphics();
Rectangle2D dataArea = getScaledDataArea();
g2.setXORMode(java.awt.Color.orange);
if (((int) dataArea.getMinX() < x) && (x < (int) dataArea.getMaxX())) {
if (verticalTraceLine != null) {
g2.draw(verticalTraceLine);
verticalTraceLine.setLine(x, (int) dataArea.getMinY(),
x, (int) dataArea.getMaxY());
}
else {
verticalTraceLine = new Line2D.Float(x, (int) dataArea.getMinY(),
x, (int) dataArea.getMaxY());
}
g2.draw(verticalTraceLine);
}
}
/**
* Draws a horizontal line used to trace the mouse position to the vertical axis.
*
* @param y the y-coordinate of the trace line.
*/
private void drawVerticalAxisTrace(int y) {
Graphics2D g2 = (Graphics2D) getGraphics();
Rectangle2D dataArea = getScaledDataArea();
g2.setXORMode(java.awt.Color.orange);
if (((int) dataArea.getMinY() < y) && (y < (int) dataArea.getMaxY())) {
if (horizontalTraceLine != null) {
g2.draw(horizontalTraceLine);
horizontalTraceLine.setLine((int) dataArea.getMinX(), y,
(int) dataArea.getMaxX(), y);
}
else {
horizontalTraceLine = new Line2D.Float((int) dataArea.getMinX(), y,
(int) dataArea.getMaxX(), y);
}
g2.draw(horizontalTraceLine);
}
}
/**
* Displays a dialog that allows the user to edit the properties for the
* current chart.
*/
private void attemptEditChartProperties() {
ChartPropertyEditPanel panel = new ChartPropertyEditPanel(chart);
int result = JOptionPane.showConfirmDialog(this, panel,
"Chart Properties", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
panel.updateChartProperties(chart);
}
}
/**
* Opens a file chooser and gives the user an opportunity to save the chart
* in PNG format.
*
* @throws IOException if there is an I/O error.
*/
public void doSaveAs() throws IOException {
JFileChooser fileChooser = new JFileChooser();
ExtensionFileFilter filter = new ExtensionFileFilter("PNG Image Files", ".png");
fileChooser.addChoosableFileFilter(filter);
fileChooser.addChoosableFileFilter(new ExtensionFileFilter("All files", ""));
int option = fileChooser.showSaveDialog(this);
if (option == JFileChooser.APPROVE_OPTION) {
String filename = fileChooser.getSelectedFile().getPath();
if (isEnforceFileExtensions()) {
if (!filename.endsWith(".png")) {
filename = filename + ".png";
}
}
ChartUtilities.saveChartAsPNG(new File(filename),
this.chart, getWidth(), getHeight());
}
}
/**
* Creates a print job for the chart.
*/
public void createChartPrintJob() {
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
PageFormat pf2 = job.pageDialog(pf);
if (pf2 != pf) {
job.setPrintable(this, pf2);
if (job.printDialog()) {
try {
job.print();
}
catch (PrinterException e) {
JOptionPane.showMessageDialog(this, e);
}
}
}
}
/**
* Prints the chart on a single page.
*
* @param g the graphics context.
* @param pf the page format to use.
* @param pageIndex the index of the page. If not <code>0</code>, nothing gets print.
*
* @return the result of printing.
*/
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2 = (Graphics2D) g;
double x = pf.getImageableX();
double y = pf.getImageableY();
double w = pf.getImageableWidth();
double h = pf.getImageableHeight();
chart.draw(g2, new Rectangle2D.Double(x, y, w, h), null);
return PAGE_EXISTS;
}
/**
* Adds a listener to the list of objects listening for chart mouse events.
*
* @param listener the listener.
*/
public void addChartMouseListener(ChartMouseListener listener) {
this.chartMouseListeners.add(listener);
}
/**
* Removes a listener from the list of objects listening for chart mouse events.
*
* @param listener the listener.
*/
public void removeChartMouseListener(ChartMouseListener listener) {
this.chartMouseListeners.remove(listener);
}
/**
* Creates a popup menu for the panel.
*
* @param properties include a menu item for the chart property editor.
* @param save include a menu item for saving the chart.
* @param print include a menu item for printing the chart.
* @param zoom include menu items for zooming.
*
* @return The popup menu.
*/
protected JPopupMenu createPopupMenu(boolean properties, boolean save, boolean print,
boolean zoom) {
JPopupMenu result = new JPopupMenu("Chart:");
boolean separator = false;
if (properties) {
JMenuItem propertiesItem = new JMenuItem("Properties...");
propertiesItem.setActionCommand(PROPERTIES_ACTION_COMMAND);
propertiesItem.addActionListener(this);
result.add(propertiesItem);
separator = true;
}
if (save) {
if (separator) {
result.addSeparator();
separator = false;
}
JMenuItem saveItem = new JMenuItem("Save as...");
saveItem.setActionCommand(SAVE_ACTION_COMMAND);
saveItem.addActionListener(this);
result.add(saveItem);
separator = true;
}
if (print) {
if (separator) {
result.addSeparator();
separator = false;
}
JMenuItem printItem = new JMenuItem("Print...");
printItem.setActionCommand(PRINT_ACTION_COMMAND);
printItem.addActionListener(this);
result.add(printItem);
separator = true;
}
if (zoom) {
if (separator) {
result.addSeparator();
separator = false;
}
JMenu zoomInMenu = new JMenu("Zoom In");
zoomInBothMenuItem = new JMenuItem("All Axes");
zoomInBothMenuItem.setActionCommand(ZOOM_IN_BOTH_ACTION_COMMAND);
zoomInBothMenuItem.addActionListener(this);
zoomInMenu.add(zoomInBothMenuItem);
zoomInMenu.addSeparator();
zoomInHorizontalMenuItem = new JMenuItem("Horizontal Axis");
zoomInHorizontalMenuItem.setActionCommand(ZOOM_IN_HORIZONTAL_ACTION_COMMAND);
zoomInHorizontalMenuItem.addActionListener(this);
zoomInMenu.add(zoomInHorizontalMenuItem);
zoomInVerticalMenuItem = new JMenuItem("Vertical Axis");
zoomInVerticalMenuItem.setActionCommand(ZOOM_IN_VERTICAL_ACTION_COMMAND);
zoomInVerticalMenuItem.addActionListener(this);
zoomInMenu.add(zoomInVerticalMenuItem);
result.add(zoomInMenu);
JMenu zoomOutMenu = new JMenu("Zoom Out");
zoomOutBothMenuItem = new JMenuItem("All Axes");
zoomOutBothMenuItem.setActionCommand(ZOOM_OUT_BOTH_ACTION_COMMAND);
zoomOutBothMenuItem.addActionListener(this);
zoomOutMenu.add(zoomOutBothMenuItem);
zoomOutMenu.addSeparator();
zoomOutHorizontalMenuItem = new JMenuItem("Horizontal Axis");
zoomOutHorizontalMenuItem.setActionCommand(ZOOM_OUT_HORIZONTAL_ACTION_COMMAND);
zoomOutHorizontalMenuItem.addActionListener(this);
zoomOutMenu.add(zoomOutHorizontalMenuItem);
zoomOutVerticalMenuItem = new JMenuItem("Vertical Axis");
zoomOutVerticalMenuItem.setActionCommand(ZOOM_OUT_VERTICAL_ACTION_COMMAND);
zoomOutVerticalMenuItem.addActionListener(this);
zoomOutMenu.add(zoomOutVerticalMenuItem);
result.add(zoomOutMenu);
JMenu autoRangeMenu = new JMenu("Auto Range");
autoRangeBothMenuItem = new JMenuItem("All Axes");
autoRangeBothMenuItem.setActionCommand(AUTO_RANGE_BOTH_ACTION_COMMAND);
autoRangeBothMenuItem.addActionListener(this);
autoRangeMenu.add(autoRangeBothMenuItem);
autoRangeMenu.addSeparator();
autoRangeHorizontalMenuItem = new JMenuItem("Horizontal Axis");
autoRangeHorizontalMenuItem.setActionCommand(AUTO_RANGE_HORIZONTAL_ACTION_COMMAND);
autoRangeHorizontalMenuItem.addActionListener(this);
autoRangeMenu.add(autoRangeHorizontalMenuItem);
autoRangeVerticalMenuItem = new JMenuItem("Vertical Axis");
autoRangeVerticalMenuItem.setActionCommand(AUTO_RANGE_VERTICAL_ACTION_COMMAND);
autoRangeVerticalMenuItem.addActionListener(this);
autoRangeMenu.add(autoRangeVerticalMenuItem);
result.addSeparator();
result.add(autoRangeMenu);
}
return result;
}
/**
* The idea is to modify the zooming options depending on the type of chart being displayed by
* the panel. This code is incomplete.
*
* @param x horizontal position of the popup.
* @param y vertical position of the popup.
*/
protected void displayPopupMenu(int x, int y) {
if (popup != null) {
// go through each zoom menu item and decide whether or not to enable it...
Plot plot = this.chart.getPlot();
ValueAxis horizontalAxis = getHorizontalValueAxis(plot);
boolean isHorizontal = (horizontalAxis != null);
ValueAxis verticalAxis = getVerticalValueAxis(plot);
boolean isVertical = (verticalAxis != null);
if (this.zoomInHorizontalMenuItem != null) {
this.zoomInHorizontalMenuItem.setEnabled(isHorizontal);
}
if (this.zoomOutHorizontalMenuItem != null) {
this.zoomOutHorizontalMenuItem.setEnabled(isHorizontal);
}
if (this.autoRangeHorizontalMenuItem != null) {
this.autoRangeHorizontalMenuItem.setEnabled(isHorizontal);
}
if (this.zoomInVerticalMenuItem != null) {
this.zoomInVerticalMenuItem.setEnabled(isVertical);
}
if (this.zoomOutVerticalMenuItem != null) {
this.zoomOutVerticalMenuItem.setEnabled(isVertical);
}
if (this.autoRangeVerticalMenuItem != null) {
this.autoRangeVerticalMenuItem.setEnabled(isVertical);
}
if (this.zoomInBothMenuItem != null) {
this.zoomInBothMenuItem.setEnabled(isHorizontal & isVertical);
}
if (this.zoomOutBothMenuItem != null) {
this.zoomOutBothMenuItem.setEnabled(isHorizontal & isVertical);
}
if (this.autoRangeBothMenuItem != null) {
this.autoRangeBothMenuItem.setEnabled(isHorizontal & isVertical);
}
popup.show(this, x, y);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -