2014-10-09 55 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已經存在,不僅可以爲自己造成混亂,但對於其他開發商;)