2015-04-21 2 views
2

Я использую java awt для рендеринга простого прямоугольника. У меня также есть прямоугольник, который будет использоваться в качестве фона окна. Дело в том, что, хотя прямоугольник фона установлен на ширину и высоту окна, он все равно не подходит для всего. Я попытался это сделать Google, но нашел результаты, не имеющие отношения к моим потребностям. Что вызывает это?Как заполнить все окно в awt

import java.awt.Canvas; 
import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.event.MouseAdapter; 
import java.awt.image.BufferStrategy; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Game implements Runnable{ 

    final int WIDTH = 640; 
    final int HEIGHT = 480; 

    JFrame frame; 
    Canvas canvas; 
    BufferStrategy bufferStrategy; 

    boolean running = false; 

    public Game(){ 
     frame = new JFrame("Prototyping"); 

     JPanel panel = (JPanel) frame.getContentPane(); 
     panel.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     panel.setLayout(null); 


     canvas = new Canvas(); 
     canvas.setBounds(0, 0, WIDTH, HEIGHT); 
     canvas.setIgnoreRepaint(true); 

     panel.add(canvas); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     canvas.createBufferStrategy(2); 
     bufferStrategy = canvas.getBufferStrategy(); 

     canvas.requestFocus(); 
    } 



    public void run(){ 

     running = true; 
     while(running)   
     render(); 
    } 

    private void render() { 
     Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics(); 
     g.clearRect(0, 0, WIDTH, HEIGHT); 
     render(g); 
     g.dispose(); 
     bufferStrategy.show(); 
    } 

    protected void update(){ 

    } 

    protected void render(Graphics2D g){ 
     g.setColor(Color.GRAY); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 

     g.setColor(Color.BLUE); 
     g.fillRect(100, 0, 200, 200); 
    } 

    public static void main(String [] args){ 
     Game game = new Game(); 
     new Thread(game).start(); 
    } 

} 
+2

* ".. хотя фоновый прямоугольник установлен на ширину и высоту окна, он все равно не подходит для всего." * Подождите .. что? Серый прямоугольник заполняет пользовательский интерфейс (здесь). Синий прямоугольник намеренно рисуется меньше, чем пользовательский интерфейс. В стороне: графические интерфейсы Java должны работать на разных ОС, размер экрана, разрешение экрана и т. Д. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

+0

@AndrewThompson Цените ссылки. Хотя проблема, которую я вижу, это белое пространство сбоку: http://i.imgur.com/fcn7Ggx.gif. Я предполагаю, что это связано с нулевым макетом? –

+0

О, мой плохой. Думаю, я мог бы добавить макет, прежде чем смотреть на результат. Измените 'panel.setLayout (null);' на 'panel.setLayout (новый GridLayout());' и посмотрите, хорошо ли это. –

ответ

2

Это безупречно работает здесь. Внимательно изучайте различия, потому что я забыл, что изменилось.

import java.awt.*; 
import java.awt.image.BufferStrategy; 
import javax.swing.*; 

public class Game implements Runnable{ 

    final int WIDTH = 640; 
    final int HEIGHT = 480; 

    JFrame frame; 
    Canvas canvas; 
    BufferStrategy bufferStrategy; 

    boolean running = false; 

    public Game(){ 
     frame = new JFrame("Prototyping"); 

     JPanel panel = (JPanel) frame.getContentPane(); 
     panel.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     panel.setLayout(new GridLayout()); 


     canvas = new Canvas(); 
     //canvas.setBounds(0, 0, WIDTH, HEIGHT); 
     canvas.setIgnoreRepaint(true); 

     panel.add(canvas); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     canvas.createBufferStrategy(2); 
     bufferStrategy = canvas.getBufferStrategy(); 

     canvas.requestFocus(); 
    } 

    public void run(){ 
     running = true; 
     while(running)   
     render(); 
    } 

    private void render() { 
     Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics(); 
     g.clearRect(0, 0, WIDTH, HEIGHT); 
     render(g); 
     g.dispose(); 
     bufferStrategy.show(); 
    } 

    protected void render(Graphics2D g){ 
     g.setColor(Color.GRAY); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 

     g.setColor(Color.BLUE); 
     g.fillRect(100, 0, 200, 200); 
    } 

    public static void main(String [] args){ 
     Game game = new Game(); 
     new Thread(game).start(); 
    } 
} 
Смежные вопросы