单击按钮时关闭 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 了解更多详情

建议:

  1. 我猜你想让用户只select一个按钮。如果是这样,那么也许是更好的解决方案:使用 ButtonGroup 并将所有 JToggleButton 添加到单个 ButtonGroup。这样用户仍然可以 select 另一个座位,但之前的座位将变为未selected。
  2. 如果您走这条路,请使用 ItemListener 而不是 ActionListener。
  3. 调用代码可以轻松地从 ButtonGroup 对象中获取 selected 按钮。
  4. 如果此 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 中:-

  1. 从属性中将 defaultCloseOperation 设置为 DISPOSE JFrame 的。
  2. 然后在 jButton 的 ActionPerformed() 中键入 this.dispose()