Swing JPopupMenu:灰色区域重叠

时间:2012-05-01 17:57:56

标签: java swing jpopupmenu

客户说他们有UI问题。有时当它们打开弹出菜单并在它消失后灰色区域没有消失。我们使用弹出位置(JPopupMenu)显示的Swing和灰色矩形。

Gray area

我无法重现那个问题。我能在哪里读到这个?

1 个答案:

答案 0 :(得分:1)

  • 不可能直接将AWT PopupMenu与任何Swing JComponent混合,反之亦然,理由错过了将AWT PopupMenu与Swing Whatever混合的方法,反之亦然(aaaach为什么不同于AWT的其余部分和Swing J / Component也是如此)

  • EDT中的
  • 与你在这里发布的图片没有任何关系,因为Popup和JPopup都正确地在API中实现了MOUSE_RIGHT_CLICK的相关方法,只有AWT PopupMenu才会在第一个监视器甚至容器上显示可放置在第二或第三台显示器上,AFAIK仅适用于Swing JPopupMenu

如果在EDT中没有任何事件,例如30秒后EDT返回false,则J / Popup在所有情况下都适用于Java6_019或22

import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Label;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class IsThereEDT {

    private ScheduledExecutorService scheduler;
    private AccurateScheduledRunnable periodic;
    private ScheduledFuture<?> periodicMonitor;
    private int taskPeriod = 30;
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    private Date dateRun;
    private JFrame frame1 = new JFrame("Frame 1");
    private Frame frame2 = new Frame("Frame 2");
    private PopupMenu popup1 = new PopupMenu();

    public IsThereEDT() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        periodic = new AccurateScheduledRunnable() {

            private final int ALLOWED_TARDINESS = 200;
            private int countRun = 0;
            private int countCalled = 0;
            private int maxCalled = 10;

            @Override
            public void run() {
                countCalled++;
                if (countCalled < maxCalled) {
                    if (countCalled % 3 == 0) {
                        /*if (EventQueue.isDispatchThread()) {
                        SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                        //some stuff
                        }
                        });
                        } else {
                        try {
                        SwingUtilities.invokeAndWait(new Runnable() {

                        @Override
                        public void run() {
                        //some stuff
                        }
                        });
                        } catch (InterruptedException ex) {
                        Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InvocationTargetException ex) {
                        Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        }*/
                        /*SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                        System.out.println("Push a new event to EDT");
                        frame1.repaint();
                        isThereReallyEDT();
                        }
                        });*/
                    } else {
                        if (this.getExecutionTime() < ALLOWED_TARDINESS) {
                            countRun++;
                            isThereReallyEDT(); // non on EDT
                        }
                    }
                } else {
                    System.out.println("Terminating this madness");
                    System.exit(0);
                }
            }
        };
        periodicMonitor = scheduler.scheduleAtFixedRate(periodic, 0, taskPeriod, TimeUnit.SECONDS);
        periodic.setThreadMonitor(periodicMonitor);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                isThereReallyEDT();
                Label label1 = new Label("Hello in frame 1");

                for (int i = 1; i <= 5; i++) {
                    MenuItem menuItem = new MenuItem("item" + i);
                    popup1.add(menuItem);
                }
                label1.add(popup1);
                frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame1.add(label1);
                frame1.pack();
                frame1.setLocation(100, 100);
                frame1.setVisible(true);
            }
        });
        try {
            Thread.sleep(1500);
        } catch (InterruptedException ex) {
            Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex);
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                //frame2.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
                JLabel label2 = new JLabel("Hello in frame 2");
                frame2.add(label2);
                frame2.pack();
                frame2.setLocation(200, 200);
                frame2.setVisible(true);
                isThereReallyEDT();
            }
        });
    }

    private void isThereReallyEDT() {
        dateRun = new java.util.Date();
        System.out.println("                         Time at : " + sdf.format(dateRun));
        if (EventQueue.isDispatchThread()) {
            System.out.println("EventQueue.isDispatchThread");
        } else {
            System.out.println("There isn't Live EventQueue.isDispatchThread, why any reason for that ");
        }
        if (SwingUtilities.isEventDispatchThread()) {
            System.out.println("SwingUtilities.isEventDispatchThread");
        } else {
            System.out.println("There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        IsThereEDT isdt = new IsThereEDT();
    }
}

abstract class AccurateScheduledRunnable implements Runnable {

    private ScheduledFuture<?> thisThreadsMonitor;

    public void setThreadMonitor(ScheduledFuture<?> monitor) {
        this.thisThreadsMonitor = monitor;
    }

    protected long getExecutionTime() {
        long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS);
        return delay;
    }
}
  • 如果调用Swing JComponent并且从EDT中看到可见,则返回从Native OS返回的最小Bounds,但是您的JPopuMenu Container返回更大的区域,那么

a)您的代码未添加JMenuItem(s)

b)您的代码不添加JComponent(s)

c)也许有添加自定义组件,然后没有人知道