关闭java弹出框而不退出程序 public ButtonGrid(int-width,int-length){//constructor 帧。设置标题(“MPC”); frame.setLayout(新网格布局(宽度、长度));//设置布局 grid=newjbutton[width-1][length];//分配网格的大小 对于(int y=0;y
最佳解决方案:不要“弹出”JFrame。使用JDialog来代替它,因为关闭它不会关闭你的程序,这正是它们的用途。是的,你可以将JFrame的defaultCloseOperation更改为在关闭时不执行任何操作,但你仍然会使用主程序窗口来执行它不打算执行的操作。最好使用正确的工具,JDialog。注意另外,JDialog可以接受当前放在“弹出”JFrame中的任何复杂GUI 例如:关闭java弹出框而不退出程序 public ButtonGrid(int-width,int-length){//constructor 帧。设置标题(“MPC”); frame.setLayout(新网格布局(宽度、长度));//设置布局 grid=newjbutton[width-1][length];//分配网格的大小 对于(int y=0;y,java,swing,jframe,popupwindow,Java,Swing,Jframe,Popupwindow,最佳解决方案:不要“弹出”JFrame。使用JDialog来代替它,因为关闭它不会关闭你的程序,这正是它们的用途。是的,你可以将JFrame的defaultCloseOperation更改为在关闭时不执行任何操作,但你仍然会使用主程序窗口来执行它不打算执行的操作。最好使用正确的工具,JDialog。注意另外,JDialog可以接受当前放在“弹出”JFrame中的任何复杂GUI 例如: public ButtonGrid(int width, int length){ //constructor
public ButtonGrid(int width, int length){ //constructor
frame.setTitle("MPC");
frame.setLayout(new GridLayout(width,length)); //set layout
grid=new JButton[width-1][length]; //allocate the size of grid
for(int y=0; y<length; y++){
for(int x=0; x<width-1; x++){
grid[x][y]=new JButton("("+x+","+y+")"); //creates new button
frame.add(grid[x][y]); //adds button to grid
grid[x][y].addActionListener(this);
grid[x][y].addKeyListener(this);
//grid[x][y].setMnemonic(KeyEvent.VK_0);
grid[x][y].setPreferredSize(new Dimension(75,75));
}
}
for(int i =0; i<boxList.length; i++)
box.addItem(boxList[i]);
box.addActionListener(this);
frame.add(box);
frame.add(met_speed);
frame.add(Play);
Play.addActionListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack(); //sets appropriate size for frame
frame.setVisible(true); //makes frame visible
}
public void newWindow(){
JFrame frame1 = new JFrame();
frame1.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JTextField[] btn = new JTextField[12];
JLabel[] lbl = new JLabel[12];
JLabel name = new JLabel("Preset Name");
JTextField name1 = new JTextField();
name1.setPreferredSize(new Dimension(100,25));
gbc.gridx = 0;
gbc.gridy = 0;
frame1.add(name, gbc);
gbc.gridx++;
frame1.add(name1, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
for(int i = 0; i<12; i++){
lbl[i] = new JLabel("Button" + (i+1));
frame1.add(lbl[i], gbc);
gbc.gridy++;
}
gbc.gridx = 1;
gbc.gridy = 1;
for(int i = 0; i<12; i++){
btn[i] = new JTextField();
btn[i].setPreferredSize(new Dimension(75,25));
frame1.add(btn[i], gbc);
gbc.gridy++;
}
gbc.gridx = 0;
gbc.gridy = 14;
JButton save = new JButton("Save");
frame1.add(save, gbc);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.pack(); //sets appropriate size for frame
frame1.setVisible(true); //makes frame visible
}
请运行此命令以注意两种顶级窗口之间的行为差异:
- 当创建第二个JFrame时,工具栏上会创建第二个不必要的图标,因为操作系统认为您正在创建一个全新的应用程序,而不是单个应用程序中的第二个窗口。JDialog不会这样做
- 第二个JFrame可以位于主JFrame窗口的后面,而JDialog则位于主窗口的顶部,因为它是主应用程序的子窗口
- 如果在对话框可见时关闭主窗口,则整个应用程序都会相应地关闭,但第二个JFrame不会关闭,这意味着会留下一个悬空窗口,而主应用程序不支持它
- JDialog具有以模式方式显示的选项,这意味着在对话框不再可见之前,底层窗口将从用户交互中锁定。此选项在JFrame中不可用
import java.awt.Dialog.ModalityType;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TwoWindows {
public static final int PREF_W = 600;
public static final int PREF_H = 400;
private static void createAndShowGui() {
final JFrame frame = new JFrame("Main Application");
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
buttonPanel.add(new JButton(new AbstractAction("New JFrame") {
{
putValue(MNEMONIC_KEY, KeyEvent.VK_F);
}
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame2 = new JFrame("Frame 2");
frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setupAndDisplay(frame2);
}
}));
buttonPanel.add(new JButton(new AbstractAction("New Modeless JDialog") {
{
putValue(MNEMONIC_KEY, KeyEvent.VK_D);
}
@Override
public void actionPerformed(ActionEvent e) {
JDialog dialog = new JDialog(frame, "Modeless Dialog", ModalityType.MODELESS);
setupAndDisplay(dialog);
}
}));
buttonPanel.add(new JButton(new AbstractAction("New Modal JDialog") {
{
putValue(MNEMONIC_KEY, KeyEvent.VK_M);
}
@Override
public void actionPerformed(ActionEvent e) {
JDialog dialog = new JDialog(frame, "Modal Dialog", ModalityType.APPLICATION_MODAL);
setupAndDisplay(dialog);
}
}));
JPanel mainPanel = new JPanel() {
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
};
mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
mainPanel.add(buttonPanel);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private static void setupAndDisplay(Window window) {
window.add(Box.createRigidArea(new Dimension(200, 100)));
window.pack();
window.setLocationByPlatform(true);
window.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
frame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//您有frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这正是“当我关闭frame1
时退出程序”的意思。请看一看您应该避免显示多个帧的原因…grid[x][y]。setPreferredSize(新维度(75,75));
请参见(是)还有一个,请看演示。但最终,请看前面提到的。现在我将使用这一个,但将查看@MadProgrammer的帖子。谢谢though@user3562657:为什么使用此工具而不是JDialog?是否确实要在用户工具栏上创建新的不必要的图标?是否确实要在制作su时遇到问题这不是最好的解决方案,也不应该是公认的答案。
frame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//<-- destroy only this frame