主线程调用 GUI() 函数,该函数使用 jtable (DefaultTableModel) 添加框架、菜单、菜单项和滚动 Pane 。
如果我将正在运行的应用程序放置到第二个显示器/屏幕上,当我切换到其他应用程序或尝试调整它的大小时,它就会挂起。
public static void main(String[] args) {
GUI();
}
public static void GUI(){
JButton button;
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
window = new JFrame();
window.setResizable(false);
//menu
menuBar = new JMenuBar();
menu = new JMenu("Start");
submenu = new JMenu("New");
menu.add(submenu);
menuItem = new JMenuItem("menu1");
menuItem.addActionListener(new buttonActionListener("m1"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu2");
menuItem.addActionListener(new buttonActionListener("m2"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu3");
menuItem.addActionListener(new buttonActionListener("m3"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu4");
menuItem.addActionListener(new buttonActionListener("m4"));
submenu.add(menuItem);
menuBar.add(menu); //start
menu = new JMenu("Options");
menuBar.add(menu); //options
//top panel
JPanel top = new JPanel();
button = new JButton("Paste");
button.addActionListener(new buttonActionListener("paste"));
top.add(button);
button = new JButton("Copy");
button.addActionListener(new buttonActionListener("copy"));
top.add(button);
JButton start = new JButton("Start");
start.addActionListener(new buttonActionListener("start"));
top.add(start);
//main panel with table
main = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
DefaultTableModel model = new DefaultTableModel();
table = new JTable(model);
//bottom panel
JPanel bottom = new JPanel();
Creq = new JCheckBox();
Creq.setSelected(true);
item= new JTextField("item");
comment = new JTextField("comment");
target= new JTextField("target");
req = new JTextField("requirement");
bottom.add(Creq);
bottom.add(req);
bottom.add(item);
depToUpdate.setVisible(true);
bottom.add(target);
targetDep.setVisible(true);
bottom.add(comment);
comment.setVisible(true);
window.setJMenuBar(menuBar);
window.add(top, BorderLayout.NORTH);
window.add(main, BorderLayout.CENTER);
window.add(bottom, BorderLayout.SOUTH);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
}
最佳答案
在花了太多时间修复代码以便它实际上可以在 Java 中运行之后,我在 Windows 8 中的第二台显示器上测试了 GUI。GUI 没有执行任何操作,但也没有卡住。
以下是我修复的问题:
我将 Swing GUI 代码移至常规类方法(非静态)中。
我将 Swing 组件放在 Event Dispatch thread 上。您必须始终在事件调度线程上创建并执行 Swing 组件。
这是我运行的代码的版本。
package snippet;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class Snippet implements Runnable{
private JCheckBox creq;
private JFrame window;
private JScrollPane main;
private JTable table;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Snippet());
}
@Override
public void run() {
JButton button;
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
window = new JFrame();
window.setResizable(false);
// menu
menuBar = new JMenuBar();
menu = new JMenu("Start");
submenu = new JMenu("New");
menu.add(submenu);
menuItem = new JMenuItem("menu1");
// menuItem.addActionListener(new buttonActionListener("m1"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu2");
// menuItem.addActionListener(new buttonActionListener("m2"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu3");
// menuItem.addActionListener(new buttonActionListener("m3"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu4");
// menuItem.addActionListener(new buttonActionListener("m4"));
submenu.add(menuItem);
menuBar.add(menu); // start
menu = new JMenu("Options");
menuBar.add(menu); // options
// top panel
JPanel top = new JPanel();
button = new JButton("Paste");
// button.addActionListener(new buttonActionListener("paste"));
top.add(button);
button = new JButton("Copy");
// button.addActionListener(new buttonActionListener("copy"));
top.add(button);
JButton start = new JButton("Start");
// start.addActionListener(new buttonActionListener("start"));
top.add(start);
// main panel with table
// main = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
// ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
DefaultTableModel model = new DefaultTableModel();
table = new JTable(model);
main = new JScrollPane(table);
// bottom panel
JPanel bottom = new JPanel();
creq = new JCheckBox();
creq.setSelected(true);
JTextField item = new JTextField("item");
JTextField comment = new JTextField("comment");
JTextField target = new JTextField("target");
JTextField req = new JTextField("requirement");
bottom.add(creq);
bottom.add(req);
bottom.add(item);
// depToUpdate.setVisible(true);
bottom.add(target);
// targetDep.setVisible(true);
bottom.add(comment);
comment.setVisible(true);
window.setJMenuBar(menuBar);
window.add(top, BorderLayout.NORTH);
window.add(main, BorderLayout.CENTER);
window.add(bottom, BorderLayout.SOUTH);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
关于java - 在第二个显示器上调整大小时 Swing 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24241281/