고객은 UI에 문제가 있다고합니다. 때로는 그들이 팝업 메뉴를 열고 사라진 후에도 회색 영역이 사라지지 않았습니다. 우리는 팝업 장소 (JPopupMenu
)에 표시된 스윙과 회색 사각형을 사용합니다.스윙 JPopupMenu : 회색 영역 겹침
나는 그 문제를 재현 할 수 있습니다. 그것에 대해 읽을 수있는 곳은 어디입니까? 이와 직접 스윙 JComponent의 반대와 AWT PopupMenu를 혼합
고객은 UI에 문제가 있다고합니다. 때로는 그들이 팝업 메뉴를 열고 사라진 후에도 회색 영역이 사라지지 않았습니다. 우리는 팝업 장소 (JPopupMenu
)에 표시된 스윙과 회색 사각형을 사용합니다.스윙 JPopupMenu : 회색 영역 겹침
나는 그 문제를 재현 할 수 있습니다. 그것에 대해 읽을 수있는 곳은 어디입니까? 이와 직접 스윙 JComponent의 반대와 AWT PopupMenu를 혼합
불가능이 이유가 무엇이든간에 그 반대로 스윙 AWT PopupMenu
을 혼합하는 방법을 그리워 (aaaach 이유 AWT의 나머지 동일하지 구현이며 J 스윙/Component too)
out of EDT 여기에 게시 한 이미지와 아무런 관련이 없습니다. Popup과 JPopup이 모두 API의 MOUSE_RIGHT_CLICK에서 관련 메소드를 올바르게 구현했기 때문에 AWT PopupMenu 만 첫 번째 모니터에만 표시됩니다 2 번째 또는 3 번째 모니터에도 컨테이너를 배치 할 수 있습니다. AFAIK는 Swing JPopupMenu에만 고정됩니다
, J/팝업은 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;
}
}
가) 코드가 JMenuItem를 (들)
를 추가하지 않습니다있다b)는 코드가 JComponent에 (들)
C) 어쩌면이 추가 된 사용자 정의 구성 요소를 추가하지 않습니다, 다음 아무도
전혀 GUI의 모든 AWT 구성 요소가 있습니까 몰라? 모든 GUI 업데이트가 EDT에서 수행됩니까? –
@AndrewThompson의 설명을 더욱 명확하게하기 위해 [메뉴 튜토리얼] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html)에서 경량급/중량급 및 메뉴의 혼합이 다루어지고 [this ] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)도 흥미로운 기사 일 수 있습니다. – Robin