2013-12-23 2 views
-1

В качели, когда я включаю метод paint(), он просто показывает белый экран на фоне. Первое изображение - это результат с paint(), а второй - без paint().Рама становится белой, когда я использую метод paint()

With paint method

without paint method

код:

import javax.swing.*; 
import java.io.*; 
import java.awt.*; 
import java.util.*; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.BorderLayout; 
import java.awt.event.*; 

public class Board2 extends JFrame 
{ 
    static JPanel p1 
    static JButton b1 
    public Board2(){ 
     setSize(1000, 800); 
     setResizable(false); 
     b1 = new JButton("Button"); 
     p1.add(b1); 
     add(p1, BorderLayout.CENTER); 
     setVisible(true); 
    } 


    public void paint(Graphics g) 
    { 
     g.setColor(Color.BLUE); 
     g.fillRect(50,50,20,20); 
    } 

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

    } 
} 

В моей другой программе кнопки были невидимыми, пока я не мыши над ними. Как это можно решить?

+0

Итак, что в методе краски? Покажите нам, чтобы мы могли сказать вам, что вы сделали неправильно. –

+1

Возможно, это может быть полезно: http://www.oracle.com/technetwork/java/painting-140037.html – Jack

+0

@DavidWallace Извините, что я вставил неправильный код. – TheEyesHaveIt

ответ

3

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

Некоторые другие образованные догадок ...

  • вы перекрывая paint (возможно, из верхнего контейнера уровня, как JFrame), когда вы должны быть переопределяя paintComponent что-то вроде JComponent или JPanel (и вызывающей super.paintComponent)

Посмотрите на Performing Custom Painting и Painting in AWT and Swing для получения более подробной информации

обновляется на основе обновленного кода

У вас есть две основные проблемы ...

public class Board2 extends JFrame 
{ 

    //... 

    public void paint(Graphics g) 
    { 
     g.setColor(Color.BLUE); 
     g.fillRect(50,50,20,20); 
    } 

Вы переопределяем paint контейнера верхнего уровня, и вы нарушаете цепочку красок.

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

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

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

Вместо этого создайте себе пользовательский компонент, переопределить это paintComponent и сделать ваш заказ картина там

Например ...

public class Board2 extends JFrame 
{ 
    static JPanel p1 
    static JButton b1 
    public Board2(){ 
     setSize(1000, 800); 
     setResizable(false); 
     b1 = new JButton("Button"); 
     p1 = new JPanel() { 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.BLUE); 
       g.fillRect(50,50,20,20); 
      } 
     } 
     p1.add(b1); 
     add(p1, BorderLayout.CENTER); 
     setVisible(true); 
    } 

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

Это было бы моим лучшим предположением; надеюсь, OP скоро покажет нам его/ее исходный код. –

+0

Что делать, если я хочу вызвать метод paintComponent из другого метода или класса? – TheEyesHaveIt

+0

Вы не должны называть paintComponent напрямую, вместо этого переименовывать – MadProgrammer

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