2016-12-25 12 views
1

Я пытаюсь создать небольшую игру защиты башни с цветами, но цвета не работают, вот как я рисую прямоугольники, делающие графику.graphics.setColor (цвет); не работает

public static void fill(GridLocation loc, Color c){ 
    Main.frame.getGraphics().setColor(c); 
    Main.frame.getGraphics().fillRect(loc.toFrameLocation().x, loc.toFrameLocation().y, 20, 20); 
    Main.frame.getGraphics().dispose(); 
} 

и и это, как я называю/создать JFrame

public static void main(String[] args) { 
    frame = new JFrame("Tower defense"); 
    frame.setSize(1000, 700); 
    frame.setVisible(true); 
    frame.setLayout(null); 
    frame.setLocationRelativeTo(null); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    while (frame.isVisible()){ 
     Grid.fill(new GridLocation(1,1), new Color(1F,0F,0F)); 
     Grid.fill(new GridLocation(2,1), Color.gray); 
     Grid.drawGrid(); 
     Grid.fill(new GridLocation(3,1), Color.green); 
    } 
} 

Моей проблему: прямоугольники всегда черные?

+1

Это не путь для достижения этой цели. Прочтите [учебник] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). – user1803551

+2

1. Нарисуйте в методе paintComponent JPanel. 2. Используйте таймер Swing, а не цикл while (true). 3. В течение этого таймера измените состояние чертежа JPanel (измените его поля), а затем вызовите repaint(). 4. Затем используйте метод paintComponent, чтобы указать, как рисовать. 5. Не забудьте вызвать метод окраски супер в вашем переопределении. –

+0

@DontKnowMuchButGettingBetter, user1803551 Спасибо, что работает сейчас! – Rof

ответ

3

Обратите внимание, что если вы используете getGraphics() на компоненте, чтобы получить контекст вашей графики, полученная таким образом графика не будет сохраняться. Например, в приведенном ниже коде вы увидите, что при нажатии кнопки появляется синий прямоугольник, но затем он исчезает, если графический интерфейс минимизируется и впоследствии изменяется.

Кроме того, в соответствии с моими комментариями:

  1. Дро в методе paintComponent в виде JPanel.
  2. Используйте таймер качания не время (правда).
  3. В этом таймере измените состояние чертежа JPanel (измените его поля), а затем вызовите repaint().
  4. Затем используйте метод paintComponent, чтобы указать, как рисовать.
  5. Не забудьте вызвать метод окраски супер в вашем переопределении.

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class UnstableStableGraphics extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 400; 
    private static final int GAP = 20; 

    public UnstableStableGraphics() { 
     add(new JButton(new DrawBlueRectAction())); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     int w = PREF_W/2 - 2 * GAP; 
     int h = PREF_H - 2 * GAP; 
     g.fillRect(GAP, GAP, w, h);  
    } 

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

    private class DrawBlueRectAction extends AbstractAction { 
     public DrawBlueRectAction() { 
      super("Draw Unstable Blue Rectangle"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      Graphics g = getGraphics(); 
      g.setColor(Color.BLUE); 
      int x = PREF_W/2 + GAP; 
      int w = PREF_W/2 - 2 * GAP; 
      int h = PREF_H - 2 * GAP; 
      g.fillRect(x, GAP, w, h); 
      g.dispose(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     UnstableStableGraphics mainPanel = new UnstableStableGraphics(); 
     JFrame frame = new JFrame("UnstableStableGraphics"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

Сказав, что это прекрасно, чтобы использовать объект Graphics, полученный с помощью getGraphics() под названием на BufferedImage (до тех пор, как вы располагаете графического объекта, когда сделано, сохраняйте ресурсы по завершении), а затем отобразите это изображение в методе paintComponent, часто в качестве фонового изображения. Обычно, однако, я вызываю createGraphics() в BufferedImage, так как возвращает более мощный объект Graphics2D, а не объект Graphics.

К примеру, в том числе использование фонового изображения, Спрайт изображения и свинг Таймер:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class BackgroundExample extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final int SPRITE_W = 20; 
    private static final Color SPRITE_COLOR = Color.RED; 
    private static final int TIMER_DELAY = 20; 
    private Image background = null; 
    private Image sprite = null; 
    private int spriteX = 0; 
    private int spriteY = 0; 

    public BackgroundExample() { 
     background = createBackground(); 
     sprite = createSprite(); 

     new Timer(TIMER_DELAY, new TimerListener()).start(); 
    } 

    private Image createSprite() { 
     BufferedImage img = new BufferedImage(SPRITE_W, SPRITE_W, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setColor(SPRITE_COLOR); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     int x = 1; 
     int y = 1; 
     int width = SPRITE_W -2; 
     int height = SPRITE_W - 2; 
     g2.fillOval(x, y, width, height); 
     g2.dispose(); 
     return img; 
    } 

    private Image createBackground() { 
     BufferedImage img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setColor(Color.GREEN); 
     g2.fillRect(0, 0, PREF_W, PREF_H); 
     g2.setColor(Color.GRAY); 
     int x = 0; 
     int y = 0; 
     g2.fillRect(x, y, 2 * SPRITE_W, 2 * SPRITE_W); 
     x = PREF_W - 2 * SPRITE_W; 
     g2.fillRect(x, y, 2 * SPRITE_W, 2 * SPRITE_W); 
     y = PREF_H - 2 * SPRITE_W; 
     g2.fillRect(x, y, 2 * SPRITE_W, 2 * SPRITE_W); 
     x = 0; 
     g2.fillRect(x, y, 2 * SPRITE_W, 2 * SPRITE_W); 
     g2.dispose(); 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (background != null) { 
      g.drawImage(background, 0, 0, this); 
     } 
     if (sprite != null) { 
      g.drawImage(sprite, spriteX, spriteY, this); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } else { 
      return new Dimension(PREF_W, PREF_H); 
     } 
    } 

    private class TimerListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      spriteX++; 
      spriteY++; 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     BackgroundExample mainPanel = new BackgroundExample(); 
     JFrame frame = new JFrame("BackgroundExample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Я поддержал, потому что вы принимаете много энергии в этот ответ. –

+0

@PeterRader: thanks –

+0

Пожалуйста, [примите ответ] (http://meta.stackexchange.com/a/5235/155831), чтобы показать другим, что это помогло решить проблему. О, я вижу из вашего профиля, что вы обычно ** принимаете ответы на свои вопросы. Хорошая работа, :) –