java - 在第二个显示器上调整大小时 Swing 挂起

标签 java swing user-interface

主线程调用 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 没有执行任何操作,但也没有卡住。

以下是我修复的问题:

  1. 我将 Swing GUI 代码移至常规类方法(非静态)中。

  2. 我将 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/

相关文章:

xml - 使用 XML 声明一个自定义的 android UI 元素

java - 在 OSGi 框架中运行基于 SWT 的 GUI

java - JNLP 不合作 JFileChooser Access Denied

java - 使用 ForkJoin 查找最大数字

java - 如何使用 Java 参数在属性文件中构建值

java - 我将如何将 boolean 字符串更改为 JTable 中的 JCheckBox?

java - OverlayLayout 好像没有分层

java - 提供声明 - 使复合赋值非法,而简单赋值合法

java - 在 JFrame 中排列多个面板时出错

python - Kivy右键菜单