簡體   English   中英

單擊按鈕時關閉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();
            }
        });
}
}

意見建議:

  1. 我猜想您要允許用戶僅選擇一個按鈕。 如果是這樣,那么也許是一個更好的解決方案:使用ButtonGroup並將所有JToggleButtons添加到單個ButtonGroup中。 這樣,用戶仍然可以選擇另一個座位,但是前一個座位將變為未選擇狀態。
  2. 如果使用此路由,請使用ItemListener而不是ActionListener。
  3. 調用代碼可以輕松地從ButtonGroup對象中獲取選定的按鈕。
  4. 如果將從另一個頂級JFrame窗口顯示此窗口,則最好將其作為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();
      }
   }

}

您可以使用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因為它將使您更好地控制程序流程。 看看如何制作對話框了解更多詳細信息

如果要關閉應用程序,則也可以使用System類。

System.exit(0);

Netbeans中

  1. 從JFrame的屬性中將defaultCloseOperation設置為DISPOSE
  2. 然后在jButtonActionPerformed()中鍵入this.dispose()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM