2017-02-23 10 views
-1

Я работал над этой лабораторией в классе, и когда я попытался изменить цвет фона, он остался бы по умолчанию белым, кто-то может объяснить, где я, программирование, ошибался.Почему не меняют цвет фона?

import javax.swing.*; 
import java.awt.*; 
public class DemoPoly extends JFrame { 

// constructor 
public DemoPoly() { 
    // defines Frame characteristics 

    int size = 300; 
    setSize(size,size); 
    setTitle("a random window"); 

    getContentPane().setBackground(Color.red); 

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setVisible(true); 
} 

public static void main (String[] args){ 
    // instantiates a JFrame 
    // exits on close (opional) 
    JFrame object = new DemoPoly(); 
} 

public void paint (Graphics g){ 
    // This provides the Graphics object g, where 
    // you are going to use you graphics primitive 
    // to paint on the content pane of the frame. 
    int[] arr = {0,100,100,0}; 
    int[] yarr = {0,0,100,100}; 
    Square object = new Square(arr,yarr,Color.red); 
    AbstractPolygon randSquare = new Square(arr, yarr, Color.red); 
} 
+1

Объяснение Java графические или экранные объекты слишком широки для этого сайта. – ProgrammersBlock

ответ

0

Я не понимаю ваш вопрос. Но вот код для изменения вашего фона на КРАСНЫЙ;

public class DemoPoly extends JFrame { 

    public DemoPoly() { 
     // defines Frame characteristics 

     int size = 300; 
     setSize(size, size); 
     setTitle("a random window"); 

     //change background here 
     getContentPane().setBackground(Color.red); 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     // instantiates a JFrame 
     // exits on close (opional) 
     JFrame object = new DemoPoly(); 
    } 
} 

Ваш код в порядке. Возможно, используйте метод @override в вашем методе рисования.

1

Я вижу несколько проблем в коде:

  1. Расширение JFrame, как говорят ваш класс являетсяJFrame, JFrame является жестким контейнером, вместо того, чтобы составить ваш графический интерфейс на JPanel с. См. Java Swing extends JFrame vs calling it inside of class для получения дополнительной информации.

  2. Вы нарушаете цепочку красок, удаляя super.paint(g) вызов по методу paint(...). При изменении графического интерфейса для расширения JPanel вместо JFrame вместо этого вы должны использовать метод paintComponent(...). Возьмите Lesson: Performing Custom Painting in Swing.

  3. Вы забыли добавить @Override обозначение по методу paint(...).

  4. Вы не размещаете свою программу на Event Dispatch Thread (EDT), которая может вызвать проблемы с потоками.

    Вы можете решить эту проблему, изменив метод main() так:

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          //Your constructor here 
         } 
        }); 
    } 
    
  5. Вместо установки JFrame размера, переопределить метод getPreferredSize() и вызвать pack(). См. Should I setPreferred|Maximum|MiniumSize in Java Swing?. Общий консенсус говорит «да».


Ваша проблема становится решена путем добавления

super.paint(g); 

на paint(...) метода:

@Override 
public void paint(Graphics g) { 
    super.paint(g); //Never remove this 
    //Your code goes here 
} 

При всех вышеуказанных рекомендаций, принятых во внимание, что ваш код должен теперь выглядит так:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class DemoPoly { 

    private JFrame frame; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DemoPoly().createAndShowGui(); 
      } 
     }); 
    } 

    public void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     CustomPanel cp = new CustomPanel(); 
     cp.setBackground(Color.RED); 
     frame.add(cp); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 

class CustomPanel extends JPanel { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
    } 

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

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

enter image description here

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