单击按钮时关闭JFrame窗格

时间:2015-01-26 23:25:08

标签: java swing button jframe 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();
            }
        });
}
}

4 个答案:

答案 0 :(得分:2)

建议:

  1. 我猜你想让用户只选择一个按钮。如果是这样,那么可能是一个更好的解决方案:使用ButtonGroup并将所有JToggleButtons添加到单个ButtonGroup。这样,用户仍然可以选择另一个座位,但前一个座位将被取消选择。
  2. 如果你走这条路线,使用ItemListener而不是ActionListener。
  3. 调用代码可以轻松地从ButtonGroup对象中获取所选按钮。
  4. 如果此窗口将从另一个顶级JFrame窗口显示,则最好是JDialog, JFrame。

  5. 例如(迟到总比没有好)

    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();
          }
       }
    
    }
    

答案 1 :(得分:1)

您可以使用SwingUtilities.getWindowAncestor返回组件所在的Window,这样您就可以dispose返回结果。

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

答案 2 :(得分:0)

如果您想关闭该应用程序,您还可以使用System类。

System.exit(0);

答案 3 :(得分:0)

Netbeans 中: -

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