单击按钮时关闭 JFrame 窗格
Close JFrame pane when button is clicked
我正在尝试使用关闭飞机座椅系统的窗格,因此每位乘客只能选择 1 个座位。我研究了一下,知道我需要一行代码 JFrame.dispose();但我不知道该放在哪里,还该放什么。想法? (除此之外,我是一个完整的菜鸟XD)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class APlaneJToggle {
private int rows = 15;
private int columns = 6;
private Icon res = (UIManager.getIcon("OptionPane.errorIcon"));
public APlaneJToggle() {
JPanel panel = new JPanel(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String []rowChar = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
for (int column = 1; column < columns+1; column++) {
final JToggleButton button = new JToggleButton(rowChar[row] + column);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent actionEvent) {
AbstractButton abstractButton = (AbstractButton) actionEvent.getSource();
boolean selected = abstractButton.getModel().isSelected();
if (selected) {
button.setIcon(res);
} else {
button.setIcon(null);
}
}
});
panel.add(button);
}
}
final JFrame frame = new JFrame("Flight");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocation(300, 100);
frame.resize(750,450);
frame.isDefaultLookAndFeelDecorated();
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
APlaneJToggle aPlaneJToggle = new APlaneJToggle();
}
});
}
}
您可以使用 SwingUtilities.getWindowAncestor
到 return 组件所在的 Window
,这样您就可以 dispose
在 returned 结果上。
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private int rows = 15;
private int columns = 6;
public TestPane() {
setLayout(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String[] rowChar = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
for (int column = 1; column < columns + 1; column++) {
final JToggleButton button = new JToggleButton(rowChar[row] + column);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
AbstractButton abstractButton = (AbstractButton) actionEvent.getSource();
boolean selected = abstractButton.getModel().isSelected();
if (selected) {
button.setText("X");
} else {
button.setText("");
}
SwingUtilities.getWindowAncestor(button).dispose();
}
});
add(button);
}
}
}
}
}
您可以考虑使用 JDialog
而不是 JFrame
,因为它可以让您更好地控制程序流程。查看 How to Make Dialogs 了解更多详情
建议:
- 我猜你想让用户只select一个按钮。如果是这样,那么也许是更好的解决方案:使用 ButtonGroup 并将所有 JToggleButton 添加到单个 ButtonGroup。这样用户仍然可以 select 另一个座位,但之前的座位将变为未selected。
- 如果您走这条路,请使用 ItemListener 而不是 ActionListener。
- 调用代码可以轻松地从 ButtonGroup 对象中获取 selected 按钮。
- 如果此 window 将从另一个顶级 JFrame window 显示,最好是作为 JDialog 而不要 JFrame。
例如(迟到总比不到好)
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class APlaneJToggleTest extends JPanel {
private DefaultListModel<String> seatListModel = new DefaultListModel<>();
private JList<String> selectedSeatList = new JList<>(seatListModel);
private JButton getSeatSelectionBtn = new JButton(new GetSelectionAction("Get Selected Button"));
private JDialog getSeatDialog;
private APlaneJToggle aPlaneJToggle = new APlaneJToggle();
public APlaneJToggleTest() {
selectedSeatList.setVisibleRowCount(8);
String prototype = String.format("%20s", " ");
selectedSeatList.setPrototypeCellValue(prototype);
add(getSeatSelectionBtn);
add(new JScrollPane(selectedSeatList));
}
private class GetSelectionAction extends AbstractAction {
public GetSelectionAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
if (getSeatDialog == null) {
Window win = SwingUtilities.getWindowAncestor(APlaneJToggleTest.this);
getSeatDialog = new JDialog(win, "Choose Seat", ModalityType.APPLICATION_MODAL);
getSeatDialog.add(aPlaneJToggle.getMainPanel());
getSeatDialog.setResizable(false);
getSeatDialog.pack();
}
getSeatDialog.setVisible(true);
ButtonModel model = aPlaneJToggle.getSelectedModel();
if (model != null) {
String actionCommand = model.getActionCommand();
seatListModel.addElement(actionCommand);
aPlaneJToggle.clear();
}
}
}
private static void createAndShowGui() {
APlaneJToggleTest mainPanel = new APlaneJToggleTest();
JFrame frame = new JFrame("APlaneJToggleTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class APlaneJToggle {
private int rows = 15;
private int columns = 6;
private Icon res = (UIManager.getIcon("OptionPane.errorIcon"));
private Icon blankIcon;
private ButtonGroup buttonGroup = new ButtonGroup();
private JPanel panel = new JPanel(new BorderLayout());
public APlaneJToggle() {
int bi_width = res.getIconWidth();
int bi_height = res.getIconHeight();
BufferedImage blankImg = new BufferedImage(bi_width, bi_height,
BufferedImage.TYPE_INT_ARGB);
blankIcon = new ImageIcon(blankImg);
JPanel buttonPanel = new JPanel(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String[] rowChar = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
"X", "Y", "Z" };
for (int column = 1; column < columns + 1; column++) {
String text = rowChar[row] + column;
final JToggleButton button = new JToggleButton(text, blankIcon);
button.setActionCommand(text);
buttonGroup.add(button);
button.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Icon icon = e.getStateChange() == ItemEvent.SELECTED ? res
: blankIcon;
((AbstractButton) e.getSource()).setIcon(icon);
}
});
buttonPanel.add(button);
}
}
JButton selectionButton = new JButton(new DisposeAction("Make Selection"));
JPanel bottomPanel = new JPanel();
bottomPanel.add(selectionButton);
panel.add(buttonPanel, BorderLayout.CENTER);
panel.add(bottomPanel, BorderLayout.PAGE_END);
}
public void clear() {
ButtonModel model = buttonGroup.getSelection();
if (model != null) {
model.setEnabled(false);
}
buttonGroup.clearSelection();
}
public ButtonModel getSelectedModel() {
return buttonGroup.getSelection();
}
public JPanel getMainPanel() {
return panel;
}
private class DisposeAction extends AbstractAction {
public DisposeAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Component comp = (Component) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}
}
}
如果您想关闭应用程序,您也可以使用 System
class.
System.exit(0);
在 Netbeans 中:-
- 从属性中将 defaultCloseOperation 设置为 DISPOSE
JFrame 的。
- 然后在 jButton 的 ActionPerformed() 中键入 this.dispose()。
我正在尝试使用关闭飞机座椅系统的窗格,因此每位乘客只能选择 1 个座位。我研究了一下,知道我需要一行代码 JFrame.dispose();但我不知道该放在哪里,还该放什么。想法? (除此之外,我是一个完整的菜鸟XD)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class APlaneJToggle {
private int rows = 15;
private int columns = 6;
private Icon res = (UIManager.getIcon("OptionPane.errorIcon"));
public APlaneJToggle() {
JPanel panel = new JPanel(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String []rowChar = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
for (int column = 1; column < columns+1; column++) {
final JToggleButton button = new JToggleButton(rowChar[row] + column);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent actionEvent) {
AbstractButton abstractButton = (AbstractButton) actionEvent.getSource();
boolean selected = abstractButton.getModel().isSelected();
if (selected) {
button.setIcon(res);
} else {
button.setIcon(null);
}
}
});
panel.add(button);
}
}
final JFrame frame = new JFrame("Flight");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocation(300, 100);
frame.resize(750,450);
frame.isDefaultLookAndFeelDecorated();
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
APlaneJToggle aPlaneJToggle = new APlaneJToggle();
}
});
}
}
您可以使用 SwingUtilities.getWindowAncestor
到 return 组件所在的 Window
,这样您就可以 dispose
在 returned 结果上。
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private int rows = 15;
private int columns = 6;
public TestPane() {
setLayout(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String[] rowChar = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
for (int column = 1; column < columns + 1; column++) {
final JToggleButton button = new JToggleButton(rowChar[row] + column);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
AbstractButton abstractButton = (AbstractButton) actionEvent.getSource();
boolean selected = abstractButton.getModel().isSelected();
if (selected) {
button.setText("X");
} else {
button.setText("");
}
SwingUtilities.getWindowAncestor(button).dispose();
}
});
add(button);
}
}
}
}
}
您可以考虑使用 JDialog
而不是 JFrame
,因为它可以让您更好地控制程序流程。查看 How to Make Dialogs 了解更多详情
建议:
- 我猜你想让用户只select一个按钮。如果是这样,那么也许是更好的解决方案:使用 ButtonGroup 并将所有 JToggleButton 添加到单个 ButtonGroup。这样用户仍然可以 select 另一个座位,但之前的座位将变为未selected。
- 如果您走这条路,请使用 ItemListener 而不是 ActionListener。
- 调用代码可以轻松地从 ButtonGroup 对象中获取 selected 按钮。
- 如果此 window 将从另一个顶级 JFrame window 显示,最好是作为 JDialog 而不要 JFrame。
例如(迟到总比不到好)
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class APlaneJToggleTest extends JPanel {
private DefaultListModel<String> seatListModel = new DefaultListModel<>();
private JList<String> selectedSeatList = new JList<>(seatListModel);
private JButton getSeatSelectionBtn = new JButton(new GetSelectionAction("Get Selected Button"));
private JDialog getSeatDialog;
private APlaneJToggle aPlaneJToggle = new APlaneJToggle();
public APlaneJToggleTest() {
selectedSeatList.setVisibleRowCount(8);
String prototype = String.format("%20s", " ");
selectedSeatList.setPrototypeCellValue(prototype);
add(getSeatSelectionBtn);
add(new JScrollPane(selectedSeatList));
}
private class GetSelectionAction extends AbstractAction {
public GetSelectionAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
if (getSeatDialog == null) {
Window win = SwingUtilities.getWindowAncestor(APlaneJToggleTest.this);
getSeatDialog = new JDialog(win, "Choose Seat", ModalityType.APPLICATION_MODAL);
getSeatDialog.add(aPlaneJToggle.getMainPanel());
getSeatDialog.setResizable(false);
getSeatDialog.pack();
}
getSeatDialog.setVisible(true);
ButtonModel model = aPlaneJToggle.getSelectedModel();
if (model != null) {
String actionCommand = model.getActionCommand();
seatListModel.addElement(actionCommand);
aPlaneJToggle.clear();
}
}
}
private static void createAndShowGui() {
APlaneJToggleTest mainPanel = new APlaneJToggleTest();
JFrame frame = new JFrame("APlaneJToggleTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class APlaneJToggle {
private int rows = 15;
private int columns = 6;
private Icon res = (UIManager.getIcon("OptionPane.errorIcon"));
private Icon blankIcon;
private ButtonGroup buttonGroup = new ButtonGroup();
private JPanel panel = new JPanel(new BorderLayout());
public APlaneJToggle() {
int bi_width = res.getIconWidth();
int bi_height = res.getIconHeight();
BufferedImage blankImg = new BufferedImage(bi_width, bi_height,
BufferedImage.TYPE_INT_ARGB);
blankIcon = new ImageIcon(blankImg);
JPanel buttonPanel = new JPanel(new GridLayout(rows, columns));
for (int row = 0; row < rows; row++) {
String[] rowChar = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
"X", "Y", "Z" };
for (int column = 1; column < columns + 1; column++) {
String text = rowChar[row] + column;
final JToggleButton button = new JToggleButton(text, blankIcon);
button.setActionCommand(text);
buttonGroup.add(button);
button.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Icon icon = e.getStateChange() == ItemEvent.SELECTED ? res
: blankIcon;
((AbstractButton) e.getSource()).setIcon(icon);
}
});
buttonPanel.add(button);
}
}
JButton selectionButton = new JButton(new DisposeAction("Make Selection"));
JPanel bottomPanel = new JPanel();
bottomPanel.add(selectionButton);
panel.add(buttonPanel, BorderLayout.CENTER);
panel.add(bottomPanel, BorderLayout.PAGE_END);
}
public void clear() {
ButtonModel model = buttonGroup.getSelection();
if (model != null) {
model.setEnabled(false);
}
buttonGroup.clearSelection();
}
public ButtonModel getSelectedModel() {
return buttonGroup.getSelection();
}
public JPanel getMainPanel() {
return panel;
}
private class DisposeAction extends AbstractAction {
public DisposeAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Component comp = (Component) e.getSource();
Window win = SwingUtilities.getWindowAncestor(comp);
win.dispose();
}
}
}
如果您想关闭应用程序,您也可以使用 System
class.
System.exit(0);
在 Netbeans 中:-
- 从属性中将 defaultCloseOperation 设置为 DISPOSE JFrame 的。
- 然后在 jButton 的 ActionPerformed() 中键入 this.dispose()。