2016-07-01 3 views
1

Итак, я пытаюсь сделать эту простую краскоподобную программу, и до сих пор она была довольно успешной, но у меня есть эта проблема. Когда я запускаю приложение, фон прозрачен, и он отображает экран, за исключением того, что все работает нормально. Кроме того, если я использую super.paint(); , экран начинает мигать, мерцает, и это не хорошо. В настоящее время я использую eclipse, следуя учебнику, и, похоже, у парня все работает нормально. Я также являюсь абсолютным новичком, поэтому несите меня и объясняйте все, пожалуйста, потому что я изучаю Java уже 3 дня.Есть прозрачный фон?

package JavaMain; 

import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 

public class javamain extends JFrame { 

    int x, y; 

    private static final long serialVersionUID = 1L; 

    private class AL extends KeyAdapter { 

    private int keycode; 

    @SuppressWarnings("static-access") 
    public void keyPressed(KeyEvent event) { 

     keycode = event.getKeyCode(); 

     if (keycode == event.VK_LEFT) { 
     x--; 
     } 

     if (keycode == event.VK_RIGHT) { 
     x++; 
     } 
     if (keycode == event.VK_UP) { 
     y--; 
     } 
     if (keycode == event.VK_DOWN) { 
     y++; 
     } 
    } 

    public void keyReleased(KeyEvent e) {} 
    } 

    public javamain() { 
    addKeyListener(new AL()); 
    setTitle("Statistic"); 
    setSize(600, 800); 
    setResizable(false); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    x = 200; 
    y = 200; 
    } 

    public void paint(Graphics g) { 

    g.fillRect(x, y, 2, 2); 

    repaint(); 
    } 

    public static void main(String[] args) { 

    new javamain(); 
    } 
} 

ответ

0

Первая ...

Вы нарушаете краски цепь ...

public void paint (Graphics g) 

{ 

// You MUST call super.paint here... 

g.drawString("Hello World!", 250, 250); 

} 

Второй

Вы должны избегать, любой ценой, перекрывая краска контейнера верхнего уровня, такого как JFrame. Множество причин, один из которых вы только что нашли, но также и потому, что контейнеры верхнего уровня не имеют двойной буферизации, что приведет к мерцанию при окрашивании, а JFrame содержит кучу других компонентов, JRootPane, панель содержимого, стеклянную панель. .. все из которых могли бы нарисовать то, что вы пытаетесь рисовать.

Кроме того, картина непосредственно к раме позволяет рисовать под декорациями врезки, которая не является на самом деле то, что вы хотите сделать ...

Например (почему это плохо) ...

Как получить ТОЧНУЮ середину экрана, даже если размер изменяется Как я могу установить посредине? Java AWT шнурок() не отображается в окне Раствора, ...

Создать собственный класс, простирающийся от чего-то, как JPanel и переопределить это paintComponent метод и выполнить пользовательскую картину там. Вы получаете бесплатную поддержку двойной буферизации и больше не должны беспокоиться о границах фрейма, так как панель содержимого гарантирует, что она поддерживается внутри фреймов.

См Картина в AWT и Колебание и исполнительского Выборочная живописи для более подробной информации

Кроме того, вызов setResizable перед установкой размер кадра, это изменяет размер декораций кадров и может привести к непредвиденному дополнительное расстояние в рамках область содержимого ...

третьего ....

Тогда, наконец, я поделюсь кодом, который действительно помогает вам получить некоторые лучшие идеи о том, что вы просите

public class Main extends JPanel implements KeyListener 

    { 

    private Point startPoint = new Point(0, 0); 

    private Point endPoint = new Point(0, 0); 

    public Main() 

    { 
    addKeyListener(this); 

    } 

    public void keyPressed(KeyEvent evt) 

    { 

    int keyCode = evt.getKeyCode(); 
    int d; 

    if (evt.isShiftDown()) 
     d = 5; 
    else 
     d = 1; 

    if (keyCode == KeyEvent.VK_LEFT) 
     add(-d, 0); 
    else if (keyCode == KeyEvent.VK_RIGHT) 
     add(d, 0); 
    else if (keyCode == KeyEvent.VK_UP) 
     add(0, -d); 
    else if (keyCode == KeyEvent.VK_DOWN) 
     add(0, d); 
    } 

    public void keyReleased(KeyEvent evt) 
    { 
    } 

    public void keyTyped(KeyEvent evt) 
    { 

    } 

    public boolean isFocusTraversable() 

    { 

    return true; 

    } 

    public void add(int dx, int dy) 

    { 

    endPoint.x += dx; 
    endPoint.y += dy; 
    Graphics g = getGraphics(); 
    g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); 
    g.dispose(); 
    startPoint.x = endPoint.x; 
    startPoint.y = endPoint.y; 

    } 



public static void main(String[] args) 

    { 

    JFrame frame = new JFrame(); 
    frame.setTitle("Sketch"); 
    frame.setSize(300, 200); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Container contentPane = frame.getContentPane(); 
    contentPane.add(new Main()); 

    frame.setVisible(true); 

    } 

} 
+0

Уже исправлено, благодарю вас за ответ в любом случае! –

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