Есть некое окно для отображения графиков. Ниже его полный код
| Код | public class ErrFrame extends JFrame implements ActionListener, KeyListener {
@SuppressWarnings("compatibility:-6367160726117705553") private static final long serialVersionUID = -1889562533017921122L;
private BorderLayout borderLayout1 = new BorderLayout(); private JPanel jPanel1 = new JPanel(); private JLabel jLabel1 = new JLabel(); private JLabel lFVU = new JLabel(); private JButton jSave = new JButton(); private JLabel jNodes = new JLabel(); private JLabel jLabel4 = new JLabel(); private JLabel jLabel5 = new JLabel(); private JLabel lEnergy = new JLabel(); private JPanel drawPane = new JPanel(); private MyDrawPane nodesPane = new MyDrawPane(Color.BLUE); private MyDrawPane fvuPane = new MyDrawPane(Color.GREEN); private MyDrawPane energyPane = new MyDrawPane(Color.MAGENTA); private MyDrawPane stepsPane = new MyDrawPane(Color.RED); private int steps = 0;
/** * @throws HeadlessException */ public ErrFrame() throws HeadlessException { super(); try { jbInit(); } catch (Exception e) { e.printStackTrace(); } }
private void jbInit() throws Exception { this.getContentPane().setLayout(borderLayout1); jLabel1.setText(" FVU"); jLabel1.setForeground(Color.GREEN); lFVU.setText("100.000%"); lFVU.setForeground(Color.GREEN); jSave.setText("Save to file"); jSave.addActionListener(this); jNodes.setText("500"); jNodes.setForeground(Color.BLUE); jLabel4.setText("Nodes"); jLabel4.setForeground(Color.BLUE); jLabel5.setText(" Energy"); jLabel5.setForeground(Color.MAGENTA); lEnergy.setText("1000.0000"); lEnergy.setForeground(Color.MAGENTA); drawPane.setLayout(new OverlayLayout(drawPane)); jPanel1.add(jLabel4, null); jPanel1.add(jNodes, null); jPanel1.add(jLabel1, null); jPanel1.add(lFVU, null); jPanel1.add(jLabel5, null); jPanel1.add(lEnergy, null); jPanel1.add(jSave, null); this.getContentPane().add(jPanel1, BorderLayout.NORTH); drawPane.setBackground(Color.WHITE); drawPane.add(nodesPane); drawPane.add(fvuPane); drawPane.add(energyPane); drawPane.add(stepsPane); this.getContentPane().add(drawPane, BorderLayout.CENTER); jSave.addKeyListener(this); }
/** * @param step - number of step to show */ public void setStep(int step) { // test for correctness if (step >= steps) return; stepsPane.setStep(step); double x = fvuPane.getData(step); String s = String.format(Locale.US, "%7.3f", x); lFVU.setText(s + "%"); x = energyPane.getData(step); s = String.format(Locale.US, "%9.4g", x); lEnergy.setText(s); x = nodesPane.getData(step); s = String.format(Locale.US, "%4.0f", x); jNodes.setText(s); }
/** * @param fvu array to use * @param energy array to use * @param nod array to use */ public void setData(double[] fvu, double[] energy, double[] nod) { nodesPane.setDots(nod); fvuPane.setDots(fvu); energyPane.setDots(energy); if (nod == null) { stepsPane.setStep(0, 0); steps = 0; } else { steps = nod.length; stepsPane.setStep(0, steps); } setStep(0); }
/** * @param e - action; */ @Override public void actionPerformed(ActionEvent e) { // Save to file // Request file name JFileChooser fd = PicsWriter.getFileChooser(PicsWriter.TEXT); int ret = fd.showSaveDialog(this); if (ret != JFileChooser.APPROVE_OPTION) return; File fi = fd.getSelectedFile(); BufferedWriter bw; try { bw = new BufferedWriter(new FileWriter(fi)); } catch (IOException f) { return; } double x; for (int i = 0; i < steps; i++) { try { bw.write("" + (i + 1) + ((char)9)); } catch (IOException f) { System.out.println(f.getMessage()); } x = nodesPane.getData(i); try { bw.write(String.format(Locale.US, "%4.0f", x) + ((char)9)); } catch (IOException f) { System.out.println(f.getMessage()); } x = fvuPane.getData(i); try { bw.write(String.format(Locale.US, "%7.3f", x) + ((char)9)); } catch (IOException f) { System.out.println(f.getMessage()); } x = energyPane.getData(i); try { bw.write(String.format(Locale.US, "%12.5g", x) + ((char)9)); } catch (IOException f) { System.out.println(f.getMessage()); } try { bw.newLine(); } catch (IOException f) { System.out.println(f.getMessage()); } } try { bw.close(); } catch (IOException f) { System.out.println(f.getMessage()); } }
@Override public void keyTyped(KeyEvent e) { }
@Override public void keyPressed(KeyEvent e) { }
@Override public void keyReleased(KeyEvent e) { if ((e.getKeyCode() == 154) && (e.getModifiersEx() == 128)) { System.out.println("Key released with code '" + e.getKeyCode() + "' (" + KeyEvent.getKeyText(e.getKeyCode()) + ") with modifyer '" + e.getModifiersEx() + "' (" + KeyEvent.getModifiersExText(e.getModifiersEx()) + ")"); PicsWriter.savePicture(drawPane); } } }
|
Пытался прицепить листенер событий клавиатуры к разным объектам. Работает только если прицеплено к кнопке. Насколько я понимаю это потому, что только кнопка в данном окне может иметь фокус.
У меня есть другое окно, в котором есть много разных компонентов, способных иметь фокус (кнопки, метки). Мне нужно, чтобы при нажатии PrtScr вызывался некий метод. Вопрос, к какому компоненту я должен прицепить слушателя событий клавиатуры? Очень не хочется цеплять ко всем компонентам. Подскажите, пожалуйста, как выбрать компонент, который слушать. |