2017-04-03 63 views
0

我正在学习如何用Java创建应用程序。Java JLabel背景色不起作用?

我很难让JLabel具有背景色,而JPanel是白色的,在背后。另外,有没有办法将JPanel的大小调整为JFrame的一半?

任何帮助将非常感激。谢谢。


package PracticeOne; 

    import java.awt.BorderLayout; 

    public class PracticeOne { 

     public static void main(String[] args) { 


      Frame container = new Frame(); 
      Panel box = new Panel(); 
      Label txt = new Label(); 

      box.add(txt); 

      container.add(box, BorderLayout.CENTER); 


     } 

    } 

package PracticeOne; 

import javax.swing.JFrame; 

public class Frame extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    Frame(){   
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     this.setSize(500, 500); 

     this.setVisible(true); 

     this.setLocationRelativeTo(null); 

     this.setTitle("Testing this out"); 
    } 

} 

package PracticeOne; 

import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JPanel; 

public class Panel extends JPanel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 


    public Dimension d = new Dimension(100,100); 

    Panel(){ 
     this.setSize(d); 
     this.setAlignmentX(CENTER_ALIGNMENT); 
     this.setBackground(Color.WHITE); 

    } 



} 

package PracticeOne; 

import java.awt.Color; 

import javax.swing.JLabel; 

public class Label extends JLabel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 



    Label(){ 
     this.setSize(50, 50); 


     this.setText("ya boy is working here"); 
     this.setForeground(Color.BLACK); 
     this.setBackground(Color.ORANGE); 

    } 
} 
+0

多大的JPanel,则您所使用 什么布局管理器两件事情 1)确定2)你传递给panel.setPreferredSize的是什么。在某些情况下,根据现有布局,首选尺寸不会产生任何影响。 布局管理器在播放时使用setSize什么都不做。 在你的情况下,因为你使用的是BorderLayout,并且只把一些东西放在CENTER中,JPanel会增长到窗口的全部大小。如果您希望框架是面板首选大小的大小,您可能需要考虑使用JFrame.pack而不是setSize。 – MeBigFatGuy

回答

2

我遇到了麻烦JLabel以具有背景色,而JPanel中白色

你需要调用setOpaque(true);JLabel

此外,有没有办法调整的JPanel到的JFrame的是什么的一半?

你可以使用一个GridLayout,并放置2 JPanel,它出现,这样一来,你将不得不使用JFrame各一半大小的2 JPanel秒。

此外,重命名你的类,Panel属于AWT中的一类,同为FrameLabel的名字,这可能混淆你(和谁读你的代码)。

永不延伸JFrame,而是建立基于JPanel s的GUI。见extends JFrame vs creating it inside of classThe use of multiple JFrames, Good/Bad practice?普遍的共识说这是不好的。

此外,您还应该检查Should I avoid the use of setPreferred|Maximum|MinimumSize() in Swing?同样,是的,您应该改写getPreferredSize()方法。

不要忘记更改main()方法可以将你的程序在Event Dispatch Thread (EDT)如下:

public static void main(String[] args) { 
    //Java 8 with lambda expressions 
    SwingUtilities.invokeLater(() -> 
     //Your code here 
    ); 
    //Java 7 and below (Or 8 without lambda expressions) 
    SwingUtilities.invokeLater(new Runnable() { 
     //Your code here 
    }); 
} 

如今,随着上述各项建议,你的代码现在看起来应该是这样:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class HalfSizePanelWithLabelInDifferentColor { 

    private JFrame frame; 
    private Container contentPane; 
    private JPanel pane; 
    private JPanel pane2; 
    private JLabel label; 

    private static final Dimension dim = new Dimension(100, 100); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new HalfSizePanelWithLabelInDifferentColor().createAndShowGui()); 
    } 

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

     contentPane = frame.getContentPane(); 
     pane = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return dim; 
      } 
     }; 

     pane2 = new JPanel(); 

     pane.setOpaque(false); 
     pane2.setOpaque(false); 

     pane.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     pane2.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 

     label = new JLabel("Hello World!"); 
     label.setBackground(Color.GREEN); 
     label.setOpaque(true); 

     contentPane.setLayout(new GridLayout(2, 1)); 

     pane.add(label); 

     contentPane.add(pane); 
     contentPane.add(pane2); 

     contentPane.setBackground(Color.WHITE); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

而且你的输出会是这样的:

enter image description here

注意,我加了一些彩色的边框显示,其中一个窗格中开始和结束并在另一开始和结束