2016-02-16 5 views
0

всего лишь короткий вопрос: возможно ли добавить цвет фона в JComponent, когда он добавляется непосредственно в JFrame с использованием нулевого макета? Размер и положение компонента устанавливаются setBounds(), и я знаю, что цвет фона не будет отображаться с использованием этой настройки. (Я знаю, что вы всегда должны использовать менеджеров компоновки, но в этом случае я хочу предотвратить это).Цвет фона JComponent с использованием нулевого макета?

+0

[Почему он недоволен использованием пустого макета в SWING?] (Http://stackoverflow.com/questions/6592468/why-is-it-frowned-upon-to-use-a-null-layout -in-swing) – MadProgrammer

+0

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

ответ

1

JComponent прозрачен по умолчанию, вам необходимо либо изменить его opaque состояние и не используйте JPanel

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       TestPane pane = new TestPane(); 
       pane.setBounds(10, 10, 100, 100); 

       JFrame frame = new JFrame("Testing"); 
       frame.setLayout(null); // This is bad, but it proofs my point 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(pane); 
       frame.setSize(200, 200); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JComponent { 

     public TestPane() { 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        setOpaque(!isOpaque()); 
        repaint(); 
       } 
      }); 
      setBackground(Color.BLUE); 
      setBorder(new LineBorder(Color.RED)); 
     } 

    } 

} 

null макеты плохие новости, я не оправдываю их, и вы должны избегать их использования, в приведенном выше примере просто доказывает точку, что это JComponent s opaque состояние, которое должно быть изменено

Why is it frowned upon to use a null layout in SWING? хороший читать о том, почему вы должны избегать использования null макетов.

Если вы хотите больше контроля, напишите сами.

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