📄 settingsdialog.java
字号:
package abchr.settings;
import guiutils.LineLayout;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
public class SettingsDialog extends JDialog implements TreeSelectionListener {
private static class SettingsWrapper {
public String name;
public Settings settings;
public SettingsWrapper(Settings settings,String name) {
this.settings=settings;
this.name=name;
}
public String toString() {
return name;
}
}
private List settingsList;
private JTree tree;
private JPanel centerPanel=new JPanel(new BorderLayout());
private boolean ok=false;
public SettingsDialog(Frame owner,List settingsList) {
super(owner,"Settings",true);
Container cp=getContentPane();
cp.setLayout(new BorderLayout());
centerPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
cp.add(centerPanel,BorderLayout.CENTER);
this.settingsList=new ArrayList(settingsList);
DefaultMutableTreeNode root=new DefaultMutableTreeNode(new SettingsWrapper(null,"Settings"));
Settings settings;
for(Iterator it=settingsList.iterator();it.hasNext();) {
settings=(Settings)it.next();
String[] path=settings.getPath();
int i=0;
DefaultMutableTreeNode node=root;
DefaultMutableTreeNode child;
while((child=getNodeChild(node,path[i]))!=null){node=child;i++;}
while(i<path.length) {
node.add(child=new DefaultMutableTreeNode(new SettingsWrapper(null,path[i++])));
node=child;
}
node.setUserObject(new SettingsWrapper(settings,path[i-1]));
}
tree=new JTree(root);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.getSelectionModel().addTreeSelectionListener(this);
tree.setPreferredSize(new Dimension(150,200));
cp.add(new JScrollPane(tree),BorderLayout.WEST);
JPanel bottomPanel=new JPanel(new LineLayout(LineLayout.RIGHT_ALIGN));
JButton applyButton=new JButton("Apply all");
JButton cancelButton=new JButton("Cancel");
JButton okButton=new JButton("OK");
applyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){applySettings();}
});
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){ok=true;hide();}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){hide();}
});
bottomPanel.add(applyButton);
bottomPanel.add(cancelButton);
bottomPanel.add(okButton);
cp.add(bottomPanel,BorderLayout.SOUTH);
}
private DefaultMutableTreeNode getNodeChild(DefaultMutableTreeNode node,Object obj) {
Enumeration e=node.children();
while(e.hasMoreElements()) {
DefaultMutableTreeNode n=(DefaultMutableTreeNode)e.nextElement();
if(n.getUserObject().equals(obj)){return n;}
}
return null;
}
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
Settings settings=((SettingsWrapper)node.getUserObject()).settings;
centerPanel.removeAll();
if(settings!=null){centerPanel.add(settings.getView(),BorderLayout.CENTER);}
centerPanel.validate();
validate();
centerPanel.repaint();
}
private void resetSettings() {
for(int i=0;i<settingsList.size();i++) {
((Settings)settingsList.get(i)).reset();
}
}
private void applySettings() {
for(int i=0;i<settingsList.size();i++) {
((Settings)settingsList.get(i)).apply();
}
}
public void show() {
Window owner=this.getOwner();
this.setSize(500,300);
this.setLocation(owner.getX()+(owner.getWidth()-this.getWidth())/2,owner.getY()+(owner.getHeight()-this.getHeight())/2);
resetSettings();
ok=false;
super.show();
if(ok){applySettings();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -