2013-10-01 1 views
0

У меня есть следующий код:Java Swing: Базовое понимание JComponent/JPanel

public class OpaqueExample { 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      OpaqueFrame frame = new OpaqueFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    }); 
} 

} 

class OpaqueFrame extends JFrame { 

private static final long serialVersionUID = 5486007826709615846L; 

public OpaqueFrame() { 
    super("Opacity Demo"); 
    this.setSize(200, 200); 
    JComponent boxPanel = new BoxComponent(50, 50); 
    this.add(boxPanel); 
} 

} 

class BoxComponent extends JComponent { 

private static final long serialVersionUID = -1935449999922455838L; 

public BoxComponent(int x, int y) { 
    super(); 
    this.setSize(x, y); 
    this.setLocation(40, 40); 
} 

public void paintComponent(Graphics g) { 
    g.setColor(Color.red); 
} 

} 

В простоте:
а. Создана рама размером 200, 200
b. Создан бокс-компонент размером 50,50
c. Установите расположение компонента 40, 40 коробки в верхнем левом углу кадра. Box componentet - красный цвет

Когда я запустил его, я ожидаю увидеть меньший красный ящик в контейнере фреймов. Получил ли я это право, или я просто не понимаю основную составляющую качания (похоже, это так).

Пожалуйста, помогите. Thank.

+0

Вы могли бы хотеть прочитать это: HTTP: // Docs.oracle.com/javase/tutorial/uiswing/layout/index.html –

ответ

1
frame.setLayout(null); 

или

setLayout(null); в конструкторе кадра

Это позволяет определить положение компонентов непосредственно

public void paintComponent(Graphics g) { 
    g.setColor(Color.red); 
} 

Это должно быть изменено на

public void paintComponent(Graphics g) { 
    g.setColor(Color.red); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
} 

Информация о графическом классе: http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html

+0

Не работает. Все такой же. Нет красной коробки – yapkm01

+0

Что на самом деле происходит? (вы отправили ожидаемый результат, но не фактический) – Cruncher

+0

я добавил setlayout (null) в конструкторе фрейма. Однако красная рамка не окрашена в рамку. – yapkm01

2

Недостаточно контекста для предоставления полного ответа.

Это просто другое возможное решение вашей проблемы ....

Если ваше намерение, чтобы попытаться поместить компонент в определенном положении, то почему бы не просто установить цвет фона, вместо того, чтобы пытаться заполнить его используя обычную картину?

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

свинг предназначен для использования менеджера компоновки API, это в основе того, как рамочные работы.

В общем, я буду первым, кто признает, что когда-то был полезен макет null, я бы попробовал много вещей первым (лично).

Следующий пример использует один компонент, но позволяет рисовать несколько ящиков на в различных положениях и размеров ...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class GraphicsExample { 

    public static void main(String[] args) { 
     new GraphicsExample(); 
    } 

    public GraphicsExample() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       TestPane tp = new TestPane(); 
       tp.add(50, 50, 40, 40); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(tp); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private List<Rectangle> boxes; 

     public TestPane() { 
      boxes = new ArrayList<Rectangle>(25); 
     } 

     public void add(int x, int y, int width, int height) { 
      boxes.add(new Rectangle(x, y, width, height)); 
      repaint(); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      for (Rectangle box : boxes) { 
       g2d.fill(box); 
      } 
      g2d.dispose(); 
     }   
    }  
} 

Одна из других вещей, которые вы делаете неправильно это не соблюдая цепочки окраски. Когда вы переопределите один из методов paint, вы должны позвонить super.paintXxx, чтобы убедиться, что цепочка лакокрасочного покрытия не сломана. Эти методы делают много важной работы и очень неумолимый, если вы забудете включить их;)

Заканчивать Performing Custom Painting для более подробной информации

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

  • Нет связанных вопросов^_^