📄 areaviewer.java
字号:
int width = getWidth(); int height = getHeight(); double diff = coloringHighest - coloringLowest; int textHeight = g.getFontMetrics().getHeight(); // If computing if (attenuatorThread != null && attenuatorThread.isAlive()) { g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); g.setColor(Color.BLACK); String stringToDraw = "[calculating]"; g.drawString(stringToDraw, width/2 - g.getFontMetrics().stringWidth(stringToDraw)/2, height/2 + textHeight/2); return; } // Check for infinite values if (Double.isInfinite(coloringHighest) || Double.isInfinite(coloringLowest)) { g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); g.setColor(Color.BLACK); String stringToDraw = "INFINITE VALUES EXIST"; g.drawString(stringToDraw, width/2 - g.getFontMetrics().stringWidth(stringToDraw)/2, height/2 + textHeight/2); return; } // Check if values are constant if (diff == 0) { g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); g.setColor(Color.BLACK); NumberFormat formatter = DecimalFormat.getNumberInstance(); String stringToDraw = "CONSTANT VALUES (" + formatter.format(coloringHighest) + ")"; g.drawString(stringToDraw, width/2 - g.getFontMetrics().stringWidth(stringToDraw)/2, height/2 + textHeight/2); return; } for (int i=0; i < width; i++) { double paintValue = coloringLowest + (double) i / (double) width * diff; g.setColor( new Color( getColorOfSignalStrength(paintValue, coloringLowest, coloringHighest))); g.drawLine(i, 0, i, height); } if (dataTypeToVisualize == ChannelModel.TransmissionData.PROB_OF_RECEPTION) { NumberFormat formatter = DecimalFormat.getPercentInstance(); g.setColor(Color.BLACK); g.drawString(formatter.format(coloringLowest), 3, textHeight); String stringToDraw = formatter.format(coloringHighest); g.drawString(stringToDraw, width - g.getFontMetrics().stringWidth(stringToDraw) - 3, textHeight); } else if (dataTypeToVisualize == ChannelModel.TransmissionData.SIGNAL_STRENGTH || dataTypeToVisualize == ChannelModel.TransmissionData.SIGNAL_STRENGTH_VAR ) { NumberFormat formatter = DecimalFormat.getNumberInstance(); g.setColor(Color.BLACK); g.drawString(formatter.format(coloringLowest) + "dBm", 3, textHeight); String stringToDraw = formatter.format(coloringHighest) + "dBm"; g.drawString(stringToDraw, width - g.getFontMetrics().stringWidth(stringToDraw) - 3, textHeight); } else if (dataTypeToVisualize == ChannelModel.TransmissionData.SNR || dataTypeToVisualize == ChannelModel.TransmissionData.SNR_VAR) { NumberFormat formatter = DecimalFormat.getNumberInstance(); g.setColor(Color.BLACK); g.drawString(formatter.format(coloringLowest) + "dB", 3, textHeight); String stringToDraw = formatter.format(coloringHighest) + "dB"; g.drawString(stringToDraw, width - g.getFontMetrics().stringWidth(stringToDraw) - 3, textHeight); } else if (dataTypeToVisualize == ChannelModel.TransmissionData.DELAY_SPREAD_RMS) { NumberFormat formatter = DecimalFormat.getNumberInstance(); g.setColor(Color.BLACK); g.drawString(formatter.format(coloringLowest) + "us", 3, textHeight); String stringToDraw = formatter.format(coloringHighest) + "us"; g.drawString(stringToDraw, width - g.getFontMetrics().stringWidth(stringToDraw) - 3, textHeight); } } }; coloringIntervalPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); Dimension colorPanelSize = new Dimension(200, 20); coloringIntervalPanel.setPreferredSize(colorPanelSize); coloringIntervalPanel.setMinimumSize(colorPanelSize); coloringIntervalPanel.setMaximumSize(colorPanelSize); coloringIntervalPanel.setAlignmentX(Component.LEFT_ALIGNMENT); visualizeChannelPanel.add(coloringIntervalPanel); // Choose channel output to visualize visualizeChannelPanel.add(Box.createRigidArea(new Dimension(0,20))); visualizeChannelPanel.add(new JLabel("Visualize:")); JRadioButton signalStrengthButton = new JRadioButton("Signal strength"); signalStrengthButton.setActionCommand("signalStrengthButton"); signalStrengthButton.setSelected(true); signalStrengthButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.SIGNAL_STRENGTH; } }); visualizeChannelPanel.add(signalStrengthButton); JRadioButton signalStrengthVarButton = new JRadioButton("Signal strength variance"); signalStrengthVarButton.setActionCommand("signalStrengthVarButton"); signalStrengthVarButton.setSelected(false); signalStrengthVarButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.SIGNAL_STRENGTH_VAR; } }); visualizeChannelPanel.add(signalStrengthVarButton); JRadioButton SNRButton = new JRadioButton("Signal to Noise ratio"); SNRButton.setActionCommand("SNRButton"); SNRButton.setSelected(false); SNRButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.SNR; } }); visualizeChannelPanel.add(SNRButton); JRadioButton SNRVarButton = new JRadioButton("Signal to Noise variance"); SNRVarButton.setActionCommand("SNRVarButton"); SNRVarButton.setSelected(false); SNRVarButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.SNR_VAR; } }); visualizeChannelPanel.add(SNRVarButton); JRadioButton probabilityButton = new JRadioButton("Probability of reception"); probabilityButton.setActionCommand("probabilityButton"); probabilityButton.setSelected(false); probabilityButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.PROB_OF_RECEPTION; } }); visualizeChannelPanel.add(probabilityButton); JRadioButton rmsDelaySpreadButton = new JRadioButton("RMS delay spread"); rmsDelaySpreadButton.setActionCommand("rmsDelaySpreadButton"); rmsDelaySpreadButton.setSelected(false); rmsDelaySpreadButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dataTypeToVisualize = ChannelModel.TransmissionData.DELAY_SPREAD_RMS; } }); visualizeChannelPanel.add(rmsDelaySpreadButton); visTypeSelectionGroup = new ButtonGroup(); visTypeSelectionGroup.add(signalStrengthButton); visTypeSelectionGroup.add(signalStrengthVarButton); visTypeSelectionGroup.add(SNRButton); visTypeSelectionGroup.add(SNRVarButton); visTypeSelectionGroup.add(probabilityButton); visTypeSelectionGroup.add(rmsDelaySpreadButton); visualizeChannelPanel.add(Box.createRigidArea(new Dimension(0,20))); visualizeChannelPanel.add(new JLabel("Resolution:")); resolutionSlider = new JSlider(JSlider.HORIZONTAL, 30, 600, 100); resolutionSlider.setMajorTickSpacing(100); resolutionSlider.setPaintTicks(true); resolutionSlider.setPaintLabels(true); resolutionSlider.setAlignmentX(Component.LEFT_ALIGNMENT); visualizeChannelPanel.add(resolutionSlider); visualizeChannelPanel.add(Box.createRigidArea(new Dimension(0,20))); JButton recalculateVisibleButton = new JButton("Paint radio channel"); recalculateVisibleButton.setActionCommand("recalculate visible area"); recalculateVisibleButton.addActionListener(formulaHandler); visualizeChannelPanel.add(recalculateVisibleButton); // Create control panel controlPanel = new JPanel(); controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); graphicsComponentsPanel.setAlignmentX(Component.LEFT_ALIGNMENT); controlPanel.add(graphicsComponentsPanel); controlPanel.add(new JSeparator()); controlPanel.add(Box.createRigidArea(new Dimension(0, 5))); visualizeChannelPanel.setAlignmentX(Component.LEFT_ALIGNMENT); controlPanel.add(visualizeChannelPanel); controlPanel.setPreferredSize(new Dimension(250,700)); controlPanel.setAlignmentX(Component.LEFT_ALIGNMENT); scrollControlPanel = new JScrollPane( controlPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollControlPanel.setPreferredSize(new Dimension(250,0)); // Add everything this.setLayout(new BorderLayout()); this.add(BorderLayout.CENTER, canvas); // Add canvas this.add(BorderLayout.EAST, scrollControlPanel); // Load external images (antenna) Toolkit toolkit = Toolkit.getDefaultToolkit(); URL imageURL = this.getClass().getClassLoader().getResource(antennaImageFilename); antennaImage = toolkit.getImage(imageURL); MediaTracker tracker = new MediaTracker(canvas); tracker.addImage(antennaImage, 1); try { tracker.waitForAll(); } catch (InterruptedException ex) { logger.fatal("Interrupted during image loading, aborting"); return; } // Try to select current plugin try { setSelected(true); } catch (java.beans.PropertyVetoException e) { // Could not select } } /** * Listens to mouse event on canvas */ private MouseListener canvasMouseHandler = new MouseListener() { public void mouseReleased(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { if (inSelectMode) { Vector<Radio> hitRadios = trackClickedRadio(e.getPoint()); if (hitRadios == null || hitRadios.size() == 0) { if (e.getButton() != MouseEvent.BUTTON1) { selectedRadio = null; channelImage = null; canvas.repaint(); } return; } if (hitRadios.size() == 1 && hitRadios.firstElement() == selectedRadio) { return; } if (selectedRadio == null || !hitRadios.contains(selectedRadio)) { selectedRadio = hitRadios.firstElement(); } else { // Select next in list selectedRadio = hitRadios.get( (hitRadios.indexOf(selectedRadio)+1) % hitRadios.size() ); } channelImage = null; canvas.repaint(); } else if (inTrackMode && selectedRadio != null) { // Calculate real clicked position double realClickedX = e.getX() / currentZoomX - currentPanX; double realClickedY = e.getY() / currentZoomY - currentPanY; Position radioPosition = currentRadioMedium.getRadioPosition(selectedRadio); final double radioX = radioPosition.getXCoordinate(); final double radioY = radioPosition.getYCoordinate(); trackedComponents = currentChannelModel.getRaysOfTransmission(radioX, radioY, realClickedX, realClickedY); canvas.repaint(); } } public void mouseEntered(MouseEvent e) { } public void mousePressed(MouseEvent e) { lastHandledPosition = new Point(e.getX(), e.getY()); // Set zoom center (real world) zoomCenterX = e.getX() / currentZoomX - currentPanX; zoomCenterY = e.getY() / currentZoomY - currentPanY; zoomCenterPoint = e.getPoint(); } }; /** * Listens to mouse movements when in pan mode */ private MouseMotionListener canvasPanModeHandler = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (lastHandledPosition == null) { lastHandledPosition = e.getPoint(); return; } // Pan relative to mouse movement and current zoom // This way the mouse "lock" to the canvas currentPanX += ((e.getX() - lastHandledPosition.x)) / currentZoomX; currentPanY += ((e.getY() - lastHandledPosition.y)) / currentZoomY; lastHandledPosition = e.getPoint(); canvas.repaint(); } }; /** * Listens to mouse movements when in zoom mode */ private MouseMotionListener canvasZoomModeHandler = new MouseMotionListener() { public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (lastHandledPosition == null) { lastHandledPosition = e.getPoint(); return; } // Zoom relative to mouse movement (keep XY-proportions) currentZoomY += 0.005 * currentZoomY * ((lastHandledPosition.y - e.getY())); currentZoomY = Math.max(0.05, currentZoomY); currentZoomY = Math.min(1500, currentZoomY); currentZoomX = currentZoomY; // We also need to update the current pan in order to zoom towards the mouse currentPanX = zoomCenterPoint.x/currentZoomX - zoomCenterX; currentPanY = zoomCenterPoint.y/currentZoomY - zoomCenterY; lastHandledPosition = e.getPoint(); canvas.repaint(); } }; /** * Selects which mouse mode the canvas should be in (select/pan/zoom) */ private ActionListener canvasModeHandler = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("set select mode")) { // Select mode, no mouse motion listener needed for (MouseMotionListener reggedListener: canvas.getMouseMotionListeners()) { canvas.removeMouseMotionListener(reggedListener); } inTrackMode = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -