2013-10-24 1 views
2

Я действительно смущен, я попытался установить овал точно в красную JPanel, а овал пошел на 5 пикселей слишком низко. Я попытался изменить y1 на -5, так что это было бы точно в JPanel, овал переместился в нужное место, но пять верхних рядов овала были стерты, почему это произошло? и как разместить овал в середине JPanel?пять верхних рядов овала стираются. Зачем?

package il.co.atlantis; 

import javax.swing.*; 

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


public class PanelExample_Extended{ 

public static final int WID = 20, HEI = 20; 
public static int x1 = 0, y1 = -5; 

public class MyGraphics extends JComponent { 

    private static final long serialVersionUID = 7526472295622776147L; 

    MyGraphics() { 
     setPreferredSize(new Dimension(20,20)); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponents(g); 
     g.setColor(Color.blue); 
     g.fillOval(x1, y1, WID, HEI); 
    } 

} 

public JPanel createContentPane(){ 

    JPanel totalGUI = new JPanel(); 
    totalGUI.setLayout(null); 

    JPanel redPanel = new JPanel(); 
    redPanel.setBackground(Color.red); 
    redPanel.setLocation(10, 10); 
    redPanel.setSize(20,20); 
    MyGraphics tr = new MyGraphics(); 
    tr.setLocation(0, 0); 
    redPanel.add(tr); 
    totalGUI.add(redPanel); 

    JPanel bluePanel = new JPanel(); 
    bluePanel.setBackground(Color.blue); 
    bluePanel.setLocation(220, 10); 
    bluePanel.setSize(50, 50); 
    totalGUI.add(bluePanel); 

    totalGUI.setOpaque(true); 
    return totalGUI; 
} 

private static void createAndShowGUI() { 

    JFrame.setDefaultLookAndFeelDecorated(true); 
    JFrame frame = new JFrame("[=] ??? [=]"); 


    PanelExample_Extended demo = new PanelExample_Extended(); 
    frame.setContentPane(demo.createContentPane()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(290, 100); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 
+0

Использовать правильные имена переменных «WID» и «HEI» не означает многого. Если вы хотите, чтобы люди читали ваш код, используйте понятные имена. Также не используйте статические переменные для X, Y. Вы никогда не сможете изменить положение других компонентов, которые вы могли бы использовать. Все эти свойства принадлежат классу, который рисует компонент. – camickr

ответ

3

Если начать рисовать на -5, вы откачивания из JComponent, так что имеет смысл, что та часть изображения не будет отображаться. Я думаю, что ваша проблема связана с попыткой использовать абсолютное позиционирование (что следует избегать) на JPanel, который по умолчанию использует FlowLayout.

Если вы лучше описываете, что вы пытаетесь сделать, и, возможно, даете нам изображения того, что вы хотите, мы сможем помочь лучше.

Попробуйте дать свой красный JPanel BorderLayout и посмотреть, что произойдет.

JPanel redPanel = new JPanel(new BorderLayout()); 

Но самое главное, пожалуйста, прочитайте и поймите менеджеров макетов.

+0

Когда я устанавливаю x1 и y1 sas 0, почему он не начинается в верхнем левом углу? Я хочу rec – Atlantis

+0

@ עמוסרום: он не начинается в верхнем левом углу, вероятно, из-за неправильного использования макетов. –

+0

Я хочу, чтобы прямоугольник оправлял овал так, чтобы при перемещении JPanel овал переместился, и я могу добавить некоторые из них, чтобы сделать ряд овалов. – Atlantis