2017-03-02 14 views
-1

私はこのメソッドを設計して、値を返す必要のあるスライダを持つウィンドウを表示します。 JSliderの値を取得する方法を教えてください。現在、エラーが発生しています。「内部クラスから参照されるローカル変数は、最終的にまたは効果的に最終的にする必要がありますか?その後あなたは変数が最終的にする必要がある理由の答えは、私ができるより良い説明Javaの内部クラスから変数を読み取るにはどうすればよいですか?

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

を行うことができるようになります

public void stateChanged(final ChangeEvent evt) { 

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

エラーは既に何をすべきかを示しています。変数は、内部クラス –

+0

で最終的にアクセスされる必要があります。最終的なエラーにつながります。最終変数に値を割り当てることはできませんsliderValue =((JSlider)evt.getSource())。getValue(); – florin27

答えて

0

私が代わりにint型ののAtomicIntegerを使用します。

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

うわー!これについて聞いたことはありませんが、より正統に見えます。 – florin27

0

変更メソッドシグネチャ:https://stackoverflow.com/a/4732617/3061857

+0

私は変更を行ったが、これは何も解決しなかった。 stateChangedメソッドのgetValueをどのように取得できますか?これは私の問題です:エラー:内部クラスから参照されるローカル変数は、最終的に、または効果的に最終的にする必要があります。 fontSize =((JSlider)evt.getSource())。getValue(); – florin27

0

コードエラーは実際にはではなくスライダを参照していますか?後者が当てはまる場合、システムをちょっと「チート」する必要があります。クロージャで参照される変数は、次のコードでは最終的なもの、つまり変更されていないものでなければなりません。

しかし、あなたは少しカンニング、および配列(final int[] fontSize = new int[1])としてfontSizeを宣言し、その内容を変更した場合、すべてが動作するはずなので、のように:

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

はい、それはトリックでした。ありがとうございました!しかし、なぜそれはとても複雑でなければならないのですか?この問題を管理する別の解決策はありませんか? – florin27

関連する問題