2017-03-02 3 views
-1

Ich habe diese Methode entworfen, um ein Fenster mit einem Schieberegler anzuzeigen, den Wert, den ich zurückgeben muss. Können Sie mir bitte sagen, wie ich den JSlider-Wert abrufen kann? Ich erhalte derzeit den Fehler: "Lokale Variablen, die von einer inneren Klasse referenziert werden, müssen endgültig oder effektiv endgültig sein"?Wie kann ich eine Variable aus einer inneren Klasse in Java lesen?

private static int displayFontPanel(JFrame w){ 
    JFrame window = new JFrame("Font Settings"); 
    window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    int fontSize = 14; 
    window.setSize(400, 200); 
    window.setLocationRelativeTo(w); 
    JSlider fntSize = new JSlider(8,40,20); 
    fntSize.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent evt) { 
      fontSize = ((JSlider)evt.getSource()).getValue(); 
     } 
    }); 
    fntSize.setLabelTable(fntSize.createStandardLabels(8)); 
    fntSize.setPaintLabels(true); 
    panel.add(fntSize, BorderLayout.CENTER); 
    window.setContentPane(panel); 
    window.setVisible(true); 
    return fontSize; 
} 
+0

der Fehler sagt Ihnen bereits, was zu tun ist. Die Variable muss endgültig sein, um in einer inneren Klasse –

+0

zugegriffen zu werden, was mich zu einem weiteren Fehler führt: der letzten Variablen kann kein Wert zugewiesen werden sliderValue sliderValue = ((JSlider) evt.getSource()). GetValue(); – florin27

Antwort

0

Ich würde Atomicinteger statt int verwenden:

private static int displayFontPanel(JFrame w){ 
     JFrame window = new JFrame("Font Settings"); 
     window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     final AtomicInteger fontSize = new AtomicInteger(14); 
     window.setSize(400, 200); 
     window.setLocationRelativeTo(w); 
     JSlider fntSize = new JSlider(8,40,20); 
     fntSize.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent evt) { 
      fontSize.set(((JSlider)evt.getSource()).getValue()); 
     } 
     }); 
     fntSize.setLabelTable(fntSize.createStandardLabels(8)); 
     fntSize.setPaintLabels(true); 
     panel.add(fntSize, BorderLayout.CENTER); 
     window.setContentPane(panel); 
     window.setVisible(true); 
     return fontSize.get(); 
} 
+0

Wow! Nie davon gehört, aber funktioniert und sieht orthodoxer aus. – florin27

0

Ändern Sie die Methodensignatur

public void stateChanged(final ChangeEvent evt) { 

Danach Sie

((JSlider) evt.getSource()).getValue() 

Diese Antwort erklärt es besser zu machen in der Lage, als ich es kann, warum die Variable endgültig sein muss: https://stackoverflow.com/a/4732617/3061857

+0

Ich habe die Änderung gemacht, aber das hat nichts gelöst. Wie kann ich den getValue aus der stateChanged-Methode entfernen? Das ist mein Problem: error: lokale Variablen, die von einer inneren Klasse referenziert werden, müssen endgültig oder effektiv final sein fontSize = ((JSlider) evt.getSource()). GetValue(); – florin27

0

Bezieht sich der Code-Fehler wirklich auf Slider, nicht fontSize? Wenn Letzteres der Fall ist, müssen Sie das System etwas "betrügen". In einem Abschluss referenzierte Variablen müssen endgültig sein, dh im folgenden Code unverändert.

Aber wenn Sie ein wenig betrügen, und erklären fontSize als Array (final int[] fontSize = new int[1]) und dessen Inhalt ändern, sollte alles funktionieren wie folgt:

fntSize.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent evt) { 
     fontSize[0] = ((JSlider)evt.getSource()).getValue(); 
     } 
    }); 
+0

Ja, es hat den Trick gemacht. Vielen Dank! Aber warum muss es so kompliziert sein ?! Gibt es keine andere Lösung, um dieses Problem zu lösen? – florin27

Verwandte Themen