2017-05-17 28 views
0

사용자가 색상 테마를 선택할 수있는 설정 화면이있는 작은 프로그램을 만들고 있습니다. 모든 색상에 대해 JRadioButton을 사용했지만 다음에 프로그램을 실행할 때 저장하는 프로그램을 가져올 수 없습니다. 내 코드는 다음과 같습니다.JRadioButton에서 Java Preferences 클래스 사용 방법

private Preferences userPreferences = Preferences.userRoot(); 
MainWindow() { 
    super("Timer"); 
    setLayout(new GridLayout(4,3,5,5)); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setSize(650,290); 
    setResizable(false); 
    userPreferences.get("COLOR_CODE", "#ededed"); 

    //MORE CODE HERE 

@Override 
public void menuSelected(MenuEvent e) { 
    //Open settings window 
    if(e.getSource().equals(settings)) { 
     about.setEnabled(false); 
     exit.setEnabled(false); 
     settingsFrame = new SettingsWindow(); 
     settingsFrame.setAlwaysOnTop(true); 
     settingsFrame.setLocationRelativeTo(null); 
     settingsFrame.setVisible(true); 

     //WindowListener for closing the settings window 
     settingsFrame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent we) { 
       settings.setEnabled(true); 
       about.setEnabled(true); 
       exit.setEnabled(true); 
      } 
     }); 

     //Adding action listeners to the radio buttons 
     settingsFrame.defaultColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#ededed"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.whiteColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#FFFFFF"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.lightGrayColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#D2D8DF"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.darkGrayColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#A2A4A6"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.yellowColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#FBFF00"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.pinkColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#F58EB3"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

     settingsFrame.cyanColorRB.addActionListener(ee -> { 
      settingsFrame.setColor("#32D0F7"); 
      getContentPane().setBackground(Color.decode(settingsFrame.getColorCode())); 
      userPreferences.put("COLOR_CODE", settingsFrame.getColorCode()); 
     }); 

    } 
} 

위의 코드가 사용자가 선택한 색상을 저장하지 못하는 이유는 누구에게 알려주십시오.

+0

난 당신이 더 나은에 할당하는 이유는 무엇 – MadProgrammer

+0

@MadProgrammer에 도착에 의해 반환 된 값을 할당되지 않은 한 이유를 알고에 더 관심이있을 것 변수? 차이점이 뭐야? – Dan

+0

'userPreferences.get ("COLOR_CODE", "#ededed");'아무 것도하지 않으므로 질문이 저장됩니다. 어떻게 저장되지 않았는지 어떻게 알 수 있습니까? – MadProgrammer

답변

1

질문에 게시 된 색상 코드를 저장하는 경우 저장된 색상 코드를 테스트하고 해당 버튼을 선택해야합니다. 예 단지 시연, 아주 기본적인 :

// assuming userPreferences is java.util.prefs.Preferences 
String colorCode = userPreferences.get("COLOR_CODE", "#ededed"); 
switch (colorCode.toLowerCase()) { 
    case "#ededed": defaultColorRB.setSelected(true); break; 
    case "#ffffff": whiteColorRB.setSelected(true); break; 
    ... 
    default: /* none selected - not sure what you want to do in that case */ break; 
} 

힌트 1 : 환경 설정 키 "COLOR_CODE"및 색상 (예 : "ededed")

힌트 2 사용 상수 : 당신이 라디오 버튼을 사용하고 있기 때문에 즉, 몇 가지 고유 한 색상을 사용하면 색상 코드 자체 (예 : #ededed) 대신 선택한 라디오 버튼 색인 (또는 상수)을 저장하는 것이 더 쉽습니다. 사용자가 라디오 버튼뿐만 아니라 모든 색상을 선택할 수 있으면 반드시 색상 코드를 저장해야합니다. 여기

두 번째 힌트 예 :

import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.prefs.Preferences; 

import javax.swing.ButtonGroup; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.SwingUtilities; 
import javax.swing.border.TitledBorder; 

public class Radio { 

    private static final String PREF_BUTTON_INDEX = "color button"; 
    private final Preferences prefs = Preferences.userNodeForPackage(getClass()); 


    private static final String[] COLORS = { "#ededed", "#ffffff", "#a00000" }; 
    private List<JRadioButton> buttons; 
    private JLabel output; // so we can see something, simulating usage of color 

    private Radio() { 
     buttons = new ArrayList<>(); 
     SwingUtilities.invokeLater(this::initGUI); 
    } 

    private void initGUI() { 
     JPanel panel = new JPanel(); 
     ButtonGroup group = new ButtonGroup(); 
     for (int i = 0; i < COLORS.length; i++) { 
      JRadioButton button = new JRadioButton(COLORS[i]); 
      button.addActionListener(this::buttonSelected); 
      group.add(button); 
      panel.add(button); 
      buttons.add(button); 
     } 

     output = new JLabel("undefined"); 
     output.setBorder(new TitledBorder("Color:")); 
     panel.add(output); 

     int colorIndex = prefs.getInt(PREF_BUTTON_INDEX, -1); 
     if (colorIndex != -1) { 
      buttons.get(colorIndex).setSelected(true); 
      output.setText(COLORS[colorIndex]); 
     } 

     JOptionPane.showMessageDialog(null, panel); 
    } 

    private void buttonSelected(ActionEvent ev) { 
     int index = buttons.indexOf(ev.getSource()); 
     if (index != -1) { 
      output.setText(COLORS[index]); 
      prefs.putInt(PREF_BUTTON_INDEX, index); 
     } 
    } 

    public static void main(String[] args) { 
     new Radio(); 
    } 
} 
+0

답변 해 주셔서 감사합니다! 컬러 코드 자체 대신 라디오 버튼 인덱스를 사용하는 것이 중요합니다. 구현을 시도한 다음 피드백을 보내 드리겠습니다. – Dan

+0

훌륭하게 작동합니다. 도움을 주셔서 감사합니다! – Dan

0

첫 번째 좋은 사용법은 노드를 만들고 사용자 루트 노드에 직접 환경 설정을 저장하지 않는 것입니다.

// This will define a node in which the preferences can be stored 
prefs = Preferences.userRoot().node(this.getClass().getName()); 

을 그리고이 뭔가를 변경하는 경우 참조 :이 시도 .

+0

[환경 설정에 대한 사용 예제] (http://www.vogella.com/tutorials/JavaPreferences/article.html) – Mohicane