【发布时间】:2014-09-18 10:53:30
【问题描述】:
我有一个向用户询问一些详细信息的表单。在该表单的顶部,有 2 个控件:一个 JSpinner 和一个 JToggleButton。
如果用户使用 JSpinner,他可以从表格编号 1 到 4 中进行选择,如果他单击 JToggleButton,则微调器被禁用并显示表格编号 0(如果此按钮被切换回,则微调器被启用返回并使用微调器中的数字加载表单)。
目前没有问题。
但我现在想在编辑表单时显示一个弹出窗口,而不是保存,并且用户使用了两个控件之一。
弹出窗口没有问题,但我不知道如何撤消对触发弹出窗口显示的控件的修改。
因为我将 ChangeListener 用于微调器,将 ActionListener 用于按钮,所以我在修改控件后显示弹出窗口。
事实上,我正在寻找一种方法来通知控件上的操作,但可以停止修改(类似于通知侦听器,我们需要返回 true 或 false 来验证修改)。
你会怎么做?
谢谢。
这是一个示例:
package test;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SwingTest extends JFrame
{
private static final long serialVersionUID = 1L;
private JToggleButton btnRecueilPermanent;
private JSpinner spinner;
private JTextField tf;
private boolean formChanged = false;
public SwingTest()
{
super();
setLayout(new GridBagLayout());
initComponents();
loadForm(1);
}
private void initComponents()
{
JPanel panelGeneral = new JPanel();
GridBagConstraints gbc_panelGeneral = new GridBagConstraints();
gbc_panelGeneral.fill = GridBagConstraints.BOTH;
gbc_panelGeneral.anchor = java.awt.GridBagConstraints.CENTER;
gbc_panelGeneral.weightx = 100.0;
gbc_panelGeneral.weighty = 100.0;
gbc_panelGeneral.gridx = 0;
gbc_panelGeneral.gridy = 0;
add(panelGeneral, gbc_panelGeneral);
panelGeneral.setLayout(new BorderLayout(0, 0));
JPanel panelSelecteur = new JPanel();
panelGeneral.add(panelSelecteur, BorderLayout.NORTH);
JLabel lblChoixDuFormulaire = new JLabel("Choose form :");
panelSelecteur.add(lblChoixDuFormulaire);
spinner = new JSpinner(new SpinnerNumberModel(1, 1, 4, 1));
spinner.addChangeListener(new ChangeListener()
{
public void stateChanged(final ChangeEvent e)
{
loadForm((Integer) spinner.getValue());
}
});
panelSelecteur.add(spinner);
btnRecueilPermanent = new JToggleButton("Permanent form");
btnRecueilPermanent.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(btnRecueilPermanent.isSelected())
{
loadForm(0);
}
else
{
loadForm((Integer) spinner.getValue());
}
}
});
panelSelecteur.add(btnRecueilPermanent);
final JPanel formPanel = new JPanel();
tf = new JTextField(20);
tf.addKeyListener(new KeyListener()
{
@Override
public void keyTyped(KeyEvent e)
{
formChanged = true;
}
@Override
public void keyPressed(KeyEvent e)
{
}
@Override
public void keyReleased(KeyEvent e)
{
}
});
formPanel.add(tf);
panelGeneral.add(formPanel, BorderLayout.CENTER);
}
protected void loadForm(final int nbForm)
{
if(formChanged)
{
Object[] options =
{
"Continue", "Discard changes"
};
final int result = JOptionPane.showOptionDialog(this, "You have unsaved modifivations", "Beware !", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
if(result == 0)
{
// HERE WE DISCARD THE FORM CHANGE, BUT THE TOGGLEBUTTON or THE JSPINNER HAVED CHANGED
return;
}
}
if(nbForm == 0)
{
btnRecueilPermanent.setText("Normal form");
}
else
{
btnRecueilPermanent.setText("Permanent form");
}
tf.setText(String.valueOf(nbForm));
spinner.setEnabled(nbForm != 0);
formChanged = false;
}
public static void main(String[] args)
{
final SwingTest jf = new SwingTest();
jf.pack();
jf.setVisible(true);
}
}
【问题讨论】:
-
发布Minimal, Complete, and Verifiable example,以获得更好的帮助。
-
你好,你想在哪里显示弹出窗口?