我编写了一个程序,假设设置了应用程序属性。我正在使用JSplit Pane和JScrollPane。程序正在加载正常,但它没有更改右面板的值以响应左侧的列表元素。如果我做错了,请告诉我。我已提到following program
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class ApplicationPropertyDlg extends JDialog implements ActionListener,ListSelectionListener {
private DButton pb_OK = null ;
private DButton pb_CANCEL = null ;
private DButton pb_APPLY = null ;
private String[] appProp = null;
private JList appList = null;
private JSplitPane appPanel = null;
private JScrollPane listScrollPanel,appScrollPanel = null;
public ApplicationPropertyDlg ( AppDefaultWin parent ) {
super ( parent, "Properties Application", true ) ;
initializeAppProp();
intializeAppList();
initializeGUI();
ButtonPanel buttonPanel = new ButtonPanel () ;
setSize ( 800,700 ) ;
WinUtil.centerChildInParent ( this, parent ) ;
pb_OK = new JButton ( ) ;
pb_APPLY = new JButton ( ) ;
pb_CANCEL = new JButton ( ) ;
pb_OK.addActionListener ( this ) ;
pb_APPLY.addActionListener ( this ) ;
pb_CANCEL.addActionListener ( this ) ;
GUISystem.setPreferredButton ( pb_OK ) ;
GUISystem.setPreferredButton ( pb_CANCEL ) ;
GUISystem.setPreferredButton ( pb_APPLY ) ;
getContentPane().setLayout ( new BorderLayout (5,5) ) ;
getContentPane().add(appPanel);
getContentPane().add ( buttonPanel, BorderLayout.SOUTH ) ;
buttonPanel.add ( pb_OK ) ;
buttonPanel.add ( pb_APPLY ) ;
buttonPanel.add ( pb_CANCEL ) ;
setVisible ( true ) ;
}
private void initializeGUI() {
// TODO Auto-generated method stub
listScrollPanel = new JScrollPane(appList);
appScrollPanel = new JScrollPane(new GeneralPage());
appPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,listScrollPanel,appScrollPanel);
appPanel.setOneTouchExpandable(true);
appPanel.setDividerLocation(200);
//minimum size for individual Panel
Dimension minimumSize = new Dimension(100, 50);
listScrollPanel.setMinimumSize(minimumSize);
appScrollPanel.setMinimumSize(minimumSize);
//Provide a preferred size for the split pane.
appPanel.setPreferredSize(appPanel.getPreferredSize());
}
private void intializeAppList() {
// TODO Auto-generated method stub
appList = new JList(appProp);
appList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
appList.setSelectedIndex(0);
appList.addListSelectionListener(this);
}
private void initializeAppProp() {
// TODO Auto-generated method stub
appProp = new String []{"General","Task Bar", "Look and Feel","Country"};
}
public void propertyChanged ( int property, Object value ) {
if ( property == PropertySystem.PROPERTY_LANGUAGE )
setText() ;
else if ( property == PropertySystem.PROPERTY_LAF )
GUISystem.setLookAndFeel ( this ) ;
else
GUISystem.setPropertiesOnPanel ( getContentPane() ) ;
}
public void actionPerformed ( ActionEvent e ) {
dispose() ;
}
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
JList list = (JList)e.getSource();
updateAppPanel(appProp[list.getSelectedIndex()]);
}
private void updateAppPanel(String panelName) {
// TODO Auto-generated method stub
if(panelName.equalsIgnoreCase("General"){
appScrollPanel.removeAll();
appScrollPanel.add(new GeneralPage());
}
else if (panelName.equalsIgnoreCase("Task Bar"){
appScrollPanel.removeAll();
appScrollPanel.setViewportView(new TaskBarPage());
}
else if (panelName.equalsIgnoreCase("Language"){
appScrollPanel.removeAll();
appScrollPanel.setViewportView(new LanguagePage());
}
else if (panelName.equalsIgnoreCase("Look and Feel"){
appScrollPanel.removeAll();
appScrollPanel.setViewportView(new LookFeelPage());
}
else if (panelName.equalsIgnoreCase("Country"){
appScrollPanel.removeAll();
appScrollPanel.setViewportView(new SelectCountryPage());
}
appScrollPanel.revalidate();
appScrollPanel.repaint();
}
}
答案 0 :(得分:3)
首先,向类中添加一个新的控件容器(最好是JPanel
):
...
private JSplitPane appPanel = null;
private JScrollPane listScrollPanel,appScrollPanel = null;
// End of your controls...
private JPanel tabContainer;
然后,在您的代码初始化appScrollPanel
变量的代码部分中,不是传递GeneralPane
的新实例,而是像这样传递tabContainer
:
tabContainer = new JPanel();
tabContainer.setLayout(new CardLayout());
tabContainer.add(new GeneralPage());
// Instead of adding GeneralPane directly, add the GeneralPane container
appScrollPanel = new JScrollPane(tabContainer);
然后,在updateAppPanel
方法中,替换appScrollPanel.setViewportView
这样的调用:
private void updateAppPanel(String panelName) {
// TODO Auto-generated method stub
if(panelName.equalsIgnoreCase("General")){
tabContainer.removeAll();
tabContainer.add(new GeneralPage());
}
else if (panelName.equalsIgnoreCase("Task Bar")){
tabContainer.removeAll();
tabContainer.add(new TaskBarPage());
}
else if (panelName.equalsIgnoreCase("Language")){
tabContainer.removeAll();
tabContainer.add(new LanguagePage());
}
else if (panelName.equalsIgnoreCase("Look and Feel")){
tabContainer.removeAll();
tabContainer.add(new LookFeelPage());
}
else if (panelName.equalsIgnoreCase("Country")){
tabContainer.removeAll();
tabContainer.add(new CountryPage());
}
appScrollPanel.revalidate();
appScrollPanel.repaint();
}
它应该有效:
我建议您将updateAppPanel
代码放在循环中吗?如果你需要修改每个else if
块的内部主体