【问题标题】:How to close a jframe without closing the main program?如何在不关闭主程序的情况下关闭 jframe?
【发布时间】:2012-04-13 19:03:36
【问题描述】:

我设计了 java 桌面应用程序 当我按下按钮时在那个应用程序中 显示了另一个绘制树的 Jframe 但是当我关闭 Jframe 时,整个操作就关闭了 但我只想关闭那个 Jfarme 我该怎么办? 这是jframe代码:

public  class DrawTree extends JFrame{
 public int XDIM, YDIM;
public Graphics display;

@Override
public void paint(Graphics g) {} // override method

// constructor sets window dimensions
public DrawTree(int x, int y)
{
XDIM = x;  YDIM = y;
this.setBounds(0,0,XDIM,YDIM);
this.setVisible(false); 
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
display = this.getGraphics();
// draw static background as a black rectangle
display.setColor(Color.black);
display.fillRect(0,0,x,y);
    display.setColor(Color.red);
try{Thread.sleep(500);} catch(Exception e) {} // Synch with system
}  // drawingwindow


public static int depth(BinaryNode N)  // find max depth of tree
{
if (N==null) return 0;
    int l = depth(N.left);
    int r = depth(N.right);
    if (l>r) return l+1; else return r+1;
}

// internal vars used by drawtree routines:
private int bheight = 50; // branch height
private int yoff = 30;  // static y-offset

// l is level, lb,rb are the bounds (position of left and right child)
private void drawnode(BinaryNode N,int l, int lb, int rb)
{
if (N==null) return;
try{Thread.sleep(100);} catch(Exception e) {} // slow down
    display.setColor(Color.green);
display.fillOval(((lb+rb)/2)-10,yoff+(l*bheight),20,20);
display.setColor(Color.red);
display.drawString(N.element+"",((lb+rb)/2)-5,yoff+15+(l*bheight));
display.setColor(Color.blue); // draw branches
    if (N.left!=null)
    {
       display.drawLine((lb+rb)/2,yoff+10+(l*bheight),((3*lb+rb)/4),yoff+(l*bheight+bheight));
           drawnode(N.left,l+1,lb,(lb+rb)/2);
    }
    if (N.right!=null)
    {
           display.drawLine((lb+rb)/2,yoff+10+(l*bheight),((3*rb+lb)/4),yoff+(l*bheight+bheight));
           drawnode(N.right,l+1,(lb+rb)/2,rb);
    }
} // drawnode

public void drawtree(BinaryNode T)
{
    if (T==null) return;
int d = depth(T);
bheight = (YDIM/d);
display.setColor(Color.white);
display.fillRect(0,0,XDIM,YDIM);  // clear background
    drawnode(T,0,0,XDIM);
}}

还有一个问题

当我从树类中新建一个对象时,我想在所有按钮代码中访问该对象 那么我应该在哪里定义或者更好地说,我应该如何定义可以在我的所有代码中访问的对象??

【问题讨论】:

  • 你能给我们展示一下首先显示JFrame的代码吗?
  • 1) "another Jframe is shown"The Use of Multiple JFrames, Good/Bad Practice? 2) 请找到你的 shift 键并在每个句子的开头应用它,对于单词 I 和 class JFrame 之类的名称。尝试和阅读这种混乱是痛苦的。 3)该代码似乎与问题无关。 4) "and another question" 那是..another question 的话题。请不要试图将 2 个问题合二为一。

标签: java jframe


【解决方案1】:

您应该将默认关闭操作设置为 HIDE_ON_CLOSE

  this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

根据建议: 请注意,使用 DISPOSE_ON_CLOSE,如果这不是打开的最后一个 JFrame,您仍然可以保持程序运行: (取自 javadocs) 注意:当 Java 虚拟机 (VM) 中的最后一个可显示窗口被处理掉时,VM 可能会终止。有关详细信息,请参阅 AWT 线程问题。

【讨论】:

  • 您应该将该评论编辑到您的答案中,然后删除该评论。我建议不要使用多个框架(查看我评论中的链接),但 +1 以获得技术上正确的答案。
  • ^我确实同意你的观点,但我只是想将其列为替代方案,因为之前的回答者已经发布了 DISPOSE_ON_CLOSE。
  • "previous answer" 是的,我看到了。幸好被楼主删了。感谢您清除它。 :)
【解决方案2】:

您可以简单地隐藏 JFrame。

this.hide();

编辑:对于上述内容:Youssef G 的答案更好。

对于问题的第二部分。创建你的树类并在你的程序中传递对象,所以它是同一个树对象。不要创建一个新的。

例如:

Class A {
     B b;    //B object inside class A
     Tree t;  //Tree object inside class A
}
Class B {
     Tree t;    //Tree object inside class B
}

现在您在两个类中都有一个树对象。您可以在代码在 A 类中运行时创建一个新树,它是 B 类的树。然后说 this.t = b.t;

希望这会有所帮助。

【讨论】:

  • 我用 Java 编写了这个 Chess 程序,在其中,我在主应用程序视图和 AIEngine 类中创建了一个棋盘对象。你可以为你的树对象做类似的事情。这是我的代码:kanersan.com/myfiles/ChessSource.zip
  • 你也可以看到我是如何处理应用程序中的一些视图/框架的。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2014-07-30
  • 2015-02-15
  • 1970-01-01
  • 2012-01-01
  • 2017-04-28
相关资源
最近更新 更多