📄 window.java
字号:
/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */import javax.swing.*;import javax.swing.table.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.util.*;/* The main GUI object. Build the GUI and coordinate all user activities */class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) { return "Mote"; } else { return "Color"; } } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) { return motes.get(row); } else { return colors.get(row); } } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return ((Integer)motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return (Color)colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) { if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) { xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); } xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) { error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); } return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) { return; } } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -