2014-10-09 2 views
-1

У меня есть простой gui, и когда я запускаю, это прекрасно, но иногда он не отображается правильно. У меня есть круг в JPanel. Когда он работает правильно, он отображается посередине для JFrame, как я и предполагал, но когда он не работает правильно, круг становится ближе к нижней части экрана. Как я могу исправить это, чтобы он отображался правильно каждый раз? Является ли мой код неправильным (надеюсь, нет! :)), или это некоторая ошибка в java. Итак, вот мой код:Java не отображается gui right

Обновление: Кажется, что высота окна меняется.

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

+0

Можете ли вы добавить несколько скриншотов? Тем не менее это странно, что он не ведет себя детерминистически. Обычно это означает проблему с потоками, т. Е. Иногда она заканчивает рисование холста, прежде чем он начнет рисовать круг, а иногда это не так. Или вы можете делать что-то другое, когда круг находится в неправильном месте. Последнее может быть более вероятным, так как я уверен, что Swing является однопоточным. – JaneGoodall

+0

У меня нет достаточного количества изображений для отправки изображений, :(. – user3131261

ответ

0
  1. Убедитесь, что вы создали пользовательский интерфейс в контексте Диспетчерского потока событий, см. Initial Threads для получения более подробной информации.
  2. Убедитесь, что вы вызываете super.paintComponent в методе paintComponent, прежде чем делать какие-либо пользовательские картины, см Painting in AWT and Swing для более подробной информации
  3. Не полагаться на магических чисел, размер окна является размер его содержание + его рама украшения. Вы должны получить с помощью getWidth и getHeight определить размер 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 уже существует и может привести к путанице не только для себя, но и для других разработчиков;)

Смежные вопросы