當我嘗試創建JPopupMenu或實際嘗試去除JPopupMenu時,我用我的代碼行獲得了庫存。我一直在尋找一個解決方案,他們都使用組件 .setVisible(false)或.setVisible(true);Java JPopupMenu setVisible(false);
但在我的情況下,我只是不會工作沒有mather我試過。總而言之,我的應用程序。正在工作,我會使用System.out.println(「工作正常或其他!」);所以我知道語句有變化,循環已經執行並且ActionListener/Itemlistener等都在工作。 Basickly我創建了一個使用「CreateGUI」的主窗口,由main([String [] args)調用,有一個類框架,然後放置在一個Panel窗口中以控制Layout。 我的框架除其他外,還有一個JButton「vHent」,它叫PopKalender(),然後我的JPopupMenu顯示在屏幕上。 在JPopupMenu「popUpKalenderWindow」中,我有一個JButton「kill」,「OK」(Not In Use)和一個MenuItem(「vMenu Tryk Her」)。
我的想法就是從MenuItems中讀取一些狀態,此時JButton「kill」就是關閉JPopupMenu。 但正如說,似乎沒有關閉PopUpMenu!但是其他所有工作都是按照System.out.println()進行檢查的,我會讀出來顯示Loop,Construktor調用,Button/MenuItem等等,它們正在發揮作用, 。 我試着把popUpKalenderWindow.setVisible(false)直接放在我的ActionPerformedListener下,並且只是PopKalender(),試着在popKalender(true/false)中拋出參數true/false,然後創建if語句(就像你可以看現在),它不會工作沒有什麼mather什麼。
(使用Eclipse,所以代碼行被直接複製過了,有些註釋是丹麥語的(我很抱歉),但是需要的行是英文的,還有一些評論是要學習我什麼和爲什麼行被寫入!是的,CheckBox應該在ArrayList中並且使用for(){}完成,所以這是Newbie解決方案! )。
所以任何人都可以幫助我,並告訴我爲什麼PopKalender()不會消失時,按鈕「殺」推?
//package components;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
public class Frame extends JPanel implements ItemListener, ActionListener {
private static final long _1L = 1L;
/**
*
*/
// Klargør CheckBoxes
JCheckBox tal1;
JCheckBox tal2;
JCheckBox tal3;
JCheckBox tal4;
JCheckBox tal5;
JCheckBox tal6;
JCheckBox tal7;
JCheckBox tal8;
JCheckBox tal9;
JCheckBox tal10;
JCheckBox tal11;
JCheckBox tal12;
JCheckBox tal13;
JCheckBox tal14;
JCheckBox tal15;
JCheckBox tal16;
JCheckBox tal17;
JCheckBox tal18;
JCheckBox tal19;
JCheckBox tal20;
JCheckBox tal21;
JCheckBox tal22;
JCheckBox tal23;
JCheckBox tal24;
JCheckBox tal25;
JCheckBox tal26;
JCheckBox tal27;
JCheckBox tal28;
JCheckBox tal29;
JCheckBox tal30;
JCheckBox tal31;
JCheckBox tal32;
JCheckBox tal33;
JCheckBox tal34;
JCheckBox tal35;
JCheckBox tal36;
//Klargør ArrayList til valgte tal
ArrayList<Integer> valg = new ArrayList<Integer>();
//Klargør knapper
JButton vOk; //til valgte tal Tekst: Tilføj
JButton vHent; //til at hente uge/kalender for valg af uge
JButton bRegn; //til at beregne ugen tal
//Klargør Tekster
JLabel labelValg = new JLabel("Du har valgt: "); //til valgte tal
JLabel labelTidNu = new JLabel("år-uge-dag-kl"); //til nuværende tid
JLabel labelValgTid = new JLabel("år-uge der skal skrives til"); //til valgte uge/år, der skal tilføjes Talvalg
JLabel labelUd_1 = new JLabel(" 1: "); //til udlæsning af Talforslag LabelUd_1 - LabelUd_10
JLabel labelUd_2 = new JLabel(" 2: ");
JLabel labelUd_3 = new JLabel(" 3: ");
JLabel labelUd_4 = new JLabel(" 4: ");
JLabel labelUd_5 = new JLabel(" 5: ");
JLabel labelUd_6 = new JLabel(" 6: ");
JLabel labelUd_7 = new JLabel(" 7: ");
JLabel labelUd_8 = new JLabel(" 8: ");
JLabel labelUd_9 = new JLabel(" 9: ");
JLabel labelUd_10 = new JLabel("10: ");
public Frame(){
super(new BorderLayout());
//Opret Paneler til under paneler
//Opret Top, left, center, right, buttom Panel
JPanel topPanel = new JPanel(); //Indsæt BorderLayout efter opstilling !
JPanel leftPanel = new JPanel();
JPanel centerPanel = new JPanel();
JPanel rightPanel = new JPanel();
JPanel bottomPanel = new JPanel();
//Set internt Layout for top, left, right panel
topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
leftPanel.setLayout(new GridLayout(4, 0));
rightPanel.setLayout(new GridLayout(2, 0));
//Set størrelse på paneler
topPanel.setPreferredSize(new Dimension(900, 50));
leftPanel.setPreferredSize(new Dimension(300, 500));
centerPanel.setPreferredSize(new Dimension(300, 500));
rightPanel.setPreferredSize(new Dimension(300, 500));
bottomPanel.setPreferredSize(new Dimension(900, 50));
//tilføj paneler til frame'en og placer dem i layout'et
add(topPanel, BorderLayout.PAGE_START);
add(leftPanel, BorderLayout.LINE_START);
add(centerPanel, BorderLayout.CENTER);
add(rightPanel, BorderLayout.LINE_END);
add(bottomPanel, BorderLayout.PAGE_END);
//Opret Checkboxes
tal1 = new JCheckBox("1");
tal2 = new JCheckBox("2");
tal3 = new JCheckBox("3");
tal4 = new JCheckBox("4");
tal5 = new JCheckBox("5");
tal6 = new JCheckBox("6");
tal7 = new JCheckBox("7");
tal8 = new JCheckBox("8");
tal9 = new JCheckBox("9");
tal10 = new JCheckBox("10");
tal11 = new JCheckBox("11");
tal12 = new JCheckBox("12");
tal13 = new JCheckBox("13");
tal14 = new JCheckBox("14");
tal15 = new JCheckBox("15");
tal16 = new JCheckBox("16");
tal17 = new JCheckBox("17");
tal18 = new JCheckBox("18");
tal19 = new JCheckBox("19");
tal20 = new JCheckBox("20");
tal21 = new JCheckBox("21");
tal22 = new JCheckBox("22");
tal23 = new JCheckBox("23");
tal24 = new JCheckBox("24");
tal25 = new JCheckBox("25");
tal26 = new JCheckBox("26");
tal27 = new JCheckBox("27");
tal28 = new JCheckBox("28");
tal29 = new JCheckBox("29");
tal30 = new JCheckBox("30");
tal31 = new JCheckBox("31");
tal32 = new JCheckBox("32");
tal33 = new JCheckBox("33");
tal34 = new JCheckBox("34");
tal35 = new JCheckBox("35");
tal36 = new JCheckBox("36");
//Set default
tal1.setSelected(false);
tal2.setSelected(false);
tal3.setSelected(false);
tal4.setSelected(false);
tal5.setSelected(false);
tal6.setSelected(false);
tal7.setSelected(false);
tal8.setSelected(false);
tal9.setSelected(false);
tal10.setSelected(false);
tal11.setSelected(false);
tal12.setSelected(false);
tal13.setSelected(false);
tal14.setSelected(false);
tal15.setSelected(false);
tal16.setSelected(false);
tal17.setSelected(false);
tal18.setSelected(false);
tal19.setSelected(false);
tal20.setSelected(false);
tal21.setSelected(false);
tal22.setSelected(false);
tal23.setSelected(false);
tal24.setSelected(false);
tal25.setSelected(false);
tal26.setSelected(false);
tal27.setSelected(false);
tal28.setSelected(false);
tal29.setSelected(false);
tal30.setSelected(false);
tal31.setSelected(false);
tal32.setSelected(false);
tal33.setSelected(false);
tal34.setSelected(false);
tal35.setSelected(false);
tal36.setSelected(false);
//opret en ItemListener for Checkboxes
tal1.addItemListener(this);
tal2.addItemListener(this);
tal3.addItemListener(this);
tal4.addItemListener(this);
tal5.addItemListener(this);
tal6.addItemListener(this);
tal7.addItemListener(this);
tal8.addItemListener(this);
tal9.addItemListener(this);
tal10.addItemListener(this);
tal11.addItemListener(this);
tal12.addItemListener(this);
tal13.addItemListener(this);
tal14.addItemListener(this);
tal15.addItemListener(this);
tal16.addItemListener(this);
tal17.addItemListener(this);
tal18.addItemListener(this);
tal19.addItemListener(this);
tal20.addItemListener(this);
tal21.addItemListener(this);
tal22.addItemListener(this);
tal23.addItemListener(this);
tal24.addItemListener(this);
tal25.addItemListener(this);
tal26.addItemListener(this);
tal27.addItemListener(this);
tal28.addItemListener(this);
tal29.addItemListener(this);
tal30.addItemListener(this);
tal31.addItemListener(this);
tal32.addItemListener(this);
tal33.addItemListener(this);
tal34.addItemListener(this);
tal35.addItemListener(this);
tal36.addItemListener(this);
//Sæt CheckBoxes i 6 kolonner i et Panel
JPanel checkPanel = new JPanel(new GridLayout(0, 6));
checkPanel.add(tal1);
checkPanel.add(tal2);
checkPanel.add(tal3);
checkPanel.add(tal4);
checkPanel.add(tal5);
checkPanel.add(tal5);
checkPanel.add(tal6);
checkPanel.add(tal7);
checkPanel.add(tal8);
checkPanel.add(tal9);
checkPanel.add(tal10);
checkPanel.add(tal11);
checkPanel.add(tal12);
checkPanel.add(tal13);
checkPanel.add(tal14);
checkPanel.add(tal15);
checkPanel.add(tal16);
checkPanel.add(tal17);
checkPanel.add(tal18);
checkPanel.add(tal19);
checkPanel.add(tal20);
checkPanel.add(tal21);
checkPanel.add(tal22);
checkPanel.add(tal23);
checkPanel.add(tal24);
checkPanel.add(tal25);
checkPanel.add(tal26);
checkPanel.add(tal27);
checkPanel.add(tal28);
checkPanel.add(tal29);
checkPanel.add(tal30);
checkPanel.add(tal31);
checkPanel.add(tal32);
checkPanel.add(tal33);
checkPanel.add(tal34);
checkPanel.add(tal35);
checkPanel.add(tal36);
//Set checkpanel størrelse og tilføj det til leftPanel med en ramme
checkPanel.setPreferredSize(new Dimension(290, 290));
leftPanel.add(checkPanel);
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
//leftPanel med valgte tal
leftPanel.add(labelValg);
labelValg.setPreferredSize(new Dimension(290, 25));
//Tilføj tekster
//topPanel m. nuværende tid
topPanel.add(labelTidNu);
labelTidNu.setPreferredSize(new Dimension(210, 25));
//Hjælpe funktioner til ur
Thread t = new Kalender(labelTidNu); //Bruges til at lave en tråd Thread for Kalender
t.start(); //Tråden t startes og kan kontrolleres med Thread.sleep(1000) = pause
//klargør Knapper til: valgte tal
vOk = new JButton("Tilføj Tal");
vOk.setPreferredSize(new Dimension(100, 50));
vOk.setActionCommand("vOk"); //Set ActionCommand til genkendelse
vOk.addActionListener(this); //Tilføj en Action Listener
//hent uge/kalender
vHent = new JButton("Hent Uge");
vHent.setActionCommand("vHent");
vHent.addActionListener(this);
vHent.setPreferredSize(new Dimension(100, 50));
//Beregn ugens tal
bRegn = new JButton("Beregn");
bRegn.setActionCommand("bRegn");
bRegn.addActionListener(this);
bRegn.setPreferredSize(new Dimension(100, 50));
//Opret et knap Panel
JPanel knapPanel = new JPanel();
knapPanel.setLayout(new BoxLayout(knapPanel, BoxLayout.Y_AXIS));
// knapPanel.setPreferredSize(new Dimension(290, 300));
//opret layoutpaneler med flowlayoutX til knapper og tekst
//layoutPanel1
JPanel layoutPanel1 = new JPanel();
layoutPanel1.setLayout(new FlowLayout(FlowLayout.LEFT));
layoutPanel1.setPreferredSize(new Dimension(290, 150));
//layoutPanel2
JPanel layoutPanel2 = new JPanel();
layoutPanel2.setLayout(new FlowLayout(FlowLayout.RIGHT));
layoutPanel2.setPreferredSize(new Dimension(290, 150));
//Tilføj knapper/tekster
layoutPanel1.add(vHent);
layoutPanel1.add(labelValgTid);
layoutPanel2.add(vOk);
knapPanel.add(layoutPanel1);
// knapPanel.add(fillPanel1);
knapPanel.add(layoutPanel2);
leftPanel.add(knapPanel);
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
//Opret panel til udlæsning
JPanel listePanel = new JPanel();
listePanel.setLayout(new BoxLayout(listePanel, BoxLayout.Y_AXIS));
listePanel.setPreferredSize(new Dimension(280, 300));
//Opret Panel til Knap
JPanel knapPanel2 = new JPanel();
knapPanel2.setPreferredSize(new Dimension(280, 150));
knapPanel2.setLayout(new FlowLayout(FlowLayout.RIGHT));
//Tilføj lister/knap
listePanel.add(labelUd_1);
listePanel.add(labelUd_2);
listePanel.add(labelUd_3);
listePanel.add(labelUd_4);
listePanel.add(labelUd_5);
listePanel.add(labelUd_6);
listePanel.add(labelUd_7);
listePanel.add(labelUd_8);
listePanel.add(labelUd_9);
listePanel.add(labelUd_10);
rightPanel.add(listePanel);
knapPanel2.add(bRegn);
rightPanel.add(knapPanel2);
} //Frame end
//Lyt til Checkboxes, send resultatet til Valgtjek og opdater display/LabelValg
public void itemStateChanged(ItemEvent e){
// int index = 0;
Object kilde = e.getItemSelectable();
if(kilde == tal1){
Valgtjek(1);
}else if(kilde == tal2){
Valgtjek(2);
}else if(kilde == tal3){
Valgtjek(3);
}else if(kilde == tal4){
Valgtjek(4);
}else if(kilde == tal5){
Valgtjek(5);
}else if(kilde == tal6){
Valgtjek(6);
}else if(kilde == tal7){
Valgtjek(7);
}else if(kilde == tal8){
Valgtjek(8);
}else if(kilde == tal9){
Valgtjek(9);
}else if(kilde == tal10){
Valgtjek(10);
}else if(kilde == tal11){
Valgtjek(11);
}else if(kilde == tal12){
Valgtjek(12);
}else if(kilde == tal13){
Valgtjek(13);
}else if(kilde == tal14){
Valgtjek(14);
}else if(kilde == tal15){
Valgtjek(15);
}else if(kilde == tal16){
Valgtjek(16);
}else if(kilde == tal17){
Valgtjek(17);
}else if(kilde == tal18){
Valgtjek(18);
}else if(kilde == tal19){
Valgtjek(19);
}else if(kilde == tal20){
Valgtjek(20);
}else if(kilde == tal21){
Valgtjek(21);
}else if(kilde == tal22){
Valgtjek(22);
}else if(kilde == tal23){
Valgtjek(23);
}else if(kilde == tal24){
Valgtjek(24);
}else if(kilde == tal25){
Valgtjek(25);
}else if(kilde == tal26){
Valgtjek(26);
}else if(kilde == tal27){
Valgtjek(27);
}else if(kilde == tal28){
Valgtjek(28);
}else if(kilde == tal29){
Valgtjek(29);
}else if(kilde == tal30){
Valgtjek(30);
}else if(kilde == tal31){
Valgtjek(31);
}else if(kilde == tal32){
Valgtjek(32);
}else if(kilde == tal33){
Valgtjek(33);
}else if(kilde == tal34){
Valgtjek(34);
}else if(kilde == tal35){
Valgtjek(35);
}else if(kilde == tal36){
Valgtjek(36);
}
//Opdater og udlæs valgte
String s = valg.toString();
labelValg.setText("Du har valgt: " +s);
}
//Lyt til Knapper //Button Listener
public void actionPerformed(ActionEvent e){
Object kilde = e.getActionCommand();
if(kilde == "vOk"){
System.out.println("Tillykke vOk er Ramt");
}else{
if(kilde == "vHent"){
PopKalender(true); //Call PopUpWindow
System.out.println("Tillykke vHent er ramt"); //This works and "PopKalender" shows on screen
}else {
if(kilde == "bRegn"){
System.out.println("Tillykke der beregnes");
}
else{
if(kilde == "Kill"){
PopKalender(false);
System.out.println("KILL WINDOW"); //This read out works fine, but "PopKalender" dosen't disappear
// System.exit(0); //Also work but NOT as intended !!! :D
}
}
}
} }
//Ur til topPanel
//Der oprettes en klasse
class Kalender extends Thread {
JLabel labelUrOpdater;
Kalender(JLabel labelTidNu){
labelUrOpdater = labelTidNu;
}
//Opret variabler til nutid år, måned, dag i måned, uge, dag, timer, minutter, sek
int year;
int month;
String monthName;
int date;
int dayOfMonth;
int weekOfYear;
int dayOfWeek;
int hour;
int minute;
int second;
String[] måneder = {"Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December" };
public void run() {
Calendar ur = new GregorianCalendar();
for(;;){
Date trialTime = new Date();
ur.setTime(trialTime);
year = ur.get(Calendar.YEAR);
month = ur.get(Calendar.MONTH);
date = ur.get(Calendar.DATE);
dayOfMonth = ur.get(Calendar.DAY_OF_MONTH);
weekOfYear = ur.get(Calendar.WEEK_OF_YEAR);
dayOfWeek = ur.get(Calendar.DAY_OF_WEEK);
hour = ur.get(Calendar.HOUR_OF_DAY);
minute = ur.get(Calendar.MINUTE);
second = ur.get(Calendar.SECOND);
monthName = måneder[month];
//Sæt 0 foran 0-9 i sekunder/minutter
if((minute <= 9) || (second <= 9)){
if(minute <= 9){
labelTidNu.setText(year + ". " + dayOfMonth + " " + monthName + " " + "Uge: " + weekOfYear + " " + "Kl: " + hour + ":" + "0" + minute + ":" + second);
}else{
if(second <= 9){
labelTidNu.setText(year + ". " + dayOfMonth + " " + monthName + " " + "Uge: " + weekOfYear + " " + "Kl: " + hour + ":" + minute + ":" + "0" + second);
}
}
}
else{
labelTidNu.setText(year + ". " + dayOfMonth + " " + monthName + " " + "Uge: " + weekOfYear + " " + "Kl: " + hour + ":" + minute + ":" + second);
// labelTidNu.repaint();
}
try { Thread.sleep(1000);
} catch(InterruptedException e){
System.out.println("Thread Error");
}
}
}
}
//Tal Checker: Se om de valgte tal er på listen, fjern eller tilføj. Call fra ItemStateChange
public void Valgtjek(int tjek) {
boolean v = valg.contains(tjek);
if(v){
int i = valg.indexOf(tjek);
valg.remove(i);
System.out.println("Fjernede");
}
else{
valg.add(tjek);
System.out.println("valgte :" + tjek);
}
}
//ActionListener for PopUpKalender "PopKalender"/ActionListener f. JPopupMenu
class PopKalValg implements ActionListener{
public void actionPerformed(ActionEvent actionEvent){
System.out.println("Valgt" + actionEvent.getActionCommand());
}
}
//Pop-up til kalender valg (Popup Menu for my Pick Calender
public void PopKalender(boolean pState){
boolean pTest = false;
JPopupMenu popUpKalenderWindow = new JPopupMenu();
// popUpKalenderWindow.setDefaultCloseOperation();
popUpKalenderWindow.setPreferredSize(new Dimension(400, 400));
popUpKalenderWindow.setLocation(700, 300);
ActionListener kalActionValg = new PopKalValg(); //ActionListener to objects inside the JPopupMenu
JPanel popPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); //Panel to hold objects and control layout
JButton dOk = new JButton("OK"); //Not in use, just show
JMenuItem vMenu = new JMenuItem("vMenu Tryk Her"); //test Item to learn JMenuItem
vMenu.addActionListener(kalActionValg);
popPanel.add(vMenu);
JButton kill = new JButton("kill"); //In Use, supposed to shut down JPopupMenu
kill.setActionCommand("Kill");
kill.addActionListener(this);
popPanel.add(dOk);
popPanel.add(kill);
popUpKalenderWindow.add(popPanel);
if(pTest != pState){
popUpKalenderWindow.setVisible(true); //works fine
pTest = true;
System.out.println(pTest); // works fine, state has changed
}else{
// getRootPane().setVisible(false); //Dosen't work
// popPanel.setVisible(false); Dosen't Work
popUpKalenderWindow.setVisible(false); // Dosen't work
System.out.println("Pop set visible false"); //Do work, so loop statement has been reached !!!
}
}
private static void createAndShowGUI(){
//Create and set up window
JFrame frame = new JFrame("Mit Program");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Afslut Runtime ved vindue luk
frame.setPreferredSize(new Dimension(900, 600)); //Set størrelse på vinduet
/* //Create background, put background in ContentPane place it Center
JLabel bckGnd = new JLabel("");
frame.getContentPane().add(bckGnd, BorderLayout.CENTER);
*/
//Opret et Ground Panel til panels
JComponent groundPanel = new Frame();
groundPanel.setOpaque(true); //content Panes skal være opaque
frame.getContentPane().add(groundPanel); //Tilføj GroundPanel til frame
//Display Window
frame.pack();
frame.setVisible(true);
}
//SerialVersion ???
private static final long serialVersionUID = _1L;
public static void main(String[] args) {
// Schedule a job for event-dispatching thread:
//Creating and showing this Application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGUI();
}
});
}
}
你絕對需要學習使用數組和其他集合,並使用循環。 – 2012-03-10 19:48:44
它確實需要36個複選框才能證明無法使一個彈出窗口看不見? – 2012-03-10 19:59:41
你的代碼是令人痛苦的眼睛,你可能想學習基本的Java,包括在學習GUI編碼之前如何使用數組,集合,泛型,因爲後者建立在前者之上。 – 2012-03-10 20:24:12