2014-10-09 53 views
-1

我有一个简单的gui,当我运行它是完美的,但偶尔它不显示正确。我在JPanel中有一个圆圈。当它正确运行时,它会像我打算的那样显示在JFrame的中间,但是当它不能正常工作时,该圆圈将出现在靠近屏幕底部的位置。我该如何解决这个问题,让它每次都显示正确?是我的代码不正确(我希望不是!:)),还是它在java中的一些错误。所以这里是我的代码:Java是不是显示gui的权利

更新:看来,窗口高度正在改变。

Run.java ------------------------------------------- -------------------------------------

import javax.swing.JFrame; 

public class Run { 
    public static void main(String args[]) { 
     Window w = new Window(); 
     w.setSize(800, 500); 
     w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     w.setVisible(true); 
    } 
} 

Window.java --- -------------------------------------------------- -----------------------

import javax.swing.JFrame; 

public class Window extends JFrame { 
    public Window() { 
     super("Wheel"); 
     Gui g = new Gui(); 
     add(g); 
    } 
} 

Gui.java ----------------- -------------------------------------------------- -------------

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JPanel; 

public class Gui extends JPanel { 
    private Color wheelColor = new Color(0, 0, 255); 

    public Gui() { 
     setOpaque(true); 
     setBackground(new Color(255, 0, 0)); 
    } 

    public void paintComponent(Graphics g) { 
     g.setColor(wheelColor); 
     g.fillOval(40, 40, 420, 420); 
    } 
} 

另外我使用Ubuntu,我不知道这是否会影响它。提前致谢。

+0

尝试使用LAYO ut管理器(特别是您的Window类),这将有助于您的组件以更可预测的方式显示。 – MarsAtomic 2014-10-09 01:17:12

+0

你可以添加一些截图吗?尽管如此,它并不确定。通常这意味着线程问题,即有时它在开始绘制圆圈之前完成绘制画布,而其他时间则不完成。或者,如果圈子在错误的地方,你可能会做出不同的事情。后者可能更有可能,因为我确信Swing是单线程的。 – JaneGoodall 2014-10-09 01:18:03

+0

我没有足够的代表发布图像,:(。 – user3131261 2014-10-09 01:24:39

回答

0
  1. 确保您在事件派发线程的上下文中创建UI,有关更多详细信息,请参阅Initial Threads
  2. 确保您的paintComponent方法中调用super.paintComponent你做任何自定义涂装前,看到Painting in AWT and Swing更多细节
  3. 不要依靠神奇数字,窗口的大小是它的大小是内容+其框架装饰品。你应该使用getWidthgetHeight确定Gui面板和压倒一切的getPreferredSize的大小,使窗口,以确定需要多少空间来(最佳)显示它

例如...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Run { 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       Window w = new Window(); 
       w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       w.pack(); 
       w.setLocationRelativeTo(null); 
       w.setVisible(true); 
      } 
     }); 
    } 

    public static class Window extends JFrame { 

     public Window() { 
      super("Wheel"); 
      Gui g = new Gui(); 
      add(g); 
     } 
    } 

    public static class Gui extends JPanel { 

     private Color wheelColor = new Color(0, 0, 255); 

     public Gui() { 
      setOpaque(true); 
      setBackground(new Color(255, 0, 0)); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(440, 440); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(wheelColor); 
      int width = getWidth(); 
      int height = getHeight(); 
      int x = (width - 420)/2; 
      int y = (height - 420)/2; 
      g.fillOval(x, y, 420, 420); 
     } 
    } 
} 

另外注意的是已经存在默认的API中的类后命名你的类,java.awt.Window已经存在,不仅可以为自己造成混乱,但对于其他开发商;)