我是整个Java Swing / AWT对话框的新手(这解释了下面这个对话框的业余爱好者是什么样的,欢迎任何有关安排它的帮助:)我很难在两个JButton中的任何一个关闭这个popUp窗口点击。
我已经尝试了frame.dispose()
,frame.setVisible(false)
甚至SwingUtilities.getWindowAncestor(this).dispose();
同样,这是另一个正在运行的主进程调用的辅助弹出窗口,所以我只想让这个特定的popUp窗口关闭而不影响主进程。否则我可以使用System.exit
正如我所提到的,任何其他改善对话框整体外观的建议都值得赞赏。
我的整个代码如下:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class UpgradePopupWindow extends JPanel implements ActionListener {
public static UpgradePopupWindow mainWindow;
static final long serialVersionUID = 0;
final String upgrade = "Continue Upgrade";
final String restore = "Restore";
JPanel panels;
JButton flashMe;
JButton helpMe;
JTextArea Message;
JFrame frame;
protected JTextArea addText(String text, boolean visible, int fontStyle) {
JTextArea textArea = new JTextArea(text);
textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setEditable(false);
textArea.setForeground(Color.WHITE);
textArea.setOpaque(false);
textArea.setVisible(visible);
textArea.setAlignmentX(Component.CENTER_ALIGNMENT);
add(textArea);
return textArea;
}
public UpgradePopupWindow(Object ft) {
String text = "This is the random text for now. I will bother about the actual content later";
addLabel(text, Font.PLAIN, 12);
flashMe = new JButton(upgrade);
flashMe.setActionCommand("upgrade");
flashMe.addActionListener(this);
flashMe.setEnabled(true);
add(flashMe);
helpMe = new JButton(restore);
helpMe.setActionCommand("restore");
helpMe.addActionListener(this);
helpMe.setEnabled(true);
add(helpMe);
}
protected JLabel addLabel(String text, int fontStyle, int size) {
JLabel label = new JLabel(text);
label.setFont(new Font("SansSerif", fontStyle, size));
label.setAlignmentX(Component.CENTER_ALIGNMENT);
label.setOpaque(false);
label.setVisible(true);
label.setForeground(Color.BLUE);
add(label);
return label;
}
public void createGUI(Object obj) {
//Create and set up the frame.
frame = new JFrame("PopUp Dialog");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//create and setup the content pane
UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj);
popUpContentPane.setOpaque(true);
frame.setContentPane(popUpContentPane);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if("restore".equals(e.getActionCommand())) {
System.out.println("restore button selected");
frame.dispose();
SwingUtilities.getWindowAncestor(this).dispose();
} else if ("upgrade".equals(e.getActionCommand())) {
System.out.println("upgrade button selected");
frame.dispose();
}
}
}
答案 0 :(得分:2)
问题是你的createGUI方法不是静态的。所以我想你首先要创建一个UpgradePopupWindow,在其上调用createGUI,然后创建一个enw UpgradePopupWindow。
请改为尝试:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TempTest
{
public static void main(String[] args)
{
UpgradePopupWindow.createGUI(null);
}
}
class UpgradePopupWindow extends JPanel implements ActionListener {
public static UpgradePopupWindow mainWindow;
static final long serialVersionUID = 0;
final String upgrade = "Continue Upgrade";
final String restore = "Restore";
JPanel panels;
JButton flashMe;
JButton helpMe;
JTextArea Message;
JFrame frame;
protected JTextArea addText(String text, boolean visible, int fontStyle) {
JTextArea textArea = new JTextArea(text);
textArea.setFont(new Font("SansSerif", fontStyle, 12)); //$NON-NLS-1$
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setEditable(false);
textArea.setForeground(Color.WHITE);
textArea.setOpaque(false);
textArea.setVisible(visible);
textArea.setAlignmentX(Component.CENTER_ALIGNMENT);
add(textArea);
return textArea;
}
public UpgradePopupWindow(JFrame frm, Object ft2) {
String text = "This is the random text for now. I will bother about the actual content later";
addLabel(text, Font.PLAIN, 12);
frame = frm;
flashMe = new JButton(upgrade);
flashMe.setActionCommand("upgrade");
flashMe.addActionListener(this);
flashMe.setEnabled(true);
add(flashMe);
helpMe = new JButton(restore);
helpMe.setActionCommand("restore");
helpMe.addActionListener(this);
helpMe.setEnabled(true);
add(helpMe);
}
protected JLabel addLabel(String text, int fontStyle, int size) {
JLabel label = new JLabel(text);
label.setFont(new Font("SansSerif", fontStyle, size));
label.setAlignmentX(Component.CENTER_ALIGNMENT);
label.setOpaque(false);
label.setVisible(true);
label.setForeground(Color.BLUE);
add(label);
return label;
}
public static void createGUI(Object obj) {
//Create and set up the frame.
JFrame frame = new JFrame("PopUp Dialog");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//create and setup the content pane
UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(frame, obj);
popUpContentPane.setOpaque(true);
frame.setContentPane(popUpContentPane);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if("restore".equals(e.getActionCommand())) {
System.out.println("restore button selected");
frame.dispose();
SwingUtilities.getWindowAncestor(this).dispose();
} else if ("upgrade".equals(e.getActionCommand())) {
System.out.println("upgrade button selected");
frame.dispose();
}
}
}
主要的变化是createUI是静态的,而UpgradePopupWindow是构造函数中的框架。
答案 1 :(得分:2)
你的createGUI()方法有点混淆,它创建了这个类的另一个实例,最终得到一个带有框架的实例和一个没有实例的实例。让它工作的最小变化是改变你的createGUI方法:
public void createGUI(Object obj) {
//Create and set up the frame.
frame = new JFrame("PopUp Dialog");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// //create and setup the content pane
// UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj);
setOpaque(true);
frame.setContentPane(this);
frame.pack();
frame.setVisible(true);
}
答案 2 :(得分:0)
问题是您有两个UpgradePopupWindow类的实例。首先,您需要创建一个实例,以便可以调用createGUI()方法。然后在createGUI方法中创建该类的另一个实例。我肯定不是你想要的。
一种解决方案是使createGUI()方法保持静态。我从类中删除了“frame”变量并进行了以下更改:
public static void createGUI(Object obj) {
//Create and set up the frame.
JFrame frame = new JFrame("PopUp Dialog");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//create and setup the content pane
UpgradePopupWindow popUpContentPane = new UpgradePopupWindow(obj);
popUpContentPane.setOpaque(true);
frame.setContentPane(popUpContentPane);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if("restore".equals(e.getActionCommand())) {
System.out.println("restore button selected");
// frame.dispose();
SwingUtilities.getWindowAncestor(this).dispose();
} else if ("upgrade".equals(e.getActionCommand())) {
System.out.println("upgrade button selected");
// frame.dispose();
SwingUtilities.getWindowAncestor(this).dispose();
}
}
public static void main(String[] args)
{
UpgradePopupWindow.createGUI(null);
}
答案 3 :(得分:0)
在createGUI()
方法中,您将实例化frame
变量并将其内容窗格设置为另一个UpgradePopupWindow实例。但是您没有实例化该第二个实例的frame
变量。单击“还原”或“升级”按钮时,它将调用该第二个实例的actionPerformed()
方法,因此frame.dispose()
和frame.setVisible(false)
将无效,因为{{ 1}}为空。
我建议让您的UpgradePopupWindow类扩展frame
而不是JPanel。这样,您可以直接调用JFrame
方法。另外,让一个类==一个窗口(JPanel不是一个窗口,只是一组GUI小部件)更有意义。然后,在构造函数中创建一个JPanel并将小部件添加到该构造函数中。你也可以摆脱那个讨厌的dispose()
静态变量。
另外,我认为mainWindow
不是你想要在这里使用的。您想要关闭窗口,而不是终止整个应用程序。 JFrame.EXIT_ON_CLOSE
将在窗口关闭时处理它。
您还可以通过实施JFrame.DISPOSE_ON_CLOSE
界面,更精细地调整对话框对窗口事件的反应方式。
外观对我来说很好看。简单直接。
WindowListener