2017-05-17 27 views
0

我建立那种有一个设置屏幕,用户可以选择一个颜色主题的小程序。我为每种颜色都使用了JRadioButton,但是我无法让程序在下次运行程序时保存它。这里是我的代码:如何使用Java首类具有一个JRadioButton

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

相关问题