关于setOpaque()方法对窗口的设置(转)


2011-06-18 13:55:50|  分类: 高级特性|举报|字号 订阅

有时候为了使JTable配合软件风格配置不同的颜色,当table的有表头以及添加了JScrollPane有ScollBar的时候会出现有个右上角有个区域的颜色是和底色是一样的,如下图1:
                        
                                                               图一
        为了使得那个灰色区域和table header 的颜色一致,一时居然不知道如何是好,赶快查jdk的API文档发现这个图二:
                       
                                             图二
知道了这个corner component就好办了,那就添加如下:
 

 


jScrollPane1.getCorner(JScrollPane.UPPER_RIGHT_CORNER).setBackground(Color.red),

却又发现jScrollPane1.getCorner(JScrollPane.UPPER_RIGHT_CORNER)为NULL,原来要给他添加一个corner component,
那就再添加如下代码:


        JLabel jb = new JLabel();    
        jb.setBackground(Color.black);
        jScrollPane1.setCorner(JScrollPane.UPPER_RIGHT_CORNER, jb);

但是通过测试发现那个corner的颜色依然没有灰色,郁闷!!查找资料得将lable.setOpaque(true)
关于此方法的解释如下:
如果为 true,则该组件绘制其边界内的所有像素。否则该组件可能不绘制其某些或所有像素,从而允许其下面的像素透视出来。

对于 
JComponent
而言,此属性的默认值是 false。但是对于大多数标准的 
JComponent
子类(如 
JButton
和 
JTree
),此属性的默认值是和外观相关的。
 

这样就效果如图三:
                      
                                              图三
不过当时不知道这个setOpaque(true),而是用了另外一个比较笨的方法,如:
 


        JLabel jb = new JLabel();    
        //jb.setOpaque(true);
        jb.setBackground(Color.black);
        jb.setBorder(BorderFactory.createLineBorder(Color.red, 20));
        jScrollPane1.setCorner(JScrollPane.UPPER_RIGHT_CORNER, jb);


测试的代码如:
 


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class KJTable extends JFrame {
    private JTable table;
    private KJTableCellRenderer renderer = new KJTableCellRenderer();
    private BorderLayout borderLayout = new BorderLayout();
    private JScrollPane jScrollPane1 = new JScrollPane();
    public KJTable() {
        this.setLayout(borderLayout);
        table = new JTable();
        table.setRowHeight(20);
        Object rows[][] = {
                 { "王明", "中国", 44 },
                 { "姚明", "中国", 25 },
                 { "赵子龙", "西蜀", 1234 },
                 { "曹操", "北魏", 2112 },
                 { "Bill Gates", "美国", 45 },
                 { "Mike", "英国", 33 },
                 { "王明", "中国", 44 },
                 { "姚明", "中国", 25 },
                 { "赵子龙", "西蜀", 1234 },
                 { "曹操", "北魏", 2112 },
                 { "Bill Gates", "美国", 45 },
                 { "Mike", "英国", 33 }};
        String columns[] =  { "姓名", "国籍", "年龄" };
        TableModel model = new DefaultTableModel(rows, columns);
        JTable table = new JTable(model);    
        table.setModel(model);
        table.getTableHeader().setDefaultRenderer(renderer);
        table.setDefaultRenderer(Object.class, renderer);
        jScrollPane1.getViewport().add(table);
        getContentPane().add(jScrollPane1, BorderLayout.CENTER);        
        JLabel jb = new JLabel();    
        //jb.setOpaque(true);
        jb.setBackground(Color.black);
        jb.setBorder(BorderFactory.createLineBorder(Color.red, 20));
        jScrollPane1.setCorner(JScrollPane.UPPER_RIGHT_CORNER, jb);        
        this.setSize(300, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args)  {
        new KJTable();
    }    
    private class KJTableCellRenderer extends JLabel implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value,
                            boolean isSelected, boolean hasFocus, int row, int col)  {            
            if(row<0) {
                setHorizontalAlignment(SwingConstants.CENTER);
                setBackground(new Color(45,145,180));
                setForeground(Color.white);
            }    
            else  {
                setHorizontalAlignment(SwingConstants.LEFT);
                if(row %2 == 0) {
                    setBackground(new Color(255,255,205));
                    setForeground(Color.blue);
                }

                else {
                    setBackground(new Color(255,220,150));
                    setForeground(Color.red);
                }            
            }        
            setText(value.toString());
            setOpaque(true);//
            return this;
        }    
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以通过设置JPanel的背景图来实现JFrame窗口的背景图缩放。具体步骤如下: 1. 创建一个JPanel对象,设置其为透明,并设置其布局方式为null; 2. 创建一个Image对象,将要作为背景图的图片加载进来; 3. 重写JPanel的paintComponent方法,在其中使用Graphics的drawImage方法将图片绘制到JPanel上; 4. 将JPanel添加到JFrame中。 以下是示例代码: ```java import java.awt.*; import javax.swing.*; public class BackgroundPanel extends JPanel { private Image backgroundImage; public BackgroundPanel(Image backgroundImage) { this.backgroundImage = backgroundImage; setOpaque(false); setLayout(null); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (backgroundImage != null) { int width = getWidth(); int height = getHeight(); g.drawImage(backgroundImage, 0, 0, width, height, null); } } } public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); frame.setLocationRelativeTo(null); Image backgroundImage = new ImageIcon("background.jpg").getImage(); BackgroundPanel backgroundPanel = new BackgroundPanel(backgroundImage); frame.add(backgroundPanel); frame.setVisible(true); } } ``` 在上述代码中,我们创建了一个BackgroundPanel类,用于绘制JFrame的背景图。在paintComponent方法中,我们使用Graphics的drawImage方法将图片绘制到JPanel上,并且设置了图片的宽高等于JPanel的宽高,实现了背景图的缩放功能。最后,将BackgroundPanel添加到JFrame中即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值